///|
/// muscat module example - Differential state analysis for single-cell RNA-seq.
///
/// Run: moon run examples/muscat_demo
fn main {
  println("=== muscat Module Demo ===")
  println("Differential State Analysis for Single-Cell RNA-seq")
  println("")

  // Generate sample single-cell data
  println("=== Sample Data ===")
  let cells = @bio.muscat_sample_data()
  println("Total single cells: \{cells.length()}")
  let mut n_ctrl = 0
  let mut n_stim = 0
  let mut i = 0
  while i < cells.length() {
    if cells[i].group_id == "ctrl" {
      n_ctrl = n_ctrl + 1
    } else {
      n_stim = n_stim + 1
    }
    i = i + 1
  }
  println("  Control cells: \{n_ctrl}")
  println("  Stimulation cells: \{n_stim}")
  println("")

  // Aggregate cells to pseudo-bulk
  println("=== Pseudo-bulk Aggregation (Sum) ===")
  let pb = @bio.aggregate_cells(cells, method_=@bio.aggregation_sum())
  println("Pseudo-bulk samples: \{pb.length()}")
  let mut j = 0
  while j < pb.length() {
    println(
      "  Sample: \{pb[j].sample_id}, Cluster: \{pb[j].cluster_id}, Group: \{pb[j].group_id}, Cells: \{pb[j].n_cells}",
    )
    j = j + 1
  }
  println("")

  // QC summary
  println("=== QC Summary ===")
  let qc = @bio.compute_qc(pb)
  let mut k = 0
  while k < qc.length() {
    println(
      "  \{qc[k].sample_id}/\{qc[k].cluster_id}: \{qc[k].n_cells} cells, \{qc[k].n_genes} genes, \{qc[k].total_counts} total counts",
    )
    k = k + 1
  }
  println("")

  // Run DS analysis
  println("=== Differential State Analysis ===")
  let results = @bio.run_ds_analysis(
    pb,
    method_=@bio.ds_method_edger(),
    fdr_threshold=0.1,
    log2fc_threshold=0.5,
  )
  println(results.summary())
  println("")

  // Top differentially expressed genes
  println("=== Top 5 DE Genes ===")
  let top = results.get_top_genes(5)
  let mut m = 0
  while m < top.length() {
    let g = top[m]
    println(
      "  \{g.gene_id} [\{g.cluster_id}]: log2FC=\{g.log2fc}, p_adj=\{g.p_adj}, sig=\{g.significant}",
    )
    m = m + 1
  }
  println("")

  // Significant results
  println("=== Significant Results ===")
  let sig = results.get_significant()
  println("Total significant genes: \{sig.length()}")
  println("")

  // Aggregation methods comparison
  println("=== Aggregation Methods ===")
  let pb_mean = @bio.aggregate_cells(cells, method_=@bio.aggregation_mean())
  let pb_med = @bio.aggregate_cells(cells, method_=@bio.aggregation_median())
  println("Sum aggregation: \{pb.length()} samples")
  println("Mean aggregation: \{pb_mean.length()} samples")
  println("Median aggregation: \{pb_med.length()} samples")
}