///|
/// Codon Usage Analysis Demo - DNA sequence codon usage analysis example.

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

  let dna_seq = "ATGGCCATGAAATGGTGAATGGCCGCCGCCAAATGGG"

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

  println("=== Count Codons ===")
  let counts = @bio.count_codons(dna_seq)
  println("Total unique codons: " + counts.length().to_string())

  println("\n=== RSCU Analysis ===")
  let rscu_map = @bio.codon_rscu(counts.copy())
  let top_codons = ["ATG", "GCC", "AAA", "TGG"]
  let mut i = 0
  while i < top_codons.length() {
    let codon = top_codons[i]
    match rscu_map.get(codon) {
      Some(val) => println("  " + codon + ": " + val.to_string())
      None => println("  " + codon + ": not found")
    }
    i = i + 1
  }

  println("\n=== Optimal Codons ===")
  let optimal = @bio.codon_optimal(rscu_map.copy())
  println("Number of optimal codons: " + optimal.length().to_string())

  println("\n=== CAI (Codon Adaptation Index) ===")
  let opt_weights : Map[String, Double] = Map([], capacity=64)
  for c in optimal {
    opt_weights[c] = rscu_map.get(c).unwrap_or(1.0)
  }
  let cai_val = @bio.codon_cai(dna_seq, opt_weights)
  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")
  }

  println("\n=== ENC (Effective Number of Codons) ===")
  let enc_val = @bio.codon_enc(counts.copy())
  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=== GC3 (GC content at third position) ===")
  let gc3_val = @bio.codon_gc3(dna_seq)
  println("GC3 value: " + gc3_val.to_string())

  println("\n=== CBI (Codon Bias Index) ===")
  let opt_array = ["ATG", "GCC", "AAA", "TGG"]
  let cbi_val = @bio.codon_cbi(dna_seq, opt_array)
  println("CBI value: " + cbi_val.to_string())

  println("\n=== Fop (Frequency of Optimal Codons) ===")
  let fop_val = @bio.codon_fop(dna_seq, opt_array)
  println("Fop value: " + fop_val.to_string())

  println("\n=== Codon Translation ===")
  println("  ATG -> " + @bio.codon_translate("ATG"))
  println("  GCC -> " + @bio.codon_translate("GCC"))
  println("  TAA -> " + @bio.codon_translate("TAA"))

  println("\n=== Reverse Complement ===")
  println("  ATG -> " + @bio.codon_reverse_complement("ATG"))
  println("  GCA -> " + @bio.codon_reverse_complement("GCA"))

  println("\n=== Complete Analysis ===")
  let result = @bio.codon_usage_analysis(dna_seq)
  println("CAI: " + result.cai.to_string())
  println("ENC: " + result.enc.to_string())
  println("GC3: " + result.gc3.to_string())
  println("Optimal codons count: " + result.optimal_codons.length().to_string())

  println("\n=== Analysis with Reference Sequence ===")
  let ref_seq = "ATGATGATGGCCGCCGCCAAA"
  let ref_result = @bio.codon_usage_with_ref(dna_seq, ref_seq)
  println("CAI (with reference): " + ref_result.cai.to_string())

  println("\n=== Codon Usage Analysis Done ===")
}