/// Abyssal Chord - MoonBit Single Player Demo

fn main {
  println("========================================")
  println("  ABYSSAL CHORD - MoonBit Edition")
  println("  Zhong Lv vs Howling Drifter")
  println("========================================")
  println("")

  let char = @lib.zhong_lv()
  let enemy = @lib.howling_drifter()
  println("Tuner: " + char.name + " HP:" + char.max_hp.to_string())
  println("Enemy: " + enemy.name + " HP:" + enemy.hp_1p.to_string())
  println("")

  let mut b = @lib.init_battle(char, enemy)
  println("Initial hand:")
  let hand = @lib.get_hand(b)
  let mut hi = 0
  while hi < hand.length() {
    let c = hand[hi]
    println("  [" + (hi + 1).to_string() + "] " + c.name + " cost:" + c.cost.to_string())
    hi = hi + 1
  }
  println("")

  let mut turn = 0
  while turn < 50 {
    turn = turn + 1

    if @lib.phase_is_victory(b) {
      println("========================================")
      println("  VICTORY! Enemy defeated!")
      println("  Turns: " + b.turn_number.to_string())
      println("  HP left: " + b.player.hp.to_string())
      println("  Pollution: " + b.pollution.to_string())
      println("========================================")
      break
    }

    if @lib.phase_is_defeat(b) {
      println("========================================")
      println("  DEFEAT...")
      if b.player.hp <= 0 { println("  HP depleted") }
      else { println("  Pollution maxed") }
      println("========================================")
      break
    }

    if @lib.phase_is_player_turn(b) {
      let cards = @lib.get_playable_cards(b)
      if cards.length() > 0 {
        let target_id = cards[0].id
        let hand2 = @lib.get_hand(b)
        let mut idx = 0
        let mut ki = 0
        while ki < hand2.length() {
          if hand2[ki].id == target_id { idx = ki; break }
          ki = ki + 1
        }

        println("--- Turn " + b.turn_number.to_string() + " ---")
        println("HP:" + b.player.hp.to_string() + "/" + b.player.max_hp.to_string() +
              " Armor:" + b.player.armor.to_string() + " AP:" + b.player.ap.to_string())
        println("Enemy HP:" + b.enemy.hp.to_string() + "/" + b.enemy.max_hp.to_string() +
              " Armor:" + b.enemy.armor.to_string())
        println("Pollution:" + b.pollution.to_string() + "/100")

        let mut sj = 0
        while sj < b.enemy.debuffs.length() {
          if @lib.is_sonic_boom(b.enemy.debuffs[sj]) {
            println("Sonic Boom: " + b.enemy.debuffs[sj].stacks.to_string() + " stacks")
          }
          sj = sj + 1
        }

        b = @lib.play_card(b, idx)
        println("  -> " + hand2[idx].name)

        b = @lib.settle_sonic_boom(b)
        if !@lib.phase_is_victory(b) { b = @lib.end_player_turn(b) }
      } else {
        println("--- Turn " + b.turn_number.to_string() + " (skip) ---")
        b = @lib.settle_sonic_boom(b)
        if !@lib.phase_is_victory(b) { b = @lib.end_player_turn(b) }
      }
    } else if @lib.phase_is_enemy_turn(b) {
      b = @lib.execute_enemy_turn(b)
    }
  }

  if turn >= 50 { println("Battle exceeded 50 turn limit") }
}