///|
/// NOISeq module example - Noise-robust differential expression for RNA-seq.
///
/// Run: moon run examples/noiseq_demo
fn main {
  println("=== NOISeq Module Demo ===")
  println("Noise-Robust Differential Expression Analysis")
  println("")

  // Generate sample data
  println("=== Sample Data ===")
  let (ctrl, trt) = @bio.noiseq_sample_data()
  println("Control samples: \{ctrl.length()}")
  println("Treatment samples: \{trt.length()}")
  let mut i = 0
  while i < ctrl.length() {
    println(
      "  Control \{ctrl[i].sample_id}: lib_size=\{ctrl[i].library_size()}, expressed=\{ctrl[i].n_expressed()}",
    )
    i = i + 1
  }
  println("")

  // Normalization
  println("=== Normalization (TMM) ===")
  let norm_ctrl = @bio.noiseq_normalize(
    ctrl,
    norm_method=@bio.noiseq_norm_tmm(),
  )
  let norm_trt = @bio.noiseq_normalize(trt, norm_method=@bio.noiseq_norm_tmm())
  println("Normalized control samples: \{norm_ctrl.length()}")
  println("Normalized treatment samples: \{norm_trt.length()}")
  println("")

  // Run NOISeq analysis
  println("=== NOISeqBio Analysis ===")
  let results = @bio.noiseq_run(
    ctrl,
    trt,
    ds_method=@bio.noiseq_method_bio(),
    norm=@bio.noiseq_norm_tmm(),
    prob_threshold=0.3,
  )
  println(results.summary())
  println("")

  // Top genes
  println("=== Top 5 Genes ===")
  let top = results.get_top_genes(5)
  let mut j = 0
  while j < top.length() {
    let g = top[j]
    println(
      "  \{g.gene_id}: log2FC=\{g.log2fc}, prob=\{g.prob}, rank=\{g.ranking}",
    )
    j = j + 1
  }
  println("")

  // Significant genes
  println("=== Significant Genes (prob >= 0.3) ===")
  let sig = results.get_significant()
  println("Total: \{sig.length()}")
  let mut k = 0
  while k < sig.length() {
    let g = sig[k]
    let direction = if g.log2fc > 0.0 { "UP" } else { "DOWN" }
    println("  \{g.gene_id}: \{direction} log2FC=\{g.log2fc}, prob=\{g.prob}")
    k = k + 1
  }
  println("")

  // Up and down regulated
  println("=== Direction of Change ===")
  let up = results.get_up_regulated()
  let down = results.get_down_regulated()
  println("Up-regulated: \{up.length()}")
  println("Down-regulated: \{down.length()}")
  println("")

  // QC diagnostics
  println("=== QC Diagnostics ===")
  let all : Array[@bio.NOISeqSample] = Array(capacity=0)
  let mut ci = 0
  while ci < ctrl.length() {
    all.push(ctrl[ci])
    ci = ci + 1
  }
  let mut ti = 0
  while ti < trt.length() {
    all.push(trt[ti])
    ti = ti + 1
  }
  let qc = @bio.noiseq_qc(all)
  println("GC content: \{qc.gc_content}%")
  println("Bias detected: \{qc.bias_detected}")
  println("")

  // Normalization comparison
  println("=== Normalization Methods ===")
  let norm_none = @bio.noiseq_normalize(
    ctrl,
    norm_method=@bio.noiseq_norm_none(),
  )
  let norm_tmm = @bio.noiseq_normalize(ctrl, norm_method=@bio.noiseq_norm_tmm())
  let norm_uq = @bio.noiseq_normalize(
    ctrl,
    norm_method=@bio.noiseq_norm_upper(),
  )
  println("None: Gene1 = \{norm_none[0].get_count("Gene1")}")
  println("TMM: Gene1 = \{norm_tmm[0].get_count("Gene1")}")
  println("UpperQuartile: Gene1 = \{norm_uq[0].get_count("Gene1")}")
}