<!DOCTYPE html>
<html lang="en" dir="ltr">
    <head>
        <meta charset="utf-8">
        <title>MT Request: draw over the image</title>
        <style media="screen">
            #sample, svg{
            	position:absolute;
            	top: 0;
            	left: 0;
            	bottom: 0;
            	right:0;
            	width:100%;
            	height:100%;
            }

            path {
                fill: none;
                stroke: red;
                stroke-width: 2px;
            }
            
            body.submitted path{
            	stroke:darkgray;
            }
            
            body.submitted .buttons{
            	display:none;
            }

            #wrapper {
            	height: 600px;
            	width: 600px;
            	position: relative;
            
            }
        </style>
    </head>
    <body>
        <div id='interface'>
        	<div id='wrapper'>
            <img src="/latest.svg" id='sample'>
            <svg id="canvas">
                <path d="" id="stroke" />
            </svg>
            </div>
            <div class='buttons'>
	            <button id='submit'>Submit</button>
	            <button id='reset'>Reset</button>
            </div>
            <div id='message'></div>
        </div>
        <script type="text/javascript">
            let url = window.location.origin.replace('http', 'ws') +'/ws';
            let svgEl = document.getElementById("canvas");
            let strokeEl = document.getElementById('stroke');
            let submitEl = document.getElementById('submit');
            let resetEl = document.getElementById('reset');
            let messageEl = document.getElementById('message');
            
            let strokes = [];
            let isDrawing = false;
            let draw = function(e) {
                let pos = svgEl.getBoundingClientRect()
                let x = e.x - pos['left'];
                let y = e.y - pos['top'];
                strokes.push([x, y, 0]);

                let d = strokes2D(strokes);
                console.log(d);
                strokeEl.setAttribute('d', d);

                socket.send(JSON.stringify({
                    'action': 'move',
                    'direction': [x, y]
                }));
            };
            let penup = function(e) {
                if(!isDrawing) {
                    return;
                }
                isDrawing = false;

                document.body.removeEventListener('mousemove', draw);
                
                let pos = svgEl.getBoundingClientRect()
                let x = e.x - pos['left'];
                let y = e.y - pos['top'];

                if(strokes.length > 0){
                    // mark point as last of stroke
                    strokes[strokes.length - 1][2] = 1;
                }
                socket.send(JSON.stringify({
                    'action': 'up',
                    'direction': [x, y]
                }));

            };
            let strokes2D = function(strokes) {
                // strokes to a d attribute for a path
                let d = "";
                let last_stroke = undefined;
                let cmd = "";
                for (let stroke of strokes) {
                    if(!last_stroke) {
                        d += `M${stroke[0]},${stroke[1]} `;
                        cmd = 'M';
                    } else {
                        if (last_stroke[2] == 1)  {
                            d += " m";
                            cmd = 'm';
                        } else if (cmd != 'l') {
                            d+=' l ';
                            cmd = 'l';
                        }
                        let rel_stroke = [stroke[0] - last_stroke[0], stroke[1] - last_stroke[1]];
                        d += `${rel_stroke[0]},${rel_stroke[1]} `;
                    }
                    last_stroke = stroke;

                }
                return d;
            }
            
            let startDrawing = function(e){
                isDrawing = true;
                // start drawing
                document.body.addEventListener('mousemove', draw);

            };
            let reset = function() {
            	strokes = [];
                strokeEl.setAttribute('d', "");
                socket.send(JSON.stringify({
                    'action': 'reset',
                }));
            }


            let socket = new WebSocket(url);
            
            socket.addEventListener('message', function(e){
            	let msg = JSON.parse(e.data);
            	console.log('receive', msg);
            	if(msg['action'] == 'submitted') {
            		document.body.classList.add('submitted');
            		messageEl.innerHTML = msg['msg'];
            		svgEl.removeEventListener('mousedown', startDrawing);
            	}
            });
            
            document.body.addEventListener('mouseup', penup);
            svgEl.addEventListener('mousedown', startDrawing);
            resetEl.addEventListener('click', reset);
            submitEl.addEventListener('click', function(e){
            	if(!strokes.length){
            		alert('please draw before submitting');
            		return;
            	}
            	
            	socket.send(JSON.stringify({
                    'action': 'submit'
                }));
            });
        </script>
    </body>
</html>