///|
/// QCP Superimposer demo - Protein structure superposition using Quaternion
/// Characteristic Polynomial algorithm.
/// Inspired by Biopython Bio.PDB.QCPSuperimposer.
///
/// Run: moon run examples/qcp_superimposer_demo/main.mbt
fn main {
  println("=== QCP Superimposer Demo ===")
  println("Inspired by Biopython Bio.PDB.QCPSuperimposer")
  println("")

  println("1. Create QCPAtomCoordinate objects")
  let atom1 = @bio.QCPAtomCoordinate::new(1.0, 0.0, 0.0)
  let atom2 = @bio.QCPAtomCoordinate::new(0.0, 1.0, 0.0)
  let atom3 = @bio.QCPAtomCoordinate::new(0.0, 0.0, 1.0)
  println(
    "  Atom1: (" +
    atom1.x.to_string() +
    ", " +
    atom1.y.to_string() +
    ", " +
    atom1.z.to_string() +
    ")",
  )
  println(
    "  Atom2: (" +
    atom2.x.to_string() +
    ", " +
    atom2.y.to_string() +
    ", " +
    atom2.z.to_string() +
    ")",
  )
  println("  Distance between atoms: " + atom1.distance(atom2).to_string())
  println("")

  println("2. Superimpose identical structures")
  let atoms1 = [atom1, atom2, atom3]
  let atoms2 = atoms1.copy()
  let superimposer1 = @bio.bio_qcp_superimpose(atoms1, atoms2)
  println("  RMSD (identical): " + superimposer1.get_rmsd().to_string())
  println("")

  println("3. Superimpose translated structures")
  let translated = [
    @bio.QCPAtomCoordinate::new(3.0, 2.0, 1.0),
    @bio.QCPAtomCoordinate::new(2.0, 3.0, 1.0),
    @bio.QCPAtomCoordinate::new(2.0, 2.0, 2.0),
  ]
  let superimposer2 = @bio.bio_qcp_superimpose(atoms1, translated)
  println("  RMSD (translated): " + superimposer2.get_rmsd().to_string())
  println("")

  println("4. Apply transformation to moving coordinates")
  let transformed = superimposer2.apply(translated)
  println("  Transformed coordinates:")
  let mut i = 0
  while i < transformed.length() {
    println(
      "    (" +
      transformed[i].x.to_string() +
      ", " +
      transformed[i].y.to_string() +
      ", " +
      transformed[i].z.to_string() +
      ")",
    )
    i = i + 1
  }
  println("")

  println("5. Direct RMSD calculation")
  let rmsd = @bio.bio_qcp_calculate_rmsd(atoms1, translated)
  println("  Calculated RMSD: " + rmsd.to_string())
  println("")

  println("=== QCP Superimposer Demo Complete ===")
}