// Demo for Bio.Align.analysis module

///|
fn main {
  println("=== Bio.Align.analysis Module Demo ===\n")

  // Create test sequences
  let seq1 = "ATGAAACCC"
  let seq2 = "ATGAAGCCC"
  let seq3 = "ATGTACCCC"

  println("Sequence 1: \{seq1}")
  println("Sequence 2: \{seq2}")
  println("Sequence 3: \{seq3}")

  // Amino acid translation
  println("\n=== Amino Acid Translation ===")
  println("ATG -> \{@bio.aln_aa_from_codon("ATG")}")
  println("AAA -> \{@bio.aln_aa_from_codon("AAA")}")
  println("AAG -> \{@bio.aln_aa_from_codon("AAG")}")
  println("TAC -> \{@bio.aln_aa_from_codon("TAC")}")
  println("CCC -> \{@bio.aln_aa_from_codon("CCC")}")

  // dn/ds analysis
  println("\n=== dn/ds Analysis (Nei-Gojobori Method) ===")

  // Compare seq1 and seq2 (synonymous change)
  let result_12 = @bio.aln_analyze_dn_ds(seq1, seq2)
  println("Comparison seq1 vs seq2 (synonymous):")
  println("  dn: \{result_12.aln_get_dn()}")
  println("  ds: \{result_12.aln_get_ds()}")
  println("  dn/ds ratio: \{result_12.aln_get_ratio()}")
  println("  Positive selection: \{result_12.aln_has_positive_selection()}")
  println("  Purifying selection: \{result_12.aln_has_purifying_selection()}")

  // Compare seq1 and seq3 (non-synonymous change)
  let result_13 = @bio.aln_analyze_dn_ds(seq1, seq3)
  println("\nComparison seq1 vs seq3 (non-synonymous):")
  println("  dn: \{result_13.aln_get_dn()}")
  println("  ds: \{result_13.aln_get_ds()}")
  println("  dn/ds ratio: \{result_13.aln_get_ratio()}")
  println("  Positive selection: \{result_13.aln_has_positive_selection()}")

  // Evolutionary distances
  println("\n=== Evolutionary Distances ===")

  let sequences = [seq1, seq2, seq3]

  // P-distance matrix
  println("\nP-distance matrix:")
  let n = sequences.length()
  let mut i = 0
  while i < n {
    let mut j = 0
    let row : Array[Double] = []
    while j < n {
      let dist = @bio.aln_p_distance(sequences[i], sequences[j])
      row.push(dist)
      j = j + 1
    }
    println("  Row \{i}: \{Repr(row)}")
    i = i + 1
  }

  // Jukes-Cantor distance matrix
  println("\nJukes-Cantor distance matrix:")
  let jc_matrix = @bio.aln_jukes_cantor_matrix(sequences)
  let mut x = 0
  while x < n {
    println("  Row \{x}: \{Repr(jc_matrix[x])}")
    x = x + 1
  }

  // Kimura 2-parameter distance matrix
  println("\nKimura 2-parameter distance matrix:")
  let k2p_matrix = @bio.aln_kimura_2p_matrix(sequences)
  let mut y = 0
  while y < n {
    println("  Row \{y}: \{Repr(k2p_matrix[y])}")
    y = y + 1
  }

  // Count sites
  println("\n=== Site Counting ===")
  let sites = @bio.aln_count_sites(seq1)
  println("Synonymous sites: \{sites[0]}")
  println("Non-synonymous sites: \{sites[1]}")

  println("\nDemo completed successfully!")
}