///|
/// Singscore gene set scoring demo.
/// Demonstrates rank-based single-sample gene set scoring.
fn main {
  println("=== Singscore Gene Set Scoring Demo ===")
  println("")

  // Create example data
  let (sample, spec) = @bio.singscore_create_example()

  println("Sample: \{sample.sample_id}")
  println("Genes: \{sample.gene_names.length().to_string()}")
  println("Gene set: \{spec.name}")
  println("  Up-regulated: \{spec.up_genes.length().to_string()} genes")
  println("  Down-regulated: \{spec.down_genes.length().to_string()} genes")

  // Score the sample
  let result = @bio.singscore_score(sample, spec, sample.sample_id)

  println("")
  println("Results:")
  println("  Sample: \{result.sample_id}")
  println("  Score: \{result.score.to_string()}")
  println("  Up score: \{result.up_score.to_string()}")
  println("  Down score: \{result.down_score.to_string()}")
  println("  Up dispersion: \{result.up_dispersion.to_string()}")
  println("  Down dispersion: \{result.down_dispersion.to_string()}")
  println("  Genes found (up): \{result.n_up_found.to_string()}")
  println("  Genes found (down): \{result.n_down_found.to_string()}")

  // Create multiple samples with different expression patterns
  println("")
  println("=== Multiple Sample Scoring ===")
  println("")

  let genes = sample.gene_names
  let n_genes = genes.length()
  let samples : Array[@bio.SampleExpression] = Array(capacity=0)

  // Activated immune cell (high expression)
  {
    let expr : Array[Double] = Array::make(n_genes, 5.0)
    samples.push(@bio.SampleExpression::new("activated", genes, expr))
  }

  // Resting cell (low expression)
  {
    let expr : Array[Double] = Array::make(n_genes, 0.5)
    samples.push(@bio.SampleExpression::new("resting", genes, expr))
  }

  // Mixed expression
  {
    let expr : Array[Double] = Array::make(n_genes, 2.0)
    samples.push(@bio.SampleExpression::new("mixed", genes, expr))
  }

  // Score each sample
  for s in samples {
    let r = @bio.singscore_score(s, spec, s.sample_id)
    println(
      "  \{r.sample_id}: score=\{r.score.to_string()}, up=\{r.up_score.to_string()}, down=\{r.down_score.to_string()}",
    )
  }

  println("")
  println("Done!")
}