///|
/// CNVkit Demo - Copy Number Variation Detection.
/// Inspired by Bioconductor CNVkit package.

///|
fn main {
  println("=== CNVkit Copy Number Variation Demo ===")
  println("Inspired by Bioconductor CNVkit package")
  println("")

  println("1. Creating example CNV dataset...")
  let dataset = @src.create_example_cnv_dataset()
  println("   Total probes: \{dataset.count_probes().to_string()}")
  println("   Chromosomes: \{dataset.chromosomes.length().to_string()}")
  println("")

  println("2. CBS segmentation analysis...")
  let segments : Array[@src.CNVSegment] = Array(capacity=0)
  let probes = dataset.probes
  let n = probes.length()

  // Perform CBS on each chromosome
  let chromosomes = dataset.chromosomes
  let mut i = 0
  while i < chromosomes.length() {
    let chrom = chromosomes[i]
    let chrom_probes : Array[@src.CNVProbe] = Array(capacity=0)

    let mut j = 0
    while j < n {
      if probes[j].chromosome == chrom {
        chrom_probes.push(probes[j])
      }
      j = j + 1
    }

    if chrom_probes.length() >= 3 {
      let result = @src.cbs_segment(chrom_probes, 0.05)
      let segs = result.segments

      let mut k = 0
      while k < segs.length() {
        segments.push(segs[k])
        k = k + 1
      }
    }
    i = i + 1
  }

  println("   Segments found: \{segments.length().to_string()}")
  println("")

  println("3. Segment details:")
  let mut seg_i = 0
  while seg_i < segments.length() {
    let seg = segments[seg_i]
    println(
      "   Segment \{seg_i.to_string()}: \{seg.chromosome}:\{seg.start.to_string()}-\{seg.end.to_string()} (\{seg.probes.to_string()} probes, mean log2 = \{seg.mean_log2.to_string()}, state = \{seg.state})",
    )
    seg_i = seg_i + 1
  }
  println("")

  println("4. Copy number state calling...")
  let calls = @src.call_copy_numbers(segments, 2)
  let mut del_count = 0
  let mut amp_count = 0
  let mut neu_count = 0
  let mut c = 0
  while c < calls.length() {
    if calls[c].state == "deletion" {
      del_count = del_count + 1
    } else if calls[c].state == "amplification" {
      amp_count = amp_count + 1
    } else {
      neu_count = neu_count + 1
    }
    c = c + 1
  }
  println("   Deletions: \{del_count.to_string()}")
  println("   Amplifications: \{amp_count.to_string()}")
  println("   Neutral: \{neu_count.to_string()}")
  println("")

  println("5. Log2 ratio smoothing...")
  let smoothed = @src.smooth_log2_ratios(probes, 5)
  println("   Smoothed probes: \{smoothed.length().to_string()}")
  println("")

  println("6. Breakpoint detection...")
  let breakpoints = @src.detect_breakpoints(segments, 0.3)
  println("   Breakpoints detected: \{breakpoints.length().to_string()}")
  println("")

  println("7. Dataset summary:")
  let summary_str = @src.cbs_summarize_dataset(dataset)
  println("   \{summary_str}")

  println("=== CNVkit demo completed ===")
}