<!doctype html>
<html lang="en">

<head>
    <title>Stacker</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <!-- <link rel="stylesheet" type="text/css" href="/css/styles.css"> -->
</head>

<body style="padding:0; margin:0; overflow:hidden;">
    <canvas id="canvas"></canvas>
    <script src="/highscore.js"></script>
    <script>
        var gameInterval, canvas, ctx;
        var score, t, isGameOver, mouseX, mouseY, scaleX, scaleY, selected, stack, next, v, perfect;
        var username = undefined;
        let VELOCITY = 3;

        function init() {
            next = { left: 0, width: 200 };
            v = VELOCITY;
            stack = [{ left: 100, width: 200 }];

            score = 0;
            isGameOver = false;
            mouseX = 0;
            mouseY = 0;
            t = 0;
            selected = -1;
            perfect = 0;
            gameInterval = setInterval(game, 1000 / 60);
        }

        window.onload = function () {
            canvas = document.getElementById("canvas");
            ctx = canvas.getContext("2d");

            document.addEventListener("keydown", keyPush);
            document.addEventListener("mousedown", mousePush);

            window.addEventListener('resize', resizeCanvas, false);
            window.addEventListener('orientationchange', resizeCanvas, false);
            resizeCanvas();

            init();
        }

        function resizeCanvas() {
            canvas.width = window.innerWidth;
            canvas.height = window.innerHeight;
            scaleX = window.innerWidth / 400;
            scaleY = window.innerHeight / 600;

            if (scaleX / scaleY > 1.3) {
                scaleX = scaleY = 1;
            }
            ctx.scale(scaleX, scaleY);
        }
        function game() {
            update();
            draw();
        }
        function draw() {
            color("white");
            ctx.fillRect(0, 0, canvas.width, canvas.height);
            color("black");
            ctx.fillRect(0, 0, 400, 400);

            // Draw moving block
            if (stack.length % 2 == 0) {
                color("white");
            } else {
                color("red")
            }
            var y;
            if (stack.length < 10) {
                y = 380 - stack.length * 20;
            } else {
                y = 380 - 10 * 20;
            }
            ctx.fillRect(next.left, y, next.width, 20)


            // Draw stack
            var index = max(stack.length - 10, 0);
            stack.slice(-10).forEach((element, i) => {
                if (index % 2 == 0) {
                    color("white");
                } else {
                    color("red")
                }

                let y = 380 - i * 20
                ctx.fillRect(element.left, y, element.width, 20)
                index++;
            });

            // Draw "perfect" marker
            if (perfect > 0) {
                font(20);
                color("red");
                let last = stack[stack.length - 1]
                ctx.fillText("Perfect!", 170, 60);
                perfect--;
            }

            // Draw score
            font(20);
            color("red");
            ctx.fillText("Score: " + score, 170, 30);

            // Draw touch controls
            color("#ff9900");
            if (selected) {
                color("#cc9900")
            }
            ctx.beginPath();
            ctx.moveTo(200, 500);
            ctx.arc(200, 500, 100, 0, 2 * Math.PI);
            ctx.fill();
            selected = 0;

            if (isGameOver) {
                color("blue");
                font(32);
                ctx.fillText("Game over!", 160, 200);
                font(24);
                ctx.fillText("(press any key)", 160, 240)
            }
        }

        function update() {
            t++;
            next.left += v;
            if (next.left + next.width >= 400) {
                let diff = next.left + next.width - 400;
                next.left -= diff;
                v = -1 * VELOCITY;
            } else if (next.left <= 0) {
                let diff = 0 - next.left;
                next.left += diff;
                v = VELOCITY;
            }
            if (next.width <= 0) {
                gameOver();
            }
        }
        function max(a, b) {
            return a > b ? a : b;
        }
        function min(a, b) {
            return a < b ? a : b;
        }
        function keyPush(e) {
            if (isGameOver) {
                init();
                return;
            }
            if (e.keyCode == 32) {
                let last = stack[stack.length - 1];
                var left = max(next.left, last.left);
                let right = min(next.left + next.width, last.left + last.width);
                var width = right - left;

                if (stack[stack.length - 1].width - width < 6) {
                    width = stack[stack.length - 1].width
                    left = stack[stack.length - 1].left
                    perfect = 15;
                }

                if (width > 0) {
                    stack.push({ left: left, width: width })
                    score += 1;
                }

                if (v < 0) {
                    next = { left: 0, width: width }
                    v = VELOCITY
                } else {
                    next = { left: 400 - width, width: width }
                    v = -1 * VELOCITY
                }
            }
        }
        function mousePush(e) {
            mouseX = e.clientX / scaleX - 200;
            mouseY = e.clientY / scaleY - 500;
            if (Math.sqrt(mouseX * mouseX + mouseY * mouseY) > 100) {
                return;
            }
            selected = 1;
            keyPush({ keyCode: 32 })
        }
        function randomInt(max) {
            return Math.floor(Math.random() * max);
        }
        function font(size) {
            ctx.font = size + "px sans serif";
        }
        function color(c) {
            ctx.fillStyle = c;
        }
        function gameOver() {
            isGameOver = true;
            clearInterval(gameInterval);
            username = submitScore("stacker", score, username);
        }
    </script>
</body>

</html>