import {
  INITIAL_HC,
  INITIAL_KPI,
} from './constants'

type GameState = 'idle' | 'playing' | 'paused' | 'victory' | 'defeat'

/**
 * 游戏状态管理器（单例）
 * 负责管理 HC（人才储备）、KPI、波次状态，并通过回调事件通知 Scene
 */
export class GameManager {
  private static instance: GameManager

  public hc: number = INITIAL_HC
  public kpi: number = INITIAL_KPI
  public currentWave: number = 0
  public gameState: GameState = 'idle'

  // 事件回调（Scene 通过这些 hook 更新 HUD）
  public onHCChange: ((hc: number) => void)[] = []
  public onKPIChange: ((kpi: number) => void)[] = []
  public onGameOver: (() => void)[] = []
  public onVictory: (() => void)[] = []

  private constructor() {}

  static getInstance(): GameManager {
    if (!GameManager.instance) {
      GameManager.instance = new GameManager()
    }
    return GameManager.instance
  }

  /** 重置游戏状态（新局开始时调用） */
  reset(): void {
    this.hc = INITIAL_HC
    this.kpi = INITIAL_KPI
    this.currentWave = 0
    this.gameState = 'idle'
    this.onHCChange = []
    this.onKPIChange = []
    this.onGameOver = []
    this.onVictory = []
  }

  /**
   * 扣除 HC，余额不足时返回 false
   * @param amount 扣除数量
   */
  spendHC(amount: number): boolean {
    if (this.hc < amount) return false
    this.hc -= amount
    this.onHCChange.forEach(cb => cb(this.hc))
    return true
  }

  /**
   * 增加 HC
   * @param amount 增加数量
   */
  addHC(amount: number): void {
    this.hc += amount
    this.onHCChange.forEach(cb => cb(this.hc))
  }

  /**
   * 减少 KPI，归零时触发 GameOver
   * @param amount 减少数量
   */
  reduceKPI(amount: number): void {
    this.kpi = Math.max(0, this.kpi - amount)
    this.onKPIChange.forEach(cb => cb(this.kpi))
    if (this.kpi <= 0 && this.gameState === 'playing') {
      this.gameState = 'defeat'
      this.onGameOver.forEach(cb => cb())
    }
  }

  /**
   * 增加 KPI（不超过 100）
   * @param amount 增加数量
   */
  addKPI(amount: number): void {
    this.kpi = Math.min(100, this.kpi + amount)
    this.onKPIChange.forEach(cb => cb(this.kpi))
  }

  /** 触发胜利 */
  triggerVictory(): void {
    if (this.gameState === 'playing') {
      this.gameState = 'victory'
      this.onVictory.forEach(cb => cb())
    }
  }
}
