///|
/// Progressive Multiple Sequence Alignment Demo
/// Demonstrates Bio.Align.AlignClusterer functionality
///
/// Run: moon run examples/align_cluster_demo/
fn main {
  // Create aligner with default parameters
  let aligner = @bio.align_cluster_new()
  println("=== Progressive MSA Demo ===")
  println("Aligner created with default scoring parameters")
  println("  (match=2.0, mismatch=-1.0, open_gap=-2.0, extend_gap=-0.5)")

  // Prepare sequences (simulated homologous sequences)
  let sequences = [
    "ACGTACGTACGTACGT", "ACGTACGTTCGTACGT", "ACGTACGTACGTTCGT", "TCGTACGTACGTACGT",
  ]
  let ids = ["seq1", "seq2", "seq3", "seq4"]

  println("")
  println("Input sequences:")
  for i = 0; i < sequences.length(); i = i + 1 {
    println("  \{ids[i]}: \{sequences[i]}")
  }

  // Build distance matrix
  println("")
  println("Building distance matrix...")
  let dist_matrix = @bio.build_distance_matrix(aligner, sequences, ids)
  let matrix = dist_matrix.get_matrix()
  println("Distance matrix (\{matrix.length()}x\{matrix[0].length()}):")
  for i = 0; i < matrix.length(); i = i + 1 {
    let mut row = ""
    for j = 0; j < matrix[i].length(); j = j + 1 {
      row = row + matrix[i][j].to_string() + "  "
    }
    println("  \{row}")
  }

  // Build guide tree
  println("")
  println("Building UPGMA guide tree...")
  let tree = @bio.upgma_tree(dist_matrix)
  let nodes = tree.get_nodes()
  println("Guide tree has \{nodes.length()} nodes")
  println("Sequence count (expected leaves): \{sequences.length()}")
  println("Internal nodes: \{nodes.length() - sequences.length()}")

  // Perform progressive alignment
  println("")
  println("Performing progressive alignment...")
  let msa = @bio.progressive_alignment(aligner, sequences, ids)
  println("Alignment complete!")
  println("Number of sequences: \{msa.num_records()}")
  println("Alignment length: \{msa.get_alignment_length()}")

  // Display aligned sequences using get_aligned_sequences
  println("")
  println("Aligned sequences (via get_aligned_sequences):")
  let aligned = @bio.get_aligned_sequences(aligner, sequences)
  for i = 0; i < aligned.length(); i = i + 1 {
    println("  \{ids[i]}: \{aligned[i]}")
  }

  // Display MSA representation
  println("")
  println("MSA representation:")
  println(msa.repr())

  println("=== Demo complete ===")
}