///|
/// Exonerate output parsing demo - demonstrates parsing vulgar and cigar
/// output formats from the Exonerate spliced alignment tool.
fn main {
  println("=== Exonerate Parsing Demo ===\n")

  println("1. Parsing vulgar format:")
  let vulgar_data = @bio.exonerate_sample_data()
  let vulgar_records = @bio.parse_exonerate_vulgar(vulgar_data)
  println("   Parsed \{vulgar_records.length()} vulgar records")
  let mut i = 0
  while i < vulgar_records.length() {
    let rec = vulgar_records[i]
    println(
      "   [\{i + 1}] \{rec.query_name()} \{rec.query_start()}-\{rec.query_end()}\{rec.query_strand()} -> \{rec.target_name()} \{rec.target_start()}-\{rec.target_end()}\{rec.target_strand()} score=\{rec.score().to_int()}",
    )
    let mut j = 0
    while j < rec.alignment_blocks().length() {
      let b = rec.alignment_blocks()[j]
      println(
        "       block \{j}: code=\{b.code()} q=\{b.query_length()} t=\{b.target_length()} score=\{b.block_score().to_int()}",
      )
      j = j + 1
    }
    i = i + 1
  }

  println("\n2. Parsing cigar format:")
  let cigar_data = @bio.exonerate_sample_cigar_data()
  let cigar_records = @bio.parse_exonerate_cigar(cigar_data)
  println("   Parsed \{cigar_records.length()} cigar records")
  i = 0
  while i < cigar_records.length() {
    let rec = cigar_records[i]
    println(
      "   [\{i + 1}] \{rec.query_name()} -> \{rec.target_name()} score=\{rec.score().to_int()} blocks=\{rec.alignment_blocks().length()}",
    )
    i = i + 1
  }

  println("\n3. Auto-detecting format (mixed input):")
  let mixed = "vulgar: mixed_q 0 100 + mixed_t 0 95 + 1850 M 80 80 80 I 0 0 2000 M 20 15 20\n" +
    "cigar: mixed_q2 0 50 + mixed_t2 0 50 + 850 M 50\n"
  let mixed_records = @bio.parse_exonerate(mixed)
  println("   Parsed \{mixed_records.length()} records from mixed input")
  i = 0
  while i < mixed_records.length() {
    println("   [\{i + 1}] \{mixed_records[i].query_name()}")
    i = i + 1
  }

  println("\n4. Filtering by score (>= 1000):")
  let filtered = @bio.exonerate_filter_by_score(vulgar_records, 1000.0)
  println(
    "   \{filtered.length()} of \{vulgar_records.length()} records passed",
  )
  i = 0
  while i < filtered.length() {
    println(
      "   [\{i + 1}] \{filtered[i].query_name()} score=\{filtered[i].score().to_int()}",
    )
    i = i + 1
  }

  println("\n5. Per-record alignment statistics:")
  i = 0
  while i < vulgar_records.length() {
    let rec = vulgar_records[i]
    let aln_len = @bio.exonerate_total_alignment_length(rec)
    let intron_len = @bio.exonerate_total_intron_length(rec)
    let n_introns = @bio.exonerate_count_introns(rec)
    let n_matches = @bio.exonerate_count_matches(rec)
    println(
      "   \{rec.query_name()}: matches=\{n_matches} aln_len=\{aln_len} introns=\{n_introns} intron_len=\{intron_len}",
    )
    i = i + 1
  }

  println("\n6. Reconstructing vulgar and cigar strings:")
  let first = vulgar_records[0]
  println("   vulgar: \{@bio.exonerate_to_vulgar_string(first)}")
  println("   cigar:  \{@bio.exonerate_to_cigar_string(first)}")

  println("\n7. Summary:")
  let summary = @bio.exonerate_summary(vulgar_records)
  println(summary)

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