/// Runnable demo for the moonchess library.
///
/// Run with: moon run examples/demo

///|
fn main {
  let game = @lib.Chess::new()
  println("=== Start position ===")
  println(game.display())
  // Play the Scholar's mate.
  for san in ["e4", "e5", "Bc4", "Nc6", "Qh5", "Nf6", "Qxf7#"] {
    match game.move_by_san(san) {
      Some(m) => println("played \{m.san}")
      None => println("illegal move: \{san}")
    }
  }
  println("")
  println("=== After 4. Qxf7# ===")
  println(game.display())
  println("checkmate = \{game.is_checkmate()}")
  println("")
  println("=== PGN ===")
  println(game.pgn())
  println("=== perft ===")
  let start = @lib.Chess::new()
  println("perft(3) from start = \{start.perft(3)}")
  println("")
  println("=== engine ===")
  match @lib.Chess::from_fen("6k1/5ppp/8/8/8/8/5PPP/R5K1 w - - 0 1") {
    Some(position) => {
      let searcher = @lib.Searcher::new()
      let result = searcher.search(position, 3)
      match result.best {
        Some(m) =>
          println(
            "mate in one: \{m.san} (score \{result.score}, nodes \{result.nodes})",
          )
        None => println("no legal move")
      }
    }
    None => println("invalid FEN")
  }
}