class Snake {
    bodyParts = []
    direction = 'north'
    alive = true
 
    constructor(startX, startY) {
        this.bodyParts.push([startX, startY])
    }
 
    /*
    * Udela jeden krok hada
    * */
    step() {
        if (!this.alive) {
            return false
        }
        const headPosition = this.bodyParts[0]
        const newPosition = [headPosition[0], headPosition[1]]
        if (direction == 'north') {
            newPosition[1]--
        } else if (direction == 'south') {
            newPosition[1]++
        } else if (direction == 'west') {
            newPosition[0]--
        } else if (direction == 'east') {
            newPosition[0]++
        } else {
            throw "Unknown snake direction"
        }
        if (this.collides(newPosition)) {
            // had narazil
            this.alive = false
            return
        }
 
        let snakeHasEaten = false
        // todo: pokud je na newPosition jablicko, rekni ze se had nakrmil
 
        // pridani noveho prvku zleva = vytvoreni "nove" hlavy hada
        this.bodyParts.unshift(newPosition)
        if (!snakeHasEaten) {
            // odebrani posledniho prvku tela ("posun" ocasu)
            this.bodyParts.pop()
        }
    }
 
    setDirection(direction) {
        if (['north', 'east', 'south', 'west'].includes(direction)) {
            this.direction = direction
        } else {
            throw "Unknown direction in setDirection"
        }
    }
 
    collides(position) {
        for (let i = 0; i < this.bodyParts.length; i++) {
            if (position[0] == this.bodyParts[i][0] && position[1] == this.bodyParts[i][1]) {
                return true
            }
        }
        // jinak
        return false
    }
 
    draw(paintFunction){
        for(let i = 0; i < this.bodyParts.length; i++){
            paintFunction(this.bodyParts[i][0], this.bodyParts[i][1], 'green')
        }
    }
}
class Game {
    width = 0
    height = 0
    htmlParent = null
    gameObjects = []
 
 
    constructor(width, height, htmlParent) {
        this.width = width
        this.height = height
        this.htmlParent = htmlParent
 
        for (let y = 0; y < this.height; y++) {
            let row = document.createElement('tr')
            for (let x = 0; x < this.height; x++) {
                let cell = document.createElement('td')
                cell.id = `cell-${x}-${y}`
                cell.class = 'cell'
                row.appendChild(cell)
            }
            this.htmlParent.appendChild(row)
        }
 
        // todo: setInterval na gameTick
    }
 
    /*
     Funkce kterou podstrcime hadovi, aby se mohl vykreslit
     */
    drawElement(x, y, color) {
        const cell = document.getElementById(`cell-${x}-${y}`)
        cell.style.background = color
    }
 
    gameTick() {
        // Smaz vsechno
        for (let y = 0; y < this.height; y++) {
            for (let x = 0; x < this.height; x++) {
                this.drawElement(x, y, 'white')
            }
        }
        // Vykresli vsechny objekty znovu
        for (const object of this.gameObjects) {
            object.draw(this.drawElement)
        }
    }
}