///|
/// methylSeekR Demo.
/// Demonstrates identifying methylation regimes (UMR / LMR / PMD / FMR)
/// from whole-genome bisulfite sequencing data.
fn main {
  println("=== methylSeekR Demo ===")

  // 1. Load sample cytosine sites.
  println("\n1. Load sample cytosine sites:")
  let sites = @bio.methyl_seekr_sample_data()
  println("  Loaded " + sites.length().to_string() + " cytosine sites")
  println("  First site: " + @bio.CytosineSite::to_string(sites[0]))
  println(
    "  Last site:  " + @bio.CytosineSite::to_string(sites[sites.length() - 1]),
  )

  // 2. Configure pipeline parameters.
  println("\n2. Pipeline parameters (defaults):")
  let params = @bio.MethylSeekRParams::default()
  println(
    "  tile_size=" + @bio.MethylSeekRParams::tile_size(params).to_string(),
  )
  println(
    "  min_coverage=" + @bio.MethylSeekRParams::min_coverage(params).to_string(),
  )
  println("  alpha=" + @bio.MethylSeekRParams::alpha(params).to_string())
  println("  beta=" + @bio.MethylSeekRParams::beta(params).to_string())
  println("  gamma=" + @bio.MethylSeekRParams::gamma(params).to_string())
  println(
    "  min_region_size=" +
    @bio.MethylSeekRParams::min_region_size(params).to_string(),
  )
  println(
    "  pmd_window=" + @bio.MethylSeekRParams::pmd_window(params).to_string(),
  )

  // 3. Tile the genome and compute per-tile methylation.
  println("\n3. Tile the genome:")
  let tiles = @bio.tile_methylation(sites, params)
  println("  Produced " + tiles.length().to_string() + " tiles")
  let mut ti = 0
  while ti < tiles.length() && ti < 5 {
    println("    " + @bio.MethylTile::to_string(tiles[ti]))
    ti = ti + 1
  }
  if tiles.length() > 5 {
    println("    ... and " + (tiles.length() - 5).to_string() + " more")
  }

  // 4. Classify tiles into UMR / LMR / FMR.
  println("\n4. Classify tiles:")
  let classified = @bio.classify_tiles(tiles, params)
  let mut n_umr = 0
  let mut n_lmr = 0
  let mut n_fmr = 0
  for t in classified {
    match @bio.MethylTile::region_type(t) {
      "UMR" => n_umr = n_umr + 1
      "LMR" => n_lmr = n_lmr + 1
      _ => n_fmr = n_fmr + 1
    }
  }
  println("  UMR tiles: " + n_umr.to_string())
  println("  LMR tiles: " + n_lmr.to_string())
  println("  FMR tiles: " + n_fmr.to_string())

  // 5. Detect Partially Methylated Domains.
  println("\n5. Detect PMDs:")
  let with_pmds = @bio.detect_pmds(classified, params)
  let mut n_pmd = 0
  for t in with_pmds {
    if @bio.MethylTile::region_type(t) == "PMD" {
      n_pmd = n_pmd + 1
    }
  }
  println("  PMD tiles: " + n_pmd.to_string())

  // 6. Run the full pipeline in one call.
  println("\n6. Full pipeline (call_methylation_regimes):")
  let regions = @bio.call_methylation_regimes(sites, params)
  println("  Detected " + regions.length().to_string() + " regions")
  for r in regions {
    println("    " + @bio.MethylRegion::to_string(r))
  }

  // 7. Display summary statistics.
  println("\n7. Region summary:")
  println(@bio.region_summary(regions))

  // 8. Filter UMRs.
  println("8. Filter UMR regions:")
  let umrs = @bio.filter_regions(regions, "UMR")
  println("  Found " + umrs.length().to_string() + " UMR region(s)")
  for r in umrs {
    println(
      "    " +
      @bio.MethylRegion::chr(r) +
      ":" +
      @bio.MethylRegion::start(r).to_string() +
      "-" +
      @bio.MethylRegion::end(r).to_string() +
      " (n_tiles=" +
      @bio.MethylRegion::n_tiles(r).to_string() +
      ", mean_meth=" +
      @bio.MethylRegion::mean_methylation(r).to_string() +
      ")",
    )
  }

  // 9. Filter PMDs.
  println("\n9. Filter PMD regions:")
  let pmds = @bio.filter_regions(regions, "PMD")
  println("  Found " + pmds.length().to_string() + " PMD region(s)")
  for r in pmds {
    println(
      "    " +
      @bio.MethylRegion::chr(r) +
      ":" +
      @bio.MethylRegion::start(r).to_string() +
      "-" +
      @bio.MethylRegion::end(r).to_string() +
      " (size=" +
      @bio.MethylRegion::size(r).to_string() +
      " bp, mean_meth=" +
      @bio.MethylRegion::mean_methylation(r).to_string() +
      ")",
    )
  }

  // 10. Demonstrate a single cytosine methylation level.
  println("\n10. Single-site methylation level:")
  let site = @bio.CytosineSite::new(
    chr="chr1",
    position=1000,
    methylated=8,
    unmethylated=2,
  )
  println("  " + @bio.CytosineSite::to_string(site))
  println("  methylation_level = " + @bio.methylation_level(site).to_string())

  println("\nmethylSeekR demo completed!")
}