///|
/// Example: reduced_demo
/// Demonstrates the Bio.Align.Reduced module (reduced amino acid alphabets).
fn main {
  println("=== Reduced Amino Acid Alphabets Demo ===")
  println("")

  // Example 1: RAD alphabet (6 groups)
  println("=== RAD Alphabet (6 groups) ===")
  let rad = @bio.rad_alphabet()
  let rad_name = rad.get_name()
  let rad_ng = rad.get_n_groups()
  println("Name: \{rad_name}")
  println("Groups: \{rad_ng}")
  println("Groups:")
  for g in rad.get_groups() {
    println("  \{g}")
  }
  println("")

  // Reduce a sequence
  let seq1 = "MVLSPADKTNVKAAWGCK"
  let reduced1 = rad.reduce_sequence(seq1)
  println("Original: \{seq1}")
  println("Reduced:  \{reduced1}")
  println("")

  // Example 2: Dayhoff alphabet
  println("=== Dayhoff Alphabet (6 groups) ===")
  let dh = @bio.dayhoff_alphabet()
  let dh_name = dh.get_name()
  println("Name: \{dh_name}")
  println("Groups:")
  for g in dh.get_groups() {
    println("  \{g}")
  }
  println("")

  let reduced2 = dh.reduce_sequence(seq1)
  println("Original: \{seq1}")
  println("Reduced:  \{reduced2}")
  println("")

  // Example 3: CHARM alphabet
  println("=== CHARM Alphabet (4 groups) ===")
  let charm = @bio.charm_alphabet()
  let charm_name = charm.get_name()
  println("Name: \{charm_name}")
  println("Groups:")
  for g in charm.get_groups() {
    println("  \{g}")
  }
  println("")

  let reduced3 = charm.reduce_sequence(seq1)
  println("Original: \{seq1}")
  println("Reduced:  \{reduced3}")
  println("")

  // Example 4: SDM12 alphabet
  println("=== SDM12 Alphabet (12 groups) ===")
  let sdm = @bio.sdm12_alphabet()
  let sdm_name = sdm.get_name()
  let sdm_ng = sdm.get_n_groups()
  println("Name: \{sdm_name}")
  println("Groups: \{sdm_ng}")
  println("")

  let reduced4 = sdm.reduce_sequence(seq1)
  println("Original: \{seq1}")
  println("Reduced:  \{reduced4}")
  println("")

  // Example 5: Compare sequences using reduced alphabet
  println("=== Sequence Comparison ===")
  let seq_a = "MVLSPADKTNVKAAWGCK"
  let seq_b = "MVLSPADKTNVKAAWGCK"
  let seq_c = "AAAAAAAAAAAAAAAARR"

  println("Comparing sequences with RAD:")
  let id_ab = @bio.reduced_identity(seq_a, seq_b, rad)
  let id_ac = @bio.reduced_identity(seq_a, seq_c, rad)
  println("  A vs B: \{id_ab}")
  println("  A vs C: \{id_ac}")

  println("")
  println("Comparing sequences with Dayhoff:")
  let id_ab_dh = @bio.reduced_identity(seq_a, seq_b, dh)
  let id_ac_dh = @bio.reduced_identity(seq_a, seq_c, dh)
  println("  A vs B: \{id_ab_dh}")
  println("  A vs C: \{id_ac_dh}")
  println("")

  // Example 6: Get alphabet by name
  println("=== Get Alphabet by Name ===")
  match @bio.get_reduced_alphabet("rad") {
    Some(a) => {
      let a_name = a.get_name()
      let a_ng = a.get_n_groups()
      println("Found: \{a_name} (\{a_ng} groups)")
    }
    None => println("Not found")
  }
  match @bio.get_reduced_alphabet("dayhoff") {
    Some(a) => {
      let a_name = a.get_name()
      let a_ng = a.get_n_groups()
      println("Found: \{a_name} (\{a_ng} groups)")
    }
    None => println("Not found")
  }
  match @bio.get_reduced_alphabet("unknown") {
    Some(_) => println("Found: unexpected")
    None => println("Not found: expected")
  }
  println("")

  // Example 7: Summary
  println("=== RAD Summary ===")
  println(rad.summary())
}