///|
/// BAM format parsing example.
///
/// Demonstrates parsing raw BAM binary data, BGZF decompression, and accessing record information.
///
/// Run: moon run examples/bam_demo/main.mbt
fn main {
  println("=== BAM Format Parsing Demo ===")
  println("")

  let test_bam_base64 = "QkFNAS0AAABASEQJVk46MS42CVNPOmNvb3JkaW5hdGUKQFNRCVNOOmNocjEJTE46MTAwMAoBAAAABQAAAGNocjEA6AMAADkAAAAAAAAAZAAAAAAAAAA8AAAGAAEACAAAAP////8AAAAAAAAAAHJlYWQxAIAAAAAAAAAAAAAAAAAAAAA="

  println("1. Parsing base64-encoded BAM data...")

  let bam_opt = @bio.try_parse_bam_base64(test_bam_base64)
  if bam_opt is None {
    println("Error parsing BAM data")
    return
  }
  let bam = bam_opt.unwrap()

  println("Parsing successful!")
  println("")

  println("=== Header Information ===")
  println("References: \{bam.num_references()}")
  let ref_names = bam.get_reference_names()
  for name in ref_names {
    let len = bam.get_reference_length(name)
    println("  - \{name}: length = \{Repr(len)}")
  }

  println("")
  println("=== Records ===")
  println("Total records: \{bam.len()}")
  println("")

  for i = 0; i < bam.len(); i = i + 1 {
    let record = bam.records[i]
    println("Record \{i + 1}:")
    println("  QNAME: \{record.qname}")
    println("  FLAG: \{record.flag}")
    println("  RNAME: \{record.get_reference_name(bam.header)}")
    println("  POS: \{record.pos + 1} (1-based)")
    println("  MAPQ: \{record.mapq}")
    println("  CIGAR: \{record.cigar.length()} operations")
    for j = 0; j < record.cigar.length(); j = j + 1 {
      let op = record.cigar[j]
      let op_str = match op.op {
        @bio.BamCigarOp::Match => "M"
        @bio.BamCigarOp::Insert => "I"
        @bio.BamCigarOp::Delete => "D"
        @bio.BamCigarOp::Skip => "N"
        @bio.BamCigarOp::SoftClip => "S"
        @bio.BamCigarOp::HardClip => "H"
        @bio.BamCigarOp::Pad => "P"
        @bio.BamCigarOp::Equal => "="
        @bio.BamCigarOp::Diff => "X"
      }
      println("    \{op.length}\{op_str}")
    }
    println("  SEQ: \{record.seq}")
    println("  QUAL: \{record.qual}")
    println("  TLEN: \{record.tlen}")
    println("  END: \{record.get_end() + 1} (1-based)")
    println("  Is paired: \{record.is_paired()}")
    println("  Is unmapped: \{record.is_unmapped()}")
    println("")
  }

  println("=== SAM Output ===")
  let sam_str = bam.to_sam()
  println(sam_str)

  println("")
  println("=== BGZF Decompression Demo ===")
  println("")

  let bgzf_magic = "\u001f\u008b\u0008\u0004"
  println("BGZF magic bytes detection:")
  println("  Is BGZF (magic): \{@bio.is_bgzf(bgzf_magic)}")
  let bam_magic = "BAM\u0001"
  println("  Is BGZF (BAM): \{@bio.is_bgzf(bam_magic)}")
  println("")

  println("BGZF functions available:")
  println("  - is_bgzf(data): Check if data is BGZF compressed")
  println("  - bgzf_decompress(data): Decompress BGZF data")
  println("  - parse_bam_from_bgzf(data): Parse BAM from BGZF compressed data")
  println("")

  println("=== Done ===")
}