///|
/// scmap module demo - single-cell cell type annotation by reference projection.
///
/// Run: moon run examples/scmap_demo
fn main {
  println("=== scmap Module Demo ===")
  println("Single-cell RNA-seq cell type annotation")
  println("Reference: Kiselev VY et al. (2018) Nature Methods 15:359-362")
  println("")

  // ------------------------------------------------------------------
  // 1. Load reference atlas and query cells
  // ------------------------------------------------------------------
  println("=== 1. Load reference atlas and query data ===")
  let reference = @bio.scmap_sample_reference()
  println(
    "Reference: \{reference.gene_names().length()} genes, \{reference.cell_names().length()} cells",
  )
  println("Cell types: \{Repr(reference.unique_cell_types())}")
  let query = @bio.scmap_sample_query()
  println(
    "Query: \{query.gene_names().length()} genes, \{query.cell_names().length()} cells",
  )
  println("Query cells: \{Repr(query.cell_names())}")
  println("")

  // ------------------------------------------------------------------
  // 2. scmap-cluster: centroid-based correlation
  // ------------------------------------------------------------------
  println("=== 2. scmap-cluster (centroid correlation, threshold=0.7) ===")
  let cluster_assignments = @bio.scmap_cluster(reference, query, 0.7)
  for a in cluster_assignments {
    println(
      "  \{a.cell_name()} -> \{a.assigned_type()} (best_corr=\{a.best_correlation()})",
    )
  }
  println("")

  // ------------------------------------------------------------------
  // 3. scmap-cluster with stricter threshold
  // ------------------------------------------------------------------
  println("=== 3. scmap-cluster with strict threshold (0.95) ===")
  let strict_assignments = @bio.scmap_cluster(reference, query, 0.95)
  for a in strict_assignments {
    println(
      "  \{a.cell_name()} -> \{a.assigned_type()} (best_corr=\{a.best_correlation()})",
    )
  }
  println("")

  // ------------------------------------------------------------------
  // 4. scmap-cell: nearest-neighbour voting
  // ------------------------------------------------------------------
  println("=== 4. scmap-cell (k=5 neighbours, fraction=0.5) ===")
  let cell_assignments = @bio.scmap_cell(reference, query, 5, 0.5)
  for a in cell_assignments {
    println(
      "  \{a.cell_name()} -> \{a.assigned_type()} (best_corr=\{a.best_correlation()}, method=\{a.method_()})",
    )
  }
  println("")

  // ------------------------------------------------------------------
  // 5. Summary of cluster-based assignments
  // ------------------------------------------------------------------
  println("=== 5. Summary of cluster-based assignments ===")
  let summary = @bio.scmap_summary(cluster_assignments)
  for entry in summary {
    let (ctype, count) = entry
    println("  \{ctype}: \{count} cell(s)")
  }
  println("")

  // ------------------------------------------------------------------
  // 6. Full assignments table
  // ------------------------------------------------------------------
  println("=== 6. Full assignments table (cluster method) ===")
  println(@bio.scmap_assignments_to_string(cluster_assignments))

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