///|
/// bsseq Demo.
fn main {
  println("=== bsseq Demo ===")

  // 1. Create example BS data
  println("\n1. Create example BS data:")
  let bsdata = @src.bsseq_create_example_bsdata()
  println(bsdata.to_string())

  // 2. Demonstrate methylation rate calculation
  println("\n2. Methylation Rate Calculation:")
  let rate = @src.bsseq_get_methylation_rate(8, 2)
  println("  rate(meth=8, unmeth=2) = " + rate.to_string())

  // 3. Demonstrate coverage retrieval
  println("\n3. Coverage retrieval:")
  let coverage = @src.bsseq_get_coverage(bsdata)
  println("  Coverage array length: " + coverage.length().to_string())
  let mut i = 0
  while i < coverage.length() && i < 5 {
    println("    [" + i.to_string() + "] " + coverage[i].to_string())
    i = i + 1
  }

  // 4. Demonstrate methylation proportion retrieval
  println("\n4. Methylation proportion retrieval:")
  let methylation = @src.bsseq_get_methylation(bsdata)
  println("  Methylation array length: " + methylation.length().to_string())
  let mut j = 0
  while j < methylation.length() && j < 5 {
    println("    [" + j.to_string() + "] " + methylation[j].to_string())
    j = j + 1
  }

  // 5. Demonstrate coverage filtering
  println("\n5. Filter by coverage (5..15):")
  let filtered_cov = @src.bsseq_filter_by_coverage(bsdata, 5, 15)
  println(
    "  Records before: " +
    bsdata.n_records().to_string() +
    ", after: " +
    filtered_cov.n_records().to_string(),
  )

  // 6. Demonstrate context filtering (CpG / CHG / CHH)
  println("\n6. Filter by context:")
  let cpg_data = @src.bsseq_filter_by_context(bsdata, "CpG")
  let chg_data = @src.bsseq_filter_by_context(bsdata, "CHG")
  let chh_data = @src.bsseq_filter_by_context(bsdata, "CHH")
  println("  CpG records: " + cpg_data.n_records().to_string())
  println("  CHG records: " + chg_data.n_records().to_string())
  println("  CHH records: " + chh_data.n_records().to_string())

  // 7. Demonstrate methylation smoothing
  println("\n7. Smooth methylation (window=2):")
  let meth_arr : Array[Int32] = [8, 9, 5, 3, 7, 6, 4, 2, 8, 9]
  let cov_arr : Array[Int32] = [10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
  let smoothed = @src.bsseq_smooth_methylation(meth_arr, cov_arr, 2)
  println("  Smoothed values: " + smoothed.length().to_string())
  let mut k = 0
  while k < smoothed.length() && k < 5 {
    println("    [" + k.to_string() + "] " + smoothed[k].to_string())
    k = k + 1
  }

  // 8. Demonstrate BSmooth algorithm
  println("\n8. BSmooth algorithm (window=3):")
  let bsmooth_result = @src.bsseq_bsmooth(bsdata, 3)
  println(bsmooth_result.to_string())

  // 9. Demonstrate t-statistic computation
  println("\n9. Compute t-statistics:")
  let group1 : Array[Double] = [
    0.8, 0.9, 0.5, 0.3, 0.7, 0.6, 0.4, 0.2, 0.8, 0.9,
  ]
  let group2 : Array[Double] = [
    0.4, 0.3, 0.5, 0.8, 0.7, 0.2, 0.1, 0.9, 0.5, 0.6,
  ]
  let tstat = @src.bsseq_compute_tstat(group1, group2)
  println(tstat.to_string())

  // 10. Demonstrate DMR detection
  println("\n10. Find DMRs:")
  let positions : Array[Int32] = [
    1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700, 1800, 1900,
  ]
  let dmr_result = @src.bsseq_find_dmr(tstat, positions, "chr1", 1.5, 500)
  println(dmr_result.to_string())

  // 11. Demonstrate hyper / hypo methylated regions
  println("\n11. Hyper / Hypo methylated regions:")
  let hyper = @src.bsseq_find_hyper_dmr(dmr_result)
  let hypo = @src.bsseq_find_hypo_dmr(dmr_result)
  println("  Hyper DMRs: " + hyper.length().to_string())
  println("  Hypo DMRs: " + hypo.length().to_string())
  let mut h = 0
  while h < hyper.length() {
    println("    hyper: " + hyper[h].to_string())
    h = h + 1
  }
  let mut l = 0
  while l < hypo.length() {
    println("    hypo: " + hypo[l].to_string())
    l = l + 1
  }

  // 12. Demonstrate merging CpGs
  println("\n12. Merge CpGs (max_gap=150):")
  let records = @src.bsseq_create_example_records()
  let merged = @src.bsseq_merge_cpgs(records, 150)
  println(
    "  Records before: " +
    records.length().to_string() +
    ", after merge: " +
    merged.length().to_string(),
  )

  // 13. Demonstrate region methylation computation
  println("\n13. Region methylation:")
  let region_meth = @src.bsseq_region_methylation(bsdata, "chr1", 1000, 1500)
  println("  Mean methylation in chr1:1000-1500 = " + region_meth.to_string())

  // 14. Demonstrate normalization
  println("\n14. Normalize (global):")
  let normalized = @src.bsseq_normalize(bsdata, "global")
  println("  Normalized records: " + normalized.n_records().to_string())
  let norm_none = @src.bsseq_normalize(bsdata, "none")
  println("  Normalize 'none' records: " + norm_none.n_records().to_string())

  // 15. Demonstrate combining samples
  println("\n15. Combine samples:")
  let cov_matrix = @src.bsseq_create_example_cov_matrix()
  println(cov_matrix.to_string())

  // 16. Demonstrate BSRecord creation
  println("\n16. BSRecord creation:")
  let rec = @src.BSRecord::new("chr2", 5000, "+", 12, 3)
  println("  " + rec.to_string())
  println("  coverage=" + rec.coverage().to_string())
  println("  rate=" + rec.rate().to_string())

  // 17. Demonstrate methylation diff and data summary
  println("\n17. Methylation diff and summary:")
  let diff = @src.bsseq_compute_methylation_diff(0.85, 0.42)
  println("  diff(0.85, 0.42) = " + diff.to_string())
  println(@src.bsseq_summary(bsdata))

  println("\nbsseq demo completed!")
}