///|
/// StructureAlignment demo - Multiple protein structure alignment.
/// Inspired by Biopython Bio.PDB.StructureAlignment.
///
/// Run: moon run examples/structure_alignment_demo/main.mbt
fn main {
  println("=== StructureAlignment Demo ===")
  println("Inspired by Biopython Bio.PDB.StructureAlignment")
  println("")

  println("1. Create test structures")
  let residues1 = [
    @bio.SAResidue::new("ALA", 1, @bio.SAPoint3D::new(0.0, 0.0, 0.0)),
    @bio.SAResidue::new("GLY", 2, @bio.SAPoint3D::new(1.5, 0.0, 0.0)),
    @bio.SAResidue::new("SER", 3, @bio.SAPoint3D::new(3.0, 0.0, 0.0)),
    @bio.SAResidue::new("THR", 4, @bio.SAPoint3D::new(4.5, 0.0, 0.0)),
  ]
  let residues2 = [
    @bio.SAResidue::new("ALA", 1, @bio.SAPoint3D::new(0.0, 0.0, 0.5)),
    @bio.SAResidue::new("GLY", 2, @bio.SAPoint3D::new(1.5, 0.2, 0.5)),
    @bio.SAResidue::new("SER", 3, @bio.SAPoint3D::new(3.0, 0.0, 0.5)),
  ]
  let residues3 = [
    @bio.SAResidue::new("ALA", 1, @bio.SAPoint3D::new(0.0, 1.0, 0.0)),
    @bio.SAResidue::new("GLY", 2, @bio.SAPoint3D::new(1.5, 1.2, 0.0)),
  ]

  let struct1 = @bio.SAStructure::new("PDB_1A", residues1)
  let struct2 = @bio.SAStructure::new("PDB_2B", residues2)
  let struct3 = @bio.SAStructure::new("PDB_3C", residues3)

  println(
    "  Structure 1 (PDB_1A): " +
    struct1.residues.length().to_string() +
    " residues",
  )
  println(
    "  Structure 2 (PDB_2B): " +
    struct2.residues.length().to_string() +
    " residues",
  )
  println(
    "  Structure 3 (PDB_3C): " +
    struct3.residues.length().to_string() +
    " residues",
  )
  println("")

  println("2. Align two structures")
  let result2 = @bio.bio_structure_align_two(struct1, struct2)
  println(
    "  Aligned structures: " +
    result2.structure_ids[0] +
    " vs " +
    result2.structure_ids[1],
  )
  println("  Aligned length: " + result2.aligned_length.to_string())
  println("  RMSD: " + result2.rmsd.to_string())
  println("  TM-score: " + result2.tm_score.to_string())
  println("")

  println("3. Multiple structure alignment")
  let structures = [struct1, struct2, struct3]
  let result_multi = @bio.bio_structure_align_multiple(structures)
  println(
    "  Number of structures: " + result_multi.structure_ids.length().to_string(),
  )
  println("  Aligned length: " + result_multi.aligned_length.to_string())
  println("  Average RMSD: " + result_multi.rmsd.to_string())
  println("")

  println("4. Pairwise RMSD matrix")
  let rmsd_matrix = @bio.bio_structure_pairwise_rmsd(structures)
  println("  RMSD Matrix:")
  println("         " + result_multi.structure_ids.join("     "))

  let mut i = 0
  while i < rmsd_matrix.length() {
    let mut row_str = result_multi.structure_ids[i] + "  "
    let mut j = 0
    while j < rmsd_matrix[i].length() {
      row_str = row_str + rmsd_matrix[i][j].to_string() + "  "
      j = j + 1
    }
    println("  " + row_str)
    i = i + 1
  }
  println("")

  println("5. Calculate TM-score directly")
  let tm_score = @bio.bio_structure_calculate_tm_score(struct1, struct2)
  println("  TM-score (PDB_1A vs PDB_2B): " + tm_score.to_string())
  println("")

  println("=== StructureAlignment Demo Complete ===")
}