///|
/// InterProScan Demo - Demonstrates parsing InterProScan TSV output.
///
/// Run: moon run examples/interproscan_demo
fn main {
  println("=== InterProScan Demo ===")
  println("InterProScan TSV output parser (14-column format)")
  println(
    "Reference: InterProScan 5 genome-scale protein function classification",
  )
  println("")

  // ------------------------------------------------------------------
  // 1. Parse sample InterProScan TSV data
  // ------------------------------------------------------------------
  println("=== 1. Parse sample data ===")
  let data = @bio.interproscan_sample_data()
  let records = @bio.parse_interproscan(data)
  println("Parsed \{records.length()} records from sample data")
  println("")

  // ------------------------------------------------------------------
  // 2. Display first few records with key fields
  // ------------------------------------------------------------------
  println("=== 2. First few records ===")
  let show_count = if records.length() < 3 { records.length() } else { 3 }
  for i in 0.. \{r.signature_acc()} (score=\{r.score()})")
  }
  println("")

  // ------------------------------------------------------------------
  // 4. Filter by protein ID
  // ------------------------------------------------------------------
  println("=== 4. Filter by protein: sp|P12345|PROT_HUMAN ===")
  let prot = @bio.interproscan_filter_by_protein(
    records, "sp|P12345|PROT_HUMAN",
  )
  println("Found \{prot.length()} record(s)")
  for r in prot {
    println(
      "  \{r.analysis()} | \{r.signature_acc()} | pos=\{r.start_pos()}-\{r.stop_pos()}",
    )
  }
  println("")

  // ------------------------------------------------------------------
  // 5. Show all GO terms
  // ------------------------------------------------------------------
  println("=== 5. All GO terms ===")
  let go = @bio.interproscan_get_go_terms(records)
  println("Unique GO terms count: \{go.length()}")
  for g in go {
    println("  \{g}")
  }
  println("")

  // ------------------------------------------------------------------
  // 6. Show unique proteins and signatures
  // ------------------------------------------------------------------
  println("=== 6. Unique proteins and signatures ===")
  let proteins = @bio.interproscan_get_unique_proteins(records)
  let signatures = @bio.interproscan_get_unique_signatures(records)
  println("Unique proteins (\{proteins.length()}):")
  for p in proteins {
    println("  \{p}")
  }
  println("Unique signatures (\{signatures.length()}):")
  for s in signatures {
    println("  \{s}")
  }
  println("")

  // ------------------------------------------------------------------
  // 7. Group records by protein
  // ------------------------------------------------------------------
  println("=== 7. Group by protein ===")
  let groups = @bio.interproscan_group_by_protein(records)
  for g in groups {
    let (pid, recs) = g
    println("  \{pid}: \{recs.length()} record(s)")
    for r in recs {
      println("    - \{r.analysis()} / \{r.signature_acc()}")
    }
  }
  println("")

  // ------------------------------------------------------------------
  // 8. Generate summary
  // ------------------------------------------------------------------
  println("=== 8. Summary ===")
  println(@bio.interproscan_summary(records))

  println("=== Demo complete ===")
}