///|
/// Substitution matrix demo - demonstrates using BLOSUM and PAM matrices
/// for protein sequence alignment.
///
/// Run with: moon run examples/subsmat_demo/main.mbt
fn main {
  println("=== Substitution Matrix Demo ===\n")

  println("1. BLOSUM62 Matrix Lookup:")
  let blosum62 = @data.blosum62()
  println("   Matrix name: " + blosum62.name())
  println("   A-A score: " + blosum62.get_score("A", "A").to_string())
  println("   R-R score: " + blosum62.get_score("R", "R").to_string())
  println("   A-R score: " + blosum62.get_score("A", "R").to_string())
  println("   W-W score: " + blosum62.get_score("W", "W").to_string())

  println("\n2. PAM250 Matrix Lookup:")
  let pam250 = @data.pam250()
  println("   Matrix name: " + pam250.name())
  println("   A-A score: " + pam250.get_score("A", "A").to_string())
  println("   W-W score: " + pam250.get_score("W", "W").to_string())

  println("\n3. Case Insensitivity Test:")
  println(
    "   blosum62.get_score('a', 'A') = " +
    blosum62.get_score_case_insensitive("a", "A").to_string(),
  )

  println("\n4. Protein Alignment with BLOSUM62:")
  let seq1 = "MVKLSQVAPFASG"
  let seq2 = "MVKLSEVAPFSSG"
  let sw_result = @bio.smith_waterman_blosum62(seq1, seq2, -1.0)
  println("   Sequence 1: " + seq1)
  println("   Sequence 2: " + seq2)
  println("   Alignment score: " + sw_result.score().to_string())
  println(
    "   Percent identity: " + sw_result.percent_identity().to_string() + "%",
  )
  println("   Alignment:")
  println("     " + sw_result.aligned1())
  println("     " + sw_result.match_line())
  println("     " + sw_result.aligned2())

  println("\n5. Global Alignment with PAM250:")
  let nw_result = @bio.needleman_wunsch_pam250(seq1, seq2, -2.0)
  println("   Alignment score: " + nw_result.score().to_string())
  println("   Alignment:")
  println("     " + nw_result.aligned1())
  println("     " + nw_result.match_line())
  println("     " + nw_result.aligned2())

  println("\n=== Demo Complete ===")
}