// Bioconductor lisaClust-inspired local spatial association and region discovery.

///|
fn main {
  let cells = @src.lisaclust_example_data()
  let config = @src.LisaConfig::create(
    radii=[2.5, 5.0],
    curve_kind=@src.lisa_k_curve(),
    window_kind=@src.lisa_rectangle_window(),
    bandwidth=4.0,
    min_density=0.05,
    edge_correction=true,
    window_padding=0.1,
    edge_samples=96,
    n_clusters=2,
    n_starts=8,
    seed=11,
  ) catch {
    LisaError(message) => abort("invalid lisaClust configuration: " + message)
  }
  let result = @src.lisaclust(cells, config~) catch {
    LisaError(message) => abort("lisaClust analysis failed: " + message)
  }

  println("=== Direct lisaClust analysis ===")
  println(result.summary())
  println(
    "iterations=" +
    result.iterations.to_string() +
    ", converged=" +
    result.converged.to_string(),
  )
  for image_radii in result.curves.effective_radii {
    println(
      image_radii.image_id + " effective radii: " + repr(image_radii.radii),
    )
  }

  println("\n=== Region summaries ===")
  println("region\tsize\tdominant cell type\tmaximum enrichment")
  for summary in result.region_summaries {
    println(
      summary.region +
      "\t" +
      summary.size.to_string() +
      "\t" +
      summary.dominant_cell_type +
      "\t" +
      summary.maximum_enrichment.to_string(),
    )
  }

  let top = result.top_enrichments(limit=6, minimum_relative_frequency=1.0) catch {
    LisaError(message) => abort("enrichment ranking failed: " + message)
  }
  println("\n=== Top observed/expected enrichments ===")
  println("region\tcell type\tobserved\texpected\tratio")
  for entry in top {
    println(
      entry.region +
      "\t" +
      entry.cell_type +
      "\t" +
      entry.observed.to_string() +
      "\t" +
      entry.expected.to_string() +
      "\t" +
      entry.relative_frequency.to_string(),
    )
  }

  let l_config = @src.LisaConfig::create(
    radii=[2.5, 5.0],
    curve_kind=@src.lisa_l_curve(),
    window_kind=@src.lisa_rectangle_window(),
    bandwidth=4.0,
    min_density=0.05,
    edge_correction=true,
    window_padding=0.1,
    edge_samples=96,
  ) catch {
    LisaError(message) => abort("invalid local-L configuration: " + message)
  }
  let l_curves = @src.lisa_curves(cells, config=l_config) catch {
    LisaError(message) => abort("local-L curve computation failed: " + message)
  }
  println("\n=== Centered local-L curve for the first cell ===")
  println("cell=" + l_curves.cell_ids[0])
  for feature in 0..
      abort("lisaClust SpatialExperiment integration failed: " + message)
  }
  println("\n=== SpatialExperiment integration ===")
  println(
    "cells=" +
    integrated.experiment.metadata["lisaclust_cells"] +
    ", features=" +
    integrated.experiment.metadata["lisaclust_features"] +
    ", regions=" +
    integrated.experiment.metadata["lisaclust_regions"],
  )
  println(
    "first assigned tissueRegion=" +
    integrated.experiment.col_data[0]["tissueRegion"] +
    ", original unchanged=" +
    (!experiment.col_data[0].contains("tissueRegion")).to_string(),
  )
}