/**
 * Desenha os eixos X e Y com marcações e labels em uma cena Phaser.
 * Pode ser reutilizada em qualquer jogo Phaser com tela 800x600.
 *
 * @param {Phaser.Scene} scene - Instância da cena Phaser.
 * @param {Object} axis - Objeto com propriedades booleanas x e y (ex: { x: true, y: true }).
 * @param {number} larguraTela - Largura da tela (ex: 800).
 * @param {number} alturaTela - Altura da tela (ex: 600).
 */
export function drawAxes(scene, axis, larguraTela = 800, alturaTela = 600) {
  const majorTicks = [20, 40, 60, 80];
  const labeledTicks = [20, 40, 60, 80];
  const midTicks = [10, 30, 50, 70, 90];
  const fontStyle = { font: "12px Arial", color: "#333" };
  const g = scene.add.graphics();

  const bottomY = alturaTela - 8;
  const leftX = 0;

  const tickLenMajorX = 16;
  const tickLenMidX = Math.max(2, Math.floor(tickLenMajorX / 2));
  const tickLenMajorY = tickLenMajorX * 2;
  const tickLenMidY = Math.max(2, Math.floor(tickLenMajorY / 2));

  const xLabelOffset = 6;
  const yLabelYOffset = -6;

  const clampX = (x) => Math.max(0, Math.min(larguraTela - 1, Math.round(x)));
  const clampY = (y) => Math.max(0, Math.min(alturaTela - 1, Math.round(y)));

  if (axis.x) {
    majorTicks.forEach((v) => {
      const x = clampX((v / 100) * (larguraTela - 1));
      g.fillStyle(0x808080, 1);
      g.fillRect(
        x - 1,
        Math.round(bottomY - tickLenMajorX / 2),
        2,
        tickLenMajorX,
      );
    });
    midTicks.forEach((v) => {
      const x = clampX((v / 100) * (larguraTela - 1));
      g.fillStyle(0x808080, 1);
      g.fillRect(x - 1, Math.round(bottomY - tickLenMidX / 2), 2, tickLenMidX);
    });
    labeledTicks.forEach((v) => {
      const x = clampX((v / 100) * (larguraTela - 1));
      if (v === 100) {
        scene.add
          .text(x - xLabelOffset, bottomY + 2, v.toString(), fontStyle)
          .setOrigin(1, 1);
      } else {
        scene.add
          .text(x + xLabelOffset, bottomY + 2, v.toString(), fontStyle)
          .setOrigin(0, 1);
      }
    });
  }

  if (axis.y) {
    majorTicks.forEach((v) => {
      const y = clampY(alturaTela - (v / 100) * (alturaTela - 1));
      g.fillStyle(0x808080, 1);
      g.fillRect(
        Math.round(leftX - tickLenMajorY / 2),
        y - 1,
        tickLenMajorY,
        2,
      );
    });
    midTicks.forEach((v) => {
      const y = clampY(alturaTela - (v / 100) * (alturaTela - 1));
      g.fillStyle(0x808080, 1);
      g.fillRect(Math.round(leftX - tickLenMidY / 2), y - 1, tickLenMidY, 2);
    });
    labeledTicks.forEach((v) => {
      const y = clampY(alturaTela - (v / 100) * (alturaTela - 1));
      if (leftX <= 6) {
        scene.add
          .text(leftX + 2, y + yLabelYOffset, v.toString(), fontStyle)
          .setOrigin(0, 1);
      } else {
        scene.add
          .text(leftX - 2, y + yLabelYOffset, v.toString(), fontStyle)
          .setOrigin(1, 1);
      }
    });
  }
}
