///|
/// plyranges_demo - Example demonstrating tidy genomic data manipulation
/// Inspired by Bioconductor plyranges package.

///|
fn main {
  println("=== plyranges Demo ===")
  println("Tidy genomic data manipulation inspired by Bioconductor plyranges")
  println("")

  // Create GRanges object
  let gr = @src.tgr_create(
    ["chr1", "chr1", "chr2", "chr2", "chr3"],
    [100, 500, 200, 800, 300],
    [200, 600, 300, 900, 400],
    ["+", "-", "+", "-", "+"],
  )
  println("Created GRanges with \{gr.seqnames.length()} ranges")

  // Filter by seqname
  let chr1_ranges = @src.tgr_filter_seqname(gr, "chr1")
  println("Filtered chr1 ranges: \{chr1_ranges.seqnames.length()} ranges")

  // Filter by strand
  let plus_strand = @src.tgr_filter_strand(gr, "+")
  println("Plus strand ranges: \{plus_strand.seqnames.length()} ranges")

  // Filter by start position
  let after_300 = @src.tgr_filter_start(gr, 300)
  println("Ranges starting after 300: \{after_300.seqnames.length()}")

  // Add metadata
  let with_gc = @src.tgr_mutate(gr, "gc_content", [0.45, 0.62, 0.38, 0.71, 0.52])
  println("Added gc_content metadata")

  let with_gene = @src.tgr_mutate_str(with_gc, "gene_name", [
    "BRCA1", "TP53", "EGFR", "MYC", "KRAS",
  ])
  println("Added gene_name metadata")

  // Arrange by start position
  let arranged = @src.tgr_arrange(with_gene)
  println("Arranged by start position")
  println(
    "First start: \{arranged.starts[0]}, Last start: \{arranged.starts[arranged.starts.length() - 1]}",
  )

  // Select columns
  let selected = @src.tgr_select(arranged, ["gc_content", "gene_name"])
  println("Selected metadata columns")

  // Rename
  let _renamed = @src.tgr_rename(selected, "gc_content", "GC")
  println("Renamed gc_content to GC")

  // Summary
  let summary = @src.tgr_summary(gr)
  println("")
  println("Summary:")
  println("  Ranges: \{summary.n_ranges}")
  println("  Seqnames: \{summary.n_seqnames}")
  println("  Total bases: \{summary.total_bases}")
  println("  Mean width: \{summary.mean_width}")

  println("")
  println("=== plyranges Demo Complete ===")
}