"use strict";

const upButton = document.getElementById("up");
const downButton = document.getElementById("down");
const leftButton = document.getElementById("left");
const rightButton = document.getElementById("right");
const startButton = document.getElementById("start");
const grid = document.createElement("div");
grid.id = "grid";
document.querySelector(".game").appendChild(grid);

let snake = [{ x: 5, y: 5 }];
let apple = { x: 8, y: 5 };
let direction = { x: 0, y: 0 };
let gameInterval = null;
let isGameRunning = false;
const gridSize = 10;

function initGame() {
  grid.style.display = "grid";
  grid.style.gridTemplateColumns = `repeat(${gridSize}, 1fr)`;
  grid.style.gridTemplateRows = `repeat(${gridSize}, 1fr)`;
  grid.style.width = "350px";
  grid.style.height = "350px";
  document.getElementById("title").style.display = "none";
  document.getElementById("description").style.display = "none";

  isGameRunning = true;
  snake = [{ x: 5, y: 5 }];
  apple = spawnApple();
  direction = { x: 0, y: 0 };

  clearInterval(gameInterval);
  gameInterval = setInterval(gameLoop, 200);
  render();
}

function spawnApple() {
  let newApple;
  do {
    newApple = {
      x: Math.floor(Math.random() * gridSize),
      y: Math.floor(Math.random() * gridSize),
    };
  } while (
    snake.some(
      (segment) => segment.x === newApple.x && segment.y === newApple.y
    )
  );
  return newApple;
}

function updateSnake() {
  const newHead = {
    x: snake[0].x + direction.x,
    y: snake[0].y + direction.y,
  };

  if (newHead.x < 0) newHead.x = gridSize - 1;
  if (newHead.y < 0) newHead.y = gridSize - 1;
  if (newHead.x >= gridSize) newHead.x = 0;
  if (newHead.y >= gridSize) newHead.y = 0;

  if (
    snake.some((segment) => segment.x === newHead.x && segment.y === newHead.y)
  ) {
    gameOver();
    return;
  }

  snake.unshift(newHead);

  if (newHead.x === apple.x && newHead.y === apple.y) {
    apple = spawnApple();
  } else {
    snake.pop();
  }
}

function render() {
  grid.innerHTML = "";

  for (let y = 0; y < gridSize; y++) {
    for (let x = 0; x < gridSize; x++) {
      const cell = document.createElement("div");
      cell.classList.add("cell");

      if ((x + y) % 2 === 0) {
        cell.classList.add("light-green");
      } else {
        cell.classList.add("dark-green");
      }

      if (snake.some((segment) => segment.x === x && segment.y === y)) {
        cell.classList.add("snake");
      }

      if (apple.x === x && apple.y === y) {
        cell.classList.add("apple");
      }

      grid.appendChild(cell);
    }
  }
}

function gameLoop() {
  if (!isGameRunning) return;
  updateSnake();
  render();
}

function gameOver() {
  alert("Game Over!");
  clearInterval(gameInterval);
  isGameRunning = false;
}

function handleDirectionInput(key) {
  switch (key) {
    case "ArrowUp":
    case "w":
      if (direction.y === 0) direction = { x: 0, y: -1 };
      break;
    case "ArrowDown":
    case "s":
      if (direction.y === 0) direction = { x: 0, y: 1 };
      break;
    case "ArrowLeft":
    case "a":
      if (direction.x === 0) direction = { x: -1, y: 0 };
      break;
    case "ArrowRight":
    case "d":
      if (direction.x === 0) direction = { x: 1, y: 0 };
      break;
  }
}

upButton.addEventListener("click", () => handleDirectionInput("ArrowUp"));
downButton.addEventListener("click", () => handleDirectionInput("ArrowDown"));
leftButton.addEventListener("click", () => handleDirectionInput("ArrowLeft"));
rightButton.addEventListener("click", () => handleDirectionInput("ArrowRight"));
startButton.addEventListener("click", () => {
  if (!isGameRunning) initGame();
});

document.addEventListener("keydown", (event) => {
  handleDirectionInput(event.key);
});