///|
/// INSDC (GenBank/EMBL) IO Demo.
///
/// Demonstrates Bio.SeqIO.InsdcIO module: parsing and writing GenBank
/// and EMBL records, feature tables, and qualifier extraction.
/// Inspired by BioPython's Bio.SeqIO.InsdcIO module.
fn main {
  println("=== INSDC IO Demo ===")
  println("Bio.SeqIO.InsdcIO: GenBank/EMBL parsing and writing\n")

  // === 1. Construct a GenBank format text ===
  println("=== 1. Construct GenBank Text ===")
  let genbank_text = "LOCUS       TESTSEQ     60 bp    DNA     linear   UNK 01-JAN-2024\n" +
    "DEFINITION  Test sequence for InsdcIO demo.\n" +
    "ACCESSION   TEST0001\n" +
    "VERSION     TEST0001.1\n" +
    "ORGANISM  Escherichia coli\n" +
    "FEATURES         Location/Qualifiers\n" +
    "     gene            1..60\n" +
    "                     /gene=\"rpoB\"\n" +
    "                     /locus_tag=\"ECK_1234\"\n" +
    "     CDS             1..60\n" +
    "                     /gene=\"rpoB\"\n" +
    "                     /product=\"DNA-directed RNA polymerase subunit beta\"\n" +
    "                     /translation=\"ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT\"\n" +
    "ORIGIN\n" +
    "        1 acgtacgtac gtacgtacgt acgtacgtac gtacgtacgt acgtacgtac gtacgtacgt\n" +
    "//\n"
  println("  Constructed GenBank record with LOCUS/DEFINITION/ACCESSION/")
  println("  VERSION/FEATURES(gene+CDS)/ORIGIN sections.")

  // === 2. Parse the GenBank record ===
  println("\n=== 2. Parse GenBank Record ===")
  let record = @bio.parse_genbank_record(genbank_text)
  println("  parse_genbank_record: OK")

  // === 3. Print parsed metadata ===
  println("\n=== 3. Parsed Metadata ===")
  println("  locus_name:       \{record.locus_name}")
  println("  accession:        \{record.accession}")
  println("  version:          \{record.version}")
  println("  organism:         \{record.organism}")
  println("  sequence length:  \{record.sequence.length()}")
  println("  molecule_type:    \{record.molecule_type}")
  println("  topology:         \{record.topology}")
  println("  division:         \{record.division}")
  println("  definition:       \{record.definition}")
  println("  features count:   \{record.features.length()}")

  // === 4. Iterate features, print type/location/qualifiers ===
  println("\n=== 4. Features ===")
  let mut fi = 0
  while fi < record.features.length() {
    let f = record.features[fi]
    let loc = @bio.parse_insdc_location(f.location_str)
    println("  Feature [\{fi}] type=\{f.feature_type}, location=\{loc}")
    let qkeys = f.qualifiers.keys().collect()
    qkeys.sort()
    let mut qi = 0
    while qi < qkeys.length() {
      let k = qkeys[qi]
      let vals = f.qualifiers.get_or_default(k, [])
      println("    /\{k} = \{Repr(vals)}")
      qi = qi + 1
    }
    fi = fi + 1
  }

  // === 5. Extract CDS /gene, /product, /translation ===
  println("\n=== 5. Extract CDS Qualifiers ===")
  fi = 0
  while fi < record.features.length() {
    let f = record.features[fi]
    if f.feature_type == "CDS" {
      let gene = @bio.extract_gene_name(f).unwrap_or("(none)")
      let product = @bio.extract_feature_qualifier(f, "product").unwrap_or(
        "(none)",
      )
      let translation = @bio.extract_translation(f).unwrap_or("(none)")
      println("  /gene:        \{gene}")
      println("  /product:     \{product}")
      println("  /translation: \{translation}")
    }
    fi = fi + 1
  }

  // === 6. Write GenBank record back ===
  println("\n=== 6. Write GenBank Record ===")
  let genbank_rewritten = @bio.write_genbank_record(record)
  println(genbank_rewritten)

  // === 7. Construct and parse an EMBL record ===
  println("=== 7. Parse EMBL Record ===")
  let embl_text = "ID   TESTSEQ; SV 1; linear; DNA; STD; UNK; 60 BP.\n" +
    "XX\n" +
    "AC   TEST0001;\n" +
    "XX\n" +
    "DE   Test sequence for InsdcIO demo.\n" +
    "XX\n" +
    "OS   Escherichia coli\n" +
    "XX\n" +
    "FH   Key             Location/Qualifiers\n" +
    "FH\n" +
    "FT   gene            1..60\n" +
    "FT                   /gene=\"rpoB\"\n" +
    "FT                   /locus_tag=\"ECK_1234\"\n" +
    "FT   CDS             1..60\n" +
    "FT                   /gene=\"rpoB\"\n" +
    "FT                   /product=\"DNA-directed RNA polymerase subunit beta\"\n" +
    "FT                   /translation=\"ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT\"\n" +
    "XX\n" +
    "SQ   Sequence 60 BP; 15 A; 15 C; 15 G; 15 T; 0 other;\n" +
    "     acgtacgtac gtacgtacgt acgtacgtac gtacgtacgt acgtacgtac gtacgtacgt\n" +
    "//\n"
  let embl_record = @bio.parse_embl_record(embl_text)
  println("  parse_embl_record: OK")
  println("  locus_name:       \{embl_record.locus_name}")
  println("  accession:        \{embl_record.accession}")
  println("  version:          \{embl_record.version}")
  println("  organism:         \{embl_record.organism}")
  println("  sequence length:  \{embl_record.sequence.length()}")
  println("  molecule_type:    \{embl_record.molecule_type}")
  println("  topology:         \{embl_record.topology}")
  println("  features count:   \{embl_record.features.length()}")

  // === 8. Write EMBL record back ===
  println("\n=== 8. Write EMBL Record ===")
  let embl_rewritten = @bio.write_embl_record(embl_record)
  println(embl_rewritten)

  println("=== INSDC IO Demo Complete ===")
}