///|
fn mast_demo_option(value : Double?) -> String {
  match value {
    Some(number) => number.to_string()
    None => "NA"
  }
}

///|
fn main {
  println("=== Bioconductor MAST 1.39.0 Advanced Demo ===")

  let (data, tested) = @src.mast_advanced_example() catch {
    _ => abort("failed to construct the MAST example")
  }
  println("\n1. Feature x cell model and treatment-coded design")
  println(
    "  genes=" +
    data.n_genes.to_string() +
    ", cells=" +
    data.n_cells.to_string() +
    ", coefficients=" +
    data.coefficient_names.join(", "),
  )
  println(
    "  tested coefficient=" +
    data.coefficient_names[tested[0]] +
    ", first-cell CDR=" +
    data.cdr[0].to_string(),
  )

  let config = @src.MastAdvancedConfig::create(
    empirical_bayes=true,
    ebayes_use_full_model=false,
    fdr_threshold=0.05,
  ) catch {
    _ => abort("failed to construct the MAST configuration")
  }
  let result = @src.mast_advanced_zlm(data, tested, config~) catch {
    _ => abort("advanced MAST zlm fit failed")
  }
  println("\n2. Bayesian logistic + positive Gaussian hurdle fit")
  println("  " + result.summary())
  println(
    "  eBayes prior variance=" +
    result.prior_variance.to_string() +
    ", prior df=" +
    result.prior_df.to_string(),
  )

  println("\n3. Component LRT, hurdle LRT, FDR and marginal logFC")
  for gene in 0.. abort("advanced MAST SingleCellExperiment fit failed")
  }
  println(
    "  original has mast39.hurdleFdr: " +
    experiment.row_data.contains("mast39.hurdleFdr").to_string(),
  )
  println(
    "  enriched row columns include hurdle FDR: " +
    output.experiment.row_data.contains("mast39.hurdleFdr").to_string(),
  )
  println(
    "  contrast metadata: " +
    output.experiment.metadata["mast39.contrast"] +
    ", tested genes=" +
    output.experiment.metadata["mast39.tested"],
  )

  println("\nMAST advanced demo completed.")
}