///|
/// SearchIO demo - demonstrates parsing HMMER3 tabular, BLAT PSL formats
/// and converting BLAST results to SearchIO model.
///
/// Run with: moon run examples/search_io_demo/main.mbt
fn main {
  println("=== SearchIO Demo ===\n")

  println("1. Parsing HMMER3 Tabular Format:")
  let hmmer3_data = "# hmmscan 3.3.2 (March 2023)\n" +
    "# query name           target name        accession   E-value  score  bias\n" +
    "PF00001.28            sp|Q9Y2W8|A1BG_HUMAN  Q9Y2W8     1e-50    200    5\n" +
    "PF00001.28            sp|P12345|ABC_HUMAN   P12345     1e-30    150    2\n" +
    "PF00001.28            sp|X99999|XYZ_HUMAN   X99999     0.5      50     1\n"

  let hmmer3_results = @bio.parse_hmmer3_tab(hmmer3_data)
  println("   Results found: " + hmmer3_results.length().to_string())
  if hmmer3_results.length() > 0 {
    let qr = hmmer3_results[0]
    println("   Query: " + qr.id)
    println("   Hits: " + qr.hits.length().to_string())

    let mut i = 0
    while i < qr.hits.length() {
      let hit = qr.hits[i]
      println("   Hit " + (i + 1).to_string() + ": " + hit.id)
      println("     E-value: " + hit.evalue.to_string())
      println("     Bitscore: " + hit.bitscore.to_string())
      i = i + 1
    }
  }

  println("\n2. Parsing BLAT PSL Format:")
  let psl_data = "100\t0\t0\t0\t0\t0\t0\t0\t+\tquery1\t1000\t0\t100\ttarget1\t2000\t0\t100\t1\t100,\t0,\t0,\n" +
    "80\t0\t0\t0\t0\t0\t0\t0\t-\tquery1\t1000\t100\t180\ttarget2\t1500\t50\t130\t1\t80,\t100,\t50,\n"

  let psl_results = @bio.parse_blat_psl(psl_data)
  println("   Results found: " + psl_results.length().to_string())
  if psl_results.length() > 0 {
    let qr = psl_results[0]
    println("   Query: " + qr.id)
    println("   Query length: " + qr.seq_len.to_string())
    println("   Hits: " + qr.hits.length().to_string())

    let mut i = 0
    while i < qr.hits.length() {
      let hit = qr.hits[i]
      println("   Hit " + (i + 1).to_string() + ": " + hit.id)
      i = i + 1
    }
  }

  println("\n3. Counting HSPs:")
  if hmmer3_results.length() > 0 {
    let count = @bio.count_hsps(hmmer3_results[0])
    println("   Total HSPs: " + count.to_string())
  }

  println("\n4. Getting Top Hits (by E-value):")
  if hmmer3_results.length() > 0 {
    let tops = @bio.top_hits(hmmer3_results[0], 2, 0.01)
    println("   Top 2 hits (E-value < 0.01):")

    let mut i = 0
    while i < tops.length() {
      let hit = tops[i]
      println(
        "   " +
        (i + 1).to_string() +
        ". " +
        hit.id +
        " (E-value: " +
        hit.evalue.to_string() +
        ")",
      )
      i = i + 1
    }
  }

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