///|
/// Gviz module example - Genome visualization track system.
///
/// Run: moon run examples/gviz_demo
fn main {
  println("=== Gviz Module Demo ===")
  println("Genome Visualization Track System")
  println("")

  // Create a plot
  println("=== Creating Genome Plot ===")
  let region = @bio.gviz_region("chr1", 1000, 5000)
  let plot = @bio.gviz_plot(region, title="BRCA1 Locus", width=80, height=25)
  println("Region: chr1:1000-5000")
  println("")

  // Add axis track
  println("=== Adding Axis Track ===")
  let axis = @bio.gviz_track(
    "axis",
    @bio.track_type_genome_axis(),
    "chr1",
    1000,
    5000,
  )
  axis.set_label("Position")
  plot.add_track(axis)
  println("Added GenomeAxisTrack")
  println("")

  // Add gene annotation track
  println("=== Adding Gene Annotation Track ===")
  let genes = @bio.gviz_track(
    "genes",
    @bio.track_type_gene_region(),
    "chr1",
    1000,
    5000,
  )
  genes.set_label("Gene Annotations")
  genes.set_color("blue")
  genes.add_feature(
    @bio.gviz_feature(
      "g1",
      "chr1",
      1200,
      1800,
      @bio.track_strand_forward(),
      "exon",
      "BRCA1",
    ),
  )
  genes.add_feature(
    @bio.gviz_feature(
      "g2",
      "chr1",
      2000,
      3500,
      @bio.track_strand_reverse(),
      "exon",
      "TP53",
    ),
  )
  genes.add_feature(
    @bio.gviz_feature(
      "g3",
      "chr1",
      4000,
      4500,
      @bio.track_strand_forward(),
      "exon",
      "EGFR",
    ),
  )
  plot.add_track(genes)
  println("Added GeneRegionTrack with 3 features")
  println("")

  // Add data track
  println("=== Adding Coverage Data Track ===")
  let coverage = @bio.gviz_track(
    "coverage",
    @bio.track_type_data(),
    "chr1",
    1000,
    5000,
  )
  coverage.set_label("Read Coverage")
  coverage.set_color("red")
  let mut i = 0
  while i < 40 {
    let pos = 1000 + i * 100
    let val = 10.0 + @math.sin(i.to_double() * 0.5) * 5.0 + i.to_double() * 0.3
    coverage.add_data_point(pos, val)
    i = i + 1
  }
  plot.add_track(coverage)
  println("Added DataTrack with \{coverage.get_n_data_points()} data points")
  println("")

  // Add ideogram track
  println("=== Adding Ideogram Track ===")
  let ideo = @bio.gviz_track(
    "ideogram",
    @bio.gviz_track_type_ideogram(),
    "chr1",
    1000,
    5000,
  )
  ideo.set_label("Cytoband")
  plot.add_track(ideo)
  println("Added IdeogramTrack")
  println("")

  // Print summary
  println("=== Plot Summary ===")
  println(plot.summary())
  println("")

  // Render as ASCII
  println("=== ASCII Visualization ===")
  println(plot.to_ascii())
  println("")

  // Query features in a region
  println("=== Query Features in Region 1500-3000 ===")
  let features_in_region = genes.get_features_in_region(1500, 3000)
  println("Features found: \{features_in_region.length()}")
  let mut j = 0
  while j < features_in_region.length() {
    let f = features_in_region[j]
    println(
      "  \{f.label}: \{f.chromosome}:\{f.start}-\{f.end_} (\{f.strand.to_string()})",
    )
    j = j + 1
  }
  println("")

  // Use sample plot
  println("=== Sample Plot ===")
  let sample_plot = @bio.gviz_sample_plot()
  println(sample_plot.summary())
}