///|
/// Bio.SeqIO.SffIO Demo - Standard Flowgram Format binary parsing.
/// Inspired by Biopython's Bio.SeqIO.SffIO module.
fn main {
  println("=== Bio.SeqIO.SffIO Demo ===")

  // 1. Create an example SFF file
  println("")
  println("1. Create an example SFF file:")
  let sff = @bio.sff_create_example_file()
  let header = sff.sff_header()
  println("   Flow chars: " + header.sff_flow_chars())
  println("   Key sequence: " + header.sff_key_sequence())
  println("   Number of reads: " + sff.sff_n_reads().to_string())
  println("   Total bases: " + sff.sff_total_bases().to_string())

  // 2. Inspect individual reads
  println("")
  println("2. Inspect reads:")
  let mut i = 0
  while i < sff.sff_n_reads() {
    let read = sff.sff_get_read(i)
    let mean_q = read.sff_mean_quality()
    println(
      "   " +
      read.sff_name() +
      ": bases=" +
      read.sff_n_bases().to_string() +
      ", sequence=" +
      read.sff_bases() +
      ", mean_quality=" +
      mean_q.to_string(),
    )
    i = i + 1
  }

  // 3. Quality clipping
  println("")
  println("3. Quality clipping:")
  let read0 = sff.sff_get_read(0)
  let clipped = read0.sff_clipped_bases()
  let clipped_quals = read0.sff_clipped_qualities()
  println("   Original bases: " + read0.sff_bases())
  println("   Clipped bases: " + clipped)
  println("   Clipped qualities count: " + clipped_quals.length().to_string())

  // 4. Binary encode/decode round-trip
  println("")
  println("4. Binary encode/decode round-trip:")
  let bytes = @bio.sff_encode(sff)
  println("   Encoded " + bytes.length().to_string() + " bytes")
  let parsed_opt = @bio.sff_parse(bytes)
  if parsed_opt is Some(_) {
    let parsed = parsed_opt.unwrap()
    println("   Parsed " + parsed.sff_n_reads().to_string() + " reads back")
    let parsed_header = parsed.sff_header()
    println(
      "   Flow chars match: " +
      (parsed_header.sff_flow_chars() == header.sff_flow_chars()).to_string(),
    )
    let r0 = parsed.sff_get_read(0)
    println("   Read 0 name: " + r0.sff_name())
    println("   Read 0 bases: " + r0.sff_bases())
  } else {
    println("   Parse failed!")
  }

  // 5. Header validation
  println("")
  println("5. Header validation:")
  let errors = header.sff_validate()
  println("   Validation errors: " + errors.length().to_string())

  // 6. Find read by name
  println("")
  println("6. Find read by name:")
  let found = sff.sff_find_read("READ0002")
  if found is Some(_) {
    println("   Found READ0002: " + found.unwrap().sff_bases())
  } else {
    println("   READ0002 not found")
  }

  println("")
  println("=== Bio.SeqIO.SffIO Demo Completed ===")
}