let fieldSize = 20;

let snakeField:HTMLElement = document.getElementById("snakeField");
let snake:number[][] = [[10, 10], [10, 11], [10, 12]];
let snakedir:number = 2;
let target:number[] = []
let score = 0;

function getRandomInt(max:number) {
    return Math.floor(Math.random() * Math.floor(max)) + 1;
}

function drawField(){
    let fieldHTML:string = "";
    for(let i:number = 1; i <= fieldSize; i++){
        for(let x:number = 1; x <= fieldSize; x++){
            let elementClass:string = "";
            for(let y:number = 0; y<snake.length; y++){
                let currentSnake = snake[y];
                if(currentSnake[0] == i && currentSnake[1] == x){
                    if(y == snake.length - 1)
                        elementClass += " snake-head";
                    else
                        elementClass += " snake-body";
                }
            }

            if(target[0] == i && target[1] == x)
                elementClass += " target";

            fieldHTML += `<span id="field-${i}-${x}" class="${elementClass}"></span>`;
        }
        if(i < fieldSize) {
            fieldHTML += "<br>"
        }
    }
    snakeField.innerHTML = fieldHTML;
}

function moveSnake(){
    let head:number[] = snake[snake.length - 1].slice(0);
    switch (snakedir){
        case 0:
            head[0]++;
            break;
        case 1:
            head[0]--;
            break;
        case 2:
            head[1]++;
            break;
        case 3:
            head[1]--;
            break;
    }
    if (!(snake.length - 3 < score))
        snake.shift();
    snake.push(head);
}

function detectEnd(){
    let gameFinished:boolean = false;
    for(let i:number = 0; i < snake.length; i++){
        let snake1:number[] = snake[i];
        for (let x:number = i + 1; x < snake.length; x++){
            let snake2:number[] = snake[x]
            if(snake1[0] == snake2[0] && snake1[1] == snake2[1])
                gameFinished = true
        }
        if(snake1[0] < 0 || snake1[0] > fieldSize || snake1[1] < 0 || snake1[1] > fieldSize)
            gameFinished = true
    }

    if(gameFinished){
        clearInterval(mainLoop);
        alert("Game Over, your score: " + score);
    }
}
let mainLoop = window.setInterval(function(){
    for(let y:number = 0; y<snake.length; y++){
        let currentSnake = snake[y];
        if(currentSnake[0] == target[0] && currentSnake[1] == target[1]){
            score++;
            target = [getRandomInt(fieldSize), getRandomInt(fieldSize)];
        }
    }
    moveSnake();
    detectEnd()
    drawField();
}, 1000);

//keypress handler
document.addEventListener('keydown', function(event) {
    const key:string = event.key;
    switch (key){
        case "ArrowRight":
            snakedir = 2
            break;
        case "ArrowLeft":
            snakedir = 3;
            break;
        case "ArrowUp":
            snakedir = 1;
            break;
        case "ArrowDown":
            snakedir = 0
    }
});

target = [getRandomInt(fieldSize), getRandomInt(fieldSize)];
drawField();