///|
/// Mauve Genome Alignment Demo.
/// Demonstrates parsing Mauve alignments, detecting inversions
/// and breakpoints, computing coverage, and exporting results.
fn main {
  println("=== Mauve Genome Alignment Demo ===\n")

  println("1. Parsing Mauve alignment data...")
  let mauve_content = "##mauve version=1.0\n\n" +
    "a score=100\n" +
    "s\thuman.chr1\t0\t500\t+\t250000000\n" +
    "s\tmouse.chr1\t0\t480\t+\t240000000\n" +
    "s\trat.chr1\t0\t450\t+\t230000000\n\n" +
    "a score=80\n" +
    "s\thuman.chr1\t1000\t300\t-\t250000000\n" +
    "s\tmouse.chr1\t1200\t280\t-\t240000000\n" +
    "s\trat.chr1\t1100\t260\t-\t230000000\n\n" +
    "a score=60\n" +
    "s\thuman.chr1\t5000\t400\t+\t250000000\n" +
    "s\tmouse.chr1\t5200\t380\t+\t240000000\n" +
    "s\trat.chr1\t5100\t360\t+\t230000000\n\n"
  let ali = @src.parse_mauve(mauve_content)
  println("   Version: \{ali.version}")
  println("   Number of LCBs: \{@src.mauve_num_lcbs(ali)}")
  let all_names = @src.mauve_all_seq_names(ali)
  println("   Genomes: \{Repr(all_names)}")

  println("\n2. Detecting inversions...")
  let inv_count = ali.inversions.length()
  println("   Detected inversions: \{inv_count}")
  let mut i = 0
  while i < ali.inversions.length() {
    let inv = ali.inversions[i]
    println(
      "   Inversion \{i}: \{inv.seq_name} \{inv.start}-\{inv.end} (\{inv.length} bp)",
    )
    println("     Affected LCBs: \{Repr(inv.affected_lcbs)}")
    i = i + 1
  }

  println("\n3. Detecting breakpoints...")
  let bp_count = ali.breakpoints.length()
  println("   Detected breakpoints: \{bp_count}")
  let mut j = 0
  while j < ali.breakpoints.length() {
    let bp = ali.breakpoints[j]
    println(
      "   Breakpoint \{j}: \{bp.lcb1_id} -> \{bp.lcb2_id} at \{bp.seq_name}:\{bp.position} (\{bp.breakpoint_type})",
    )
    j = j + 1
  }

  println("\n4. Computing genome coverage...")
  let coverage = @src.mauve_genome_coverage(ali)
  let cov_keys = coverage.keys().collect()
  let mut k = 0
  while k < cov_keys.length() {
    let key = cov_keys[k]
    println("   \{key}: \{coverage[key]}% covered")
    k = k + 1
  }

  println("\n5. Generating summary report...")
  let summary = @src.mauve_summary(ali)
  println("\{summary}")

  println("6. BED format export...")
  let bed = @src.mauve_to_bed(ali)
  let bed_lines = bed.split("\n").to_array()
  println("   BED output lines: \{bed_lines.length()}")
  println("   First line: \{bed_lines[0]}")
  let inv_bed = @src.mauve_inversions_to_bed(ali)
  let inv_bed_lines = inv_bed.split("\n").to_array()
  println("   Inversions BED lines: \{inv_bed_lines.length()}")

  println("\n7. Filtering LCBs by score...")
  let filtered = @src.mauve_filter_lcbs(ali, 70.0)
  println("   Original LCBs: \{@src.mauve_num_lcbs(ali)}")
  println("   Filtered LCBs (score >= 70): \{@src.mauve_num_lcbs(filtered)}")

  println("\n8. Additional analyses...")
  let segments = @src.mauve_conserved_segments(ali)
  let seg_keys = segments.keys().collect()
  let mut m = 0
  while m < seg_keys.length() {
    let key = seg_keys[m]
    println("   Conserved segments for \{key}: \{segments[key]}")
    m = m + 1
  }
  let rate = @src.mauve_rearrangement_rate(ali)
  println("   Rearrangement rate: \{rate} breakpoints/Mb")

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