///|
fn single_r_demo_optional_label(value : String?) -> String {
  match value {
    Some(label) => label
    None => "NA"
  }
}

///|
fn main {
  println("=== Bioconductor SingleR 2.15.2 Advanced Demo ===")
  let (reference, data) = @bio.single_r_advanced_example() catch {
    _ => abort("failed to construct the SingleR example")
  }
  println(
    "\n1. Gene x sample/cell inputs: reference=" +
    reference.n_genes.to_string() +
    "x" +
    reference.n_samples.to_string() +
    ", test=" +
    data.n_genes.to_string() +
    "x" +
    data.n_cells.to_string(),
  )

  let training = @bio.single_r_advanced_train(reference, data.gene_names) catch {
    _ => abort("SingleR marker training failed")
  }
  let t_vs_b = training.markers_between("T cell", "B cell") catch {
    _ => abort("failed to query pairwise markers")
  }
  println("\n2. Directed classic marker training")
  println(
    "  shared genes=" +
    training.common_gene_names.length().to_string() +
    ", selected markers=" +
    training.marker_gene_names().length().to_string(),
  )
  println("  T cell > B cell markers: " + t_vs_b.join(", "))

  let config = @bio.SingleRAdvancedConfig::create(
    quantile=0.8,
    fine_tune=true,
    prune=true,
    nmads=3.0,
  ) catch {
    _ => abort("failed to construct the SingleR configuration")
  }
  let result = @bio.single_r_advanced_classify(data, training, config~) catch {
    _ => abort("SingleR cell annotation failed")
  }
  println("\n3. Quantile scores, iterative fine-tuning and pruning")
  for cell in 0.. abort("SingleR cluster annotation failed")
  }
  println("\n4. Cluster-level annotation from summed profiles")
  for cluster in 0.. abort("failed to construct the second reference")
  }
  let combined = @bio.single_r_advanced_combine(
    data,
    [reference, alternate],
    config~,
  ) catch {
    _ => abort("SingleR multi-reference integration failed")
  }
  println("\n5. Multi-reference marker-space recomputation")
  for cell in 0.. abort("SingleR SingleCellExperiment integration failed")
  }
  println("\n6. Immutable SingleCellExperiment write-back")
  println(
    "  mode=" +
    output.experiment.metadata["SingleR215.mode"] +
    ", labels=" +
    output.experiment.col_data["SingleR215.labels"].join(", "),
  )
  println(
    "  original unchanged=" +
    (!experiment.col_data.contains("SingleR215.labels")).to_string(),
  )
  println("\nSingleR advanced demo completed.")
}