///|
/// nucleR Demo - Nucleosome Positioning Analysis.
/// Inspired by Bioconductor nucleR package.
fn main {
  println("=== nucleR Demo ===")

  // 1. Create example track
  println("")
  println("1. Create example signal track:")
  let track = @bio.nuc_create_example_track()
  println("   Chromosome: " + track.nuc_get_chrom())
  println("   Length: " + track.nuc_get_length().to_string())
  println("   Signal values (first 10):")
  let mut i = 0
  while i < 10 {
    let pos = track.nuc_get_position(i)
    let val = track.nuc_get_signal(pos)
    println("     pos=" + pos.to_string() + ", signal=" + val.to_string())
    i = i + 1
  }

  // 2. Smooth signal
  println("")
  println("2. Smooth signal (window=100):")
  let smoothed = @bio.nuc_smooth_signal(track, 100)
  println("   Smoothed signal (first 10):")
  let mut j = 0
  while j < 10 {
    let pos = smoothed.nuc_get_position(j)
    let val = smoothed.nuc_get_signal(pos)
    println("     pos=" + pos.to_string() + ", signal=" + val.to_string())
    j = j + 1
  }

  // 3. Call nucleosomes with custom params
  println("")
  println("3. Call nucleosomes (peak_threshold=0.1, min_distance=100):")
  let params = @bio.NucCallParams::new().nuc_set_peak_threshold(0.1)
  let result = @bio.nuc_call_nucleosomes(track, params)
  println("   Nucleosome count: " + result.nuc_n_count().to_string())
  println("   Mean spacing: " + result.nuc_mean_spacing().to_string())
  println("   Mean occupancy: " + result.nuc_mean_occupancy().to_string())
  println(
    "   Fraction well-positioned: " +
    result.nuc_frac_well_positioned().to_string(),
  )
  println("   Nucleosome details:")
  let mut k = 0
  while k < result.nuc_n_count() {
    let nuc = result.nuc_get(k)
    println(
      "     " +
      k.to_string() +
      ": center=" +
      nuc.nuc_center().to_string() +
      ", width=" +
      nuc.nuc_width().to_string() +
      ", occupancy=" +
      nuc.nuc_occupancy().to_string() +
      ", well_positioned=" +
      nuc.nuc_is_well_positioned().to_string(),
    )
    k = k + 1
  }

  // 4. Compare positioning between two identical tracks
  println("")
  println("4. Compare nucleosome positioning (tolerance=50):")
  let result1 = @bio.nuc_call_nucleosomes(track, params)
  let result2 = @bio.nuc_call_nucleosomes(track, params)
  let comparison = @bio.nuc_compare_positioning(result1, result2, 50)
  println("   Shared: " + comparison.nuc_n_shared().to_string())
  println("   Gained: " + comparison.nuc_n_gained().to_string())
  println("   Lost: " + comparison.nuc_n_lost().to_string())
  println("   Fraction changed: " + comparison.nuc_frac_changed().to_string())
  println("   Direction: " + comparison.nuc_direction().to_string())

  println("")
  println("=== nucleR Demo Completed ===")
}