///|
/// Advanced Codon Analysis Demo - Comprehensive codon usage analysis example.

///|
fn main {
  println("=== Advanced Codon Analysis Demo ===\n")

  let dna_seq = "ATGGCCATGAAATGGTGAATGGCCGCCGCCAAAAAA"

  println("DNA sequence: " + dna_seq)
  println("Sequence length: " + dna_seq.length().to_string() + "\n")

  println("=== Codon Usage Table ===")
  let usage = @bio.codon_usage_from_sequence(dna_seq)
  println("Total codons: " + @bio.CodonUsageTable::total(usage).to_string())
  println("")

  let counts = @bio.CodonUsageTable::counts(usage)
  let keys = counts.keys().collect()
  let mut ci = 0
  while ci < keys.length() {
    let codon = keys[ci]
    let count = counts.get(codon).unwrap_or(0)
    let freq = @bio.CodonUsageTable::get_frequency(usage, codon)
    println(
      "  " +
      codon +
      ": count=" +
      count.to_string() +
      ", freq=" +
      freq.to_string(),
    )
    ci = ci + 1
  }

  println("\n=== Amino Acid Translation ===")
  println("  ATG -> " + @bio.get_amino_acid("ATG") + " (start)")
  println("  GCC -> " + @bio.get_amino_acid("GCC"))
  println("  AAA -> " + @bio.get_amino_acid("AAA"))
  println("  TGG -> " + @bio.get_amino_acid("TGG"))
  println("  TGA -> " + @bio.get_amino_acid("TGA") + " (stop)")

  println("\n=== RSCU Analysis ===")
  let rscu = @bio.calculate_rscu(usage)
  let rscu_values = @bio.RSCUResult::values(rscu)
  let rscu_keys = rscu_values.keys().collect()
  let mut ri = 0
  while ri < rscu_keys.length() {
    let codon = rscu_keys[ri]
    let val = rscu_values.get(codon).unwrap_or(0.0)
    if val > 1.5 || val < 0.5 {
      println("  " + codon + ": " + val.to_string() + " (bias)")
    }
    ri = ri + 1
  }

  println("\n=== Codon Adaptation Index ===")
  let ref_seq = "ATGATGATGGCCGCCGCCAAAAAA"
  let ref_usage = @bio.codon_usage_from_sequence(ref_seq)
  let cai_val = @bio.calculate_cai(dna_seq, ref_usage)
  println("CAI value: " + cai_val.to_string())
  if cai_val > 0.8 {
    println("Interpretation: High codon adaptation")
  } else if cai_val > 0.5 {
    println("Interpretation: Moderate codon adaptation")
  } else {
    println("Interpretation: Low codon adaptation")
  }

  let cai_detailed = @bio.calculate_cai_detailed(dna_seq, ref_usage)
  println(
    "Detailed CAI score: " + @bio.CAIResult::score(cai_detailed).to_string(),
  )

  println("\n=== Effective Number of Codons ===")
  let enc_val = @bio.calculate_enc(usage)
  println("ENC value: " + enc_val.to_string())
  if enc_val < 35.0 {
    println("Interpretation: High codon usage bias")
  } else if enc_val < 50.0 {
    println("Interpretation: Moderate codon usage bias")
  } else {
    println("Interpretation: Low codon usage bias")
  }

  println("\n=== GC Content Analysis ===")
  let gc3 = @bio.calculate_gc3(dna_seq)
  println("GC3 (third position): " + gc3.to_string())
  let gc1 = @bio.gc_first_fraction(dna_seq)
  println("GC first position: " + gc1.to_string())
  let gc2 = @bio.gc_second_fraction(dna_seq)
  println("GC second position: " + gc2.to_string())
  let at3 = @bio.at_third_fraction(dna_seq)
  println("AT third position: " + at3.to_string())

  println("\n=== Optimal Codons ===")
  let optimal = @bio.optimal_codons(usage)
  let mut oi = 0
  while oi < optimal.length() {
    println("  " + optimal[oi].0 + " -> " + optimal[oi].1)
    oi = oi + 1
  }

  println("\n=== Rare Codons ===")
  let rare = @bio.rare_codons(usage)
  if rare.length() > 0 {
    let mut rri = 0
    while rri < rare.length() {
      println("  " + rare[rri])
      rri = rri + 1
    }
  } else {
    println("  No rare codons detected")
  }

  println("\n=== Comprehensive Bias Analysis ===")
  let bias = @bio.codon_bias_analysis(dna_seq)
  println("  ENC: " + bias.enc.to_string())
  println("  CAI: " + bias.cai.to_string())
  println("  GC3: " + bias.gc3.to_string())
  println("  Bias Score: " + bias.bias_score.to_string())
  println("  Optimal Fraction: " + bias.optimal_fraction.to_string())
  println("  Rare Fraction: " + bias.rare_fraction.to_string())
  println("  Total Codons Analyzed: " + bias.total_codons_analyzed.to_string())

  println("\n=== Organism-Specific Reference Tables ===")
  let cai_high = @bio.calculate_cai_with_org(dna_seq, "high_gc")
  println("  CAI (high GC): " + cai_high.to_string())
  let cai_low = @bio.calculate_cai_with_org(dna_seq, "low_gc")
  println("  CAI (low GC): " + cai_low.to_string())
  let cai_gen = @bio.calculate_cai_with_org(dna_seq, "general")
  println("  CAI (general): " + cai_gen.to_string())

  println("\n=== Amino Acid Composition ===")
  let comp = @bio.get_amino_acid_composition(usage)
  let comp_keys = comp.keys().collect()
  let mut cpi = 0
  while cpi < comp_keys.length() {
    let aa = comp_keys[cpi]
    let fraction = comp.get(aa).unwrap_or(0.0)
    println("  " + aa + ": " + fraction.to_string())
    cpi = cpi + 1
  }

  println("\n=== Multiple Sequence Usage Table ===")
  let seqs = ["ATGGCCATGAAATGGTGA", "GCCGCCGCCAAAAAAATG", "ATGATGGCCAAAGCCGCC"]
  let multi_usage = @bio.codon_usage_from_sequences(seqs)
  println(
    "Total codons (multi): " +
    @bio.CodonUsageTable::total(multi_usage).to_string(),
  )

  println("\n=== Codon Usage Table String ===")
  let table_str = @bio.codon_usage_to_string(usage)
  println(table_str)

  println("=== Advanced Codon Analysis Done ===")
}