///|
fn main {
  println("=== Ballgown (Transcript-level DE Analysis) Demo ===")

  let bg = @bio.sample_ballgown()

  println("")
  println("Ballgown Object Summary:")
  println("  Samples: " + bg.sample_names.length().to_string())
  println("  Transcripts: " + bg.transcripts.length().to_string())
  println("  Exons: " + bg.exons.length().to_string())
  println("  Introns: " + bg.introns.length().to_string())

  let gene_ids = bg.get_gene_ids()
  println("  Genes: " + gene_ids.length().to_string())

  println("")
  println("Sample names:")
  let mut i = 0
  while i < bg.sample_names.length() {
    println("  " + (i + 1).to_string() + ". " + bg.sample_names[i])
    i = i + 1
  }

  println("")
  println("Gene list:")
  let gene_names = bg.get_gene_names()
  i = 0
  while i < gene_names.length() {
    let gene_id = gene_ids[i]
    let txs = bg.get_gene_transcripts(gene_id)
    println(
      "  " +
      gene_names[i] +
      " (" +
      gene_id +
      "): " +
      txs.length().to_string() +
      " transcripts",
    )
    i = i + 1
  }

  println("")
  println("FPKM matrix (first 5 transcripts):")
  let _fpkm_mat = bg.get_fpkm_matrix()
  i = 0
  while i < 5 && i < bg.transcripts.length() {
    let t = bg.transcripts[i]
    let mut j = 0
    let mut line = t.id + ": "
    while j < t.fpkm.length() {
      line = line + t.fpkm[j].to_string() + " "
      j = j + 1
    }
    println("  " + line)
    i = i + 1
  }

  println("")
  println("=== Differential Expression Analysis ===")
  println("Group 0: samples 0-2 (control)")
  println("Group 1: samples 3-5 (treatment)")
  let group = [0, 0, 0, 1, 1, 1]

  println("")
  println("Transcript-level DE results:")
  let de_tx = @bio.stattest(bg, group, feature="transcript")
  i = 0
  while i < de_tx.length() {
    let r = de_tx[i]
    println(
      "  " +
      r.feature_id +
      " | log2FC=" +
      r.log2_fc.to_string() +
      " | pval=" +
      r.p_value.to_string() +
      " | qval=" +
      r.q_value.to_string(),
    )
    i = i + 1
  }

  println("")
  println("Gene-level DE results:")
  let de_gene = @bio.stattest(bg, group, feature="gene")
  i = 0
  while i < de_gene.length() {
    let r = de_gene[i]
    println(
      "  " +
      r.gene_name +
      " | log2FC=" +
      r.log2_fc.to_string() +
      " | pval=" +
      r.p_value.to_string() +
      " | qval=" +
      r.q_value.to_string(),
    )
    i = i + 1
  }

  println("")
  println("Gene expression for GeneA:")
  let expr_geneA = @bio.gene_expression(bg, gene_ids[0])
  i = 0
  while i < expr_geneA.length() {
    println("  " + bg.sample_names[i] + ": " + expr_geneA[i].to_string())
    i = i + 1
  }

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