///|
/// Demo for xcms_peaks module: xcms-style chromatographic peak detection.
fn main {
  println("=== xcms_peaks Demo: Chromatographic Peak Detection ===")
  println("")

  // Example 1: Create a chromatogram with Gaussian peaks
  println("--- Step 1: Create Chromatogram ---")
  let rt : Array[Double] = Array::make(100, 0.0)
  let intensity : Array[Double] = Array::make(100, 0.0)
  for i in 0..<100 {
    rt[i] = i.to_double()
    // Two Gaussian peaks at 25 and 70
    let x1 = (i - 25).to_double()
    let x2 = (i - 70).to_double()
    let peak1 = 100.0 * @math.exp(-0.5 * x1 * x1 / 9.0)
    let peak2 = 80.0 * @math.exp(-0.5 * x2 * x2 / 4.0)
    intensity[i] = peak1 + peak2 + 1.0 // + baseline
  }
  let chrom = @src.xcp_chrom_new(rt, intensity, label="test")
  println("Chromatogram: " + rt.length().to_string() + " points")
  println("")

  // Example 2: Noise and SNR
  println("--- Step 2: Noise Estimation ---")
  let noise = @src.xcp_noise_mad(intensity)
  let snr = @src.xcp_snr(intensity)
  println("Noise (MAD): " + noise.to_string())
  println("SNR: " + snr.to_string())
  println("")

  // Example 3: centWave peak detection
  println("--- Step 3: centWave Peak Detection ---")
  let peaks = @src.xcp_centwave(chrom, snr_threshold=3.0)
  println("Peaks found: " + peaks.length().to_string())
  for p in peaks {
    println(
      "  rt=" +
      p.rt.to_string() +
      " intensity=" +
      p.intensity.to_string() +
      " snr=" +
      p.snr.to_string() +
      " fwhm=" +
      p.fwhm.to_string(),
    )
  }
  println("")

  // Example 4: matchedFilter peak detection
  println("--- Step 4: matchedFilter Peak Detection ---")
  let peaks_mf = @src.xcp_matched_filter(
    chrom,
    window_size=5,
    snr_threshold=3.0,
  )
  println("Peaks found: " + peaks_mf.length().to_string())
  for p in peaks_mf {
    println(
      "  rt=" +
      p.rt.to_string() +
      " intensity=" +
      p.intensity.to_string() +
      " snr=" +
      p.snr.to_string(),
    )
  }
  println("")

  // Example 5: ASCII plot
  println("--- Step 5: ASCII Plot ---")
  let plot = @src.xcp_ascii_plot(chrom, peaks, width=50, height=10)
  println(plot)

  // Example 6: Export peaks
  println("--- Step 6: Export Peaks ---")
  let tsv = @src.xcp_export_peaks(peaks)
  println(tsv)
  println("")

  // Example 7: TIC statistics
  println("--- Step 7: TIC Statistics ---")
  let (total, mx, mean) = @src.xcp_tic_stats(intensity)
  println("Total intensity: " + total.to_string())
  println("Max intensity: " + mx.to_string())
  println("Mean intensity: " + mean.to_string())
}