///|
/// 生存模式 - 无尽波次挑战

// ─── 生存模式状态 ───
pub struct SurvivalState {
  battle : BattleState
  wave : Int
  score : Int
  enemies_defeated : Int
  is_active : Bool
  difficulty_multiplier : Double
}

// ─── 创建生存模式 ───
pub fn init_survival(char : Character) -> SurvivalState {
  let first_enemy = howling_drifter()
  let battle = init_battle(char, first_enemy)
  {
    battle: battle,
    wave: 1,
    score: 0,
    enemies_defeated: 0,
    is_active: true,
    difficulty_multiplier: 1.0,
  }
}

// ─── 生成下一波敌人 ───
pub fn spawn_next_wave(state : SurvivalState) -> SurvivalState {
  let wave = state.wave + 1
  let mult = 1.0 + wave.to_double() * 0.2 // 每波+20%难度
  // 选择敌人
  let enemy = pick_enemy_for_wave(wave)
  // 按难度倍率缩放HP
  let scaled_hp = (enemy.hp_1p.to_double() * mult).to_int()
  let scaled_enemy = { ..enemy, hp_1p: scaled_hp }
  let battle = init_battle(state.battle.player_char, scaled_enemy)
  // 保留玩家状态(HP、护甲、能力)
  let continued_battle = {
    ..battle,
    player: { ..state.battle.player,
      ap: state.battle.player.max_ap,
      cards_played_this_turn: 0,
      has_taken_self_damage: false,
      next_attack_bonus: 0,
      harmonic_active: false,
      free_second_attack: false,
    },
  }
  {
    battle: continued_battle,
    wave: wave,
    score: state.score + (state.enemies_defeated * 10),
    enemies_defeated: 0,
    is_active: true,
    difficulty_multiplier: mult,
  }
}

// ─── 处理敌人击杀 ───
pub fn on_enemy_defeated(state : SurvivalState) -> SurvivalState {
  let score_gain = (100.0 * state.difficulty_multiplier).to_int()
  {
    ..state,
    score: state.score + score_gain,
    enemies_defeated: state.enemies_defeated + 1,
  }
}

// ─── 波次间恢复 ───
pub fn intermission_heal(state : SurvivalState) -> SurvivalState {
  let heal = (state.battle.player.max_hp.to_double() * 0.25).to_int()
  let nh = if state.battle.player.hp + heal > state.battle.player.max_hp {
    state.battle.player.max_hp
  } else {
    state.battle.player.hp + heal
  }
  let new_pollution = if state.battle.pollution - 15 < 0 { 0 } else { state.battle.pollution - 15 }
  {
    ..state,
    battle: { ..state.battle,
      player: { ..state.battle.player, hp: nh },
      pollution: new_pollution,
    },
  }
}

// ─── 根据波次选择敌人 ───
fn pick_enemy_for_wave(wave : Int) -> Enemy {
  if wave <= 3 {
    pick_random_normal_enemy()
  } else if wave <= 6 {
    if wave % 3 == 0 { mutos() } else { pick_random_normal_enemy() }
  } else if wave % 5 == 0 {
    // Boss wave
    if wave % 10 == 0 { harmonic_construct() } else { mutos() }
  } else {
    pick_random_normal_enemy()
  }
}

// ─── 随机普通敌人 ───
fn pick_random_normal_enemy() -> Enemy {
  let enemies = [ howling_drifter(), silent_mimic(), echo_remnant(), resonance_crystal(), abyssal_shrieker() ]
  let idx = 2 // 简化:用固定种子
  enemies[idx]
}

// ─── 生存模式游戏结束 ───
pub fn is_survival_over(state : SurvivalState) -> Bool {
  !state.is_active || is_pollution_max(state.battle.pollution) || state.battle.player.hp <= 0
}

// ─── 获取生存模式摘要 ───
pub fn get_survival_summary(state : SurvivalState) -> String {
  "Wave " + state.wave.to_string() +
  " | Score: " + state.score.to_string() +
  " | Kills: " + state.enemies_defeated.to_string() +
  " | Mult: " + state.difficulty_multiplier.to_string()
}

// ─── 生存模式高分榜 ───
pub struct HighScore {
  name : String
  score : Int
  wave : Int
  date : String
}

pub fn default_high_scores() -> Array[HighScore] {
  [
    { name: "钟律(默认)", score: 0, wave: 0, date: "---" },
    { name: "钟律(默认)", score: 0, wave: 0, date: "---" },
    { name: "钟律(默认)", score: 0, wave: 0, date: "---" },
  ]
}

pub fn update_high_scores(scores : Array[HighScore], new_score : HighScore) -> Array[HighScore] {
  let result : Array[HighScore] = []
  let mut inserted = false
  let mut i = 0
  while i < scores.length() {
    if !inserted && new_score.score > scores[i].score {
      result.push(new_score)
      inserted = true
    }
    result.push(scores[i])
    i = i + 1
  }
  if !inserted { result.push(new_score) }
  // 只保留前3
  let top3 : Array[HighScore] = []
  let mut j = 0
  while j < 3 && j < result.length() {
    top3.push(result[j])
    j = j + 1
  }
  top3
}