///|
/// csaw ChIP-seq Differential Binding Analysis Demo.
fn main {
  println("=== csaw ChIP-seq Differential Binding Analysis Demo ===\n")

  // Create windows with pre-assigned counts for multiple samples
  println("1. Creating windows with counts...")
  let windows = [
    @src.CswWindow::new("win_1", "chr1", 1000, 2000, [5.0, 10.0]),
    @src.CswWindow::new("win_2", "chr1", 2000, 3000, [15.0, 20.0]),
    @src.CswWindow::new("win_3", "chr1", 3000, 4000, [25.0, 50.0]),
    @src.CswWindow::new("win_4", "chr1", 4000, 5000, [8.0, 12.0]),
    @src.CswWindow::new("win_5", "chr1", 5000, 6000, [30.0, 45.0]),
    @src.CswWindow::new("win_6", "chr1", 6000, 7000, [12.0, 18.0]),
    @src.CswWindow::new("win_7", "chr1", 7000, 8000, [20.0, 35.0]),
    @src.CswWindow::new("win_8", "chr1", 8000, 9000, [3.0, 5.0]),
    @src.CswWindow::new("win_9", "chr1", 9000, 10000, [40.0, 60.0]),
  ]
  println("   Created \{windows.length()} windows with 2 samples each")

  // Create dataset
  println("\n2. Creating CswDataSet...")
  let samples = ["control", "treatment"]
  let lib_sizes = [5000.0, 6000.0]
  let data = @src.CswDataSet::new(windows, samples, lib_sizes)
  println(
    "   Windows: \{data.csw_n_windows()}, Samples: \{data.csw_n_samples()}",
  )

  // Library size normalization
  println("\n3. Library size normalization...")
  let norm_factors = @src.csw_norm_library(lib_sizes)
  let norm_data = @src.csw_apply_normalization(data, norm_factors)
  println("   Applied normalization factors")

  // Filtering
  println("\n4. Filtering low-abundance windows...")
  let filtered = @src.csw_filter_abundance(norm_data, 1.0)
  println("   Windows after filtering: \{filtered.csw_n_windows()}")

  // Differential binding test
  println("\n5. Differential binding testing (control vs treatment)...")
  let result = @src.csw_test_differential(filtered, [0], [1], 0.1)
  println("   Tested \{result.log_fc.length()} windows")
  println(
    "   Significant windows (adj-p < 0.05): \{result.significant.filter(fn(x) { x }).length()}",
  )

  // Find regions
  println("\n6. Finding differential regions...")
  let regions = @src.csw_find_regions(filtered, result, 1000)
  println("   Found \{regions.length()} differential regions")

  // Print results
  println("\n7. Summary of top results:")
  let mut i = 0
  while i < result.log_fc.length() && i < 5 {
    let logfc = result.log_fc[i].to_string()
    let pval = result.p_values[i].to_string()
    let adjp = result.adj_p_values[i].to_string()
    println("   Window \{i}: logFC=\{logfc}, p-val=\{pval}, adj-p=\{adjp}")
    i = i + 1
  }

  println("\n=== csaw Demo Complete ===")
}