///|
/// GFA module demo - Graph Fragment Assembly format parser and writer.
///
/// Run: moon run examples/gfa_demo
fn main {
  println("=== GFA Module Demo ===")
  println("Graph Fragment Assembly format for genome assembly graphs")
  println("Reference: Li H et al. (2016) Bioinformatics 32:2203-2205")
  println("")

  // ------------------------------------------------------------------
  // 1. Load sample GFA graph
  // ------------------------------------------------------------------
  println("=== 1. Load sample GFA graph ===")
  let graph = @bio.gfa_sample_graph()
  println("Loaded sample GFA graph")
  println("")

  // ------------------------------------------------------------------
  // 2. Print graph summary (n_segments, n_links, n_paths)
  // ------------------------------------------------------------------
  println("=== 2. Graph summary ===")
  let n_segments = @bio.gfa_graph_n_segments(graph)
  let n_links = @bio.gfa_graph_n_links(graph)
  let n_paths = @bio.gfa_graph_n_paths(graph)
  println("n_segments: \{n_segments}")
  println("n_links: \{n_links}")
  println("n_paths: \{n_paths}")
  println("")
  println("Full summary: \{@bio.gfa_graph_summary(graph)}")
  println("")

  // ------------------------------------------------------------------
  // 3. Show all segments (name, sequence length, tags)
  // ------------------------------------------------------------------
  println("=== 3. Segments ===")
  let segments = graph.segments()
  for i in 0.. 0 {
          seg_sb.write_string(", ")
        }
        seg_sb.write_string(seg_list[j])
      }
      println("  segments: \{seg_sb.to_string()}")
      let ov_sb = StringBuilder()
      for j in 0.. 0 {
          ov_sb.write_string(", ")
        }
        ov_sb.write_string(overlaps[j])
      }
      println("  overlaps: \{ov_sb.to_string()}")
    }
  }
  println("")

  // ------------------------------------------------------------------
  // 6. Convert segments to SeqRecord array and show
  // ------------------------------------------------------------------
  println("=== 6. Convert segments to SeqRecord array ===")
  let records = @bio.gfa_get_segments_as_records(graph)
  println("Converted \{records.length()} segment(s) to SeqRecord(s)")
  for i in 0.. 0 {
      println("  |\{line}")
      shown = shown + 1
    }
    idx = idx + 1
  }
  println("  ... (total \{n_lines} line(s) in serialized output)")
  println("")

  // ------------------------------------------------------------------
  // 8. Parse a GFA string and verify round-trip
  // ------------------------------------------------------------------
  println("=== 8. Parse a GFA string and verify round-trip ===")
  let gfa_string = "H\tVN:Z:1.0\nS\tquery1\tACGTACGT\tLN:i:8\nS\tquery2\tTTTTGGGG\tLN:i:8\nL\tquery1\t+\tquery2\t-\t4M\nP\tpathA\tquery1+,query2-\t4M,4M\n"
  println("Input GFA string:")
  println(gfa_string)
  let parsed = @bio.gfa_parse(gfa_string)
  println("Parsed graph:")
  println("  segments: \{@bio.gfa_graph_n_segments(parsed)}")
  println("  links: \{@bio.gfa_graph_n_links(parsed)}")
  println("  paths: \{@bio.gfa_graph_n_paths(parsed)}")
  // Round-trip: serialize the parsed graph and re-parse, then compare counts.
  let re_text = @bio.gfa_to_string(parsed)
  let re_parsed = @bio.gfa_parse(re_text)
  let ok = @bio.gfa_graph_n_segments(re_parsed) ==
    @bio.gfa_graph_n_segments(parsed) &&
    @bio.gfa_graph_n_links(re_parsed) == @bio.gfa_graph_n_links(parsed) &&
    @bio.gfa_graph_n_paths(re_parsed) == @bio.gfa_graph_n_paths(parsed)
  println("Round-trip verify: \{ok}")
  println("")

  println("=== Demo complete ===")
}