import { expect } from "@esm-bundle/chai";
import * as THREE from "three";
import { GameLoop } from "../../../src/core/GameLoop.js";
import {
  createGameLoopSetup,
  cleanupGameLoop,
  createRunData,
  createMockGameStateManagerForCombat,
  setupCombatUnits,
  cleanupTurnSystem,
} from "./helpers.js";

describe("Core: GameLoop - Combat Highlights", function () {
  this.timeout(30000);

  let gameLoop;
  let container;
  let mockGameStateManager;
  let playerUnit;
  let enemyUnit;

  beforeEach(async () => {
    const setup = createGameLoopSetup();
    gameLoop = setup.gameLoop;
    container = setup.container;

    // Clean up any existing state first
    if (gameLoop.turnSystemAbortController) {
      gameLoop.turnSystemAbortController.abort();
    }
    gameLoop.stop();

    if (
      gameLoop.turnSystem &&
      typeof gameLoop.turnSystem.reset === "function"
    ) {
      gameLoop.turnSystem.reset();
    }

    gameLoop.init(container);
    mockGameStateManager = createMockGameStateManagerForCombat();
    gameLoop.gameStateManager = mockGameStateManager;

    const runData = createRunData({
      squad: [{ id: "u1", classId: "CLASS_VANGUARD" }],
    });
    await gameLoop.startLevel(runData, { startAnimation: false });

    const units = setupCombatUnits(gameLoop);
    playerUnit = units.playerUnit;
    enemyUnit = units.enemyUnit;
  });

  afterEach(async () => {
    // Clear highlights first to free Three.js resources
    gameLoop.clearMovementHighlights();
    gameLoop.clearSpawnZoneHighlights();

    cleanupTurnSystem(gameLoop);
    cleanupGameLoop(gameLoop, container);

    // Small delay to allow cleanup to complete
    await new Promise((resolve) => setTimeout(resolve, 10));
  });

  it("CoA 6: should not show movement highlights for enemy units", () => {
    mockGameStateManager.getCombatState.returns({
      activeUnit: {
        id: enemyUnit.id,
        name: enemyUnit.name,
      },
      turnQueue: [],
    });

    gameLoop.updateMovementHighlights(enemyUnit);
    expect(gameLoop.movementHighlights.size).to.equal(0);
  });

  it("CoA 7: should clear movement highlights when not in combat", () => {
    mockGameStateManager.getCombatState.returns({
      activeUnit: {
        id: playerUnit.id,
        name: playerUnit.name,
      },
      turnQueue: [],
    });
    gameLoop.updateMovementHighlights(playerUnit);
    expect(gameLoop.movementHighlights.size).to.be.greaterThan(0);

    mockGameStateManager.currentState = "STATE_DEPLOYMENT";
    gameLoop.updateMovementHighlights(playerUnit);
    expect(gameLoop.movementHighlights.size).to.equal(0);
  });
});
