///|
/// UniProt XML Format IO Demo.
///
/// Demonstrates parsing UniProt XML entries and extracting annotations.
///
/// Run: moon run examples/uniprot_io_demo/main.mbt
fn main {
  println("=== UniProt XML IO Demo ===\n")

  // Example UniProt XML content
  let uniprot_xml = "\n" +
    "    \n" +
    "      P12345\n" +
    "      Hemoglobin subunit alpha\n" +
    "      HBA1\n" +
    "      9606Homo sapiens\n" +
    "      VLSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHFDLSHGSAQVKGHGKKVADALTNAVAHVDDMPNALSALSDLHAHKLRVDPVNFKLLSHCLLVTLAAHLPAEFTPAVHASLDKFLASVSTVLTSKYR\n" +
    "      \n" +
    "        \n" +
    "      \n" +
    "      \n" +
    "        \n" +
    "      \n" +
    "      \n" +
    "        \n" +
    "        \n" +
    "          test\n" +
    "          test\n" +
    "        \n" +
    "      \n" +
    "      \n" +
    "        \n" +
    "          Cytoplasm\n" +
    "        \n" +
    "      \n" +
    "    \n" +
    "  "

  // Parse UniProt XML
  println("1. Parse UniProt XML:")
  let entries = @bio.parse_uniprot_xml(uniprot_xml)
  println("   Found \{entries.length()} entries")

  if entries.length() > 0 {
    let entry = entries[0]
    println("\n2. Entry details:")
    println("   Accession: \{entry.accession}")
    println("   Protein: \{entry.protein_name}")
    println("   Organism: \{entry.organism}")
    println("   Sequence length: \{entry.seq_length}")
    let seq_str = entry.sequence
    let prefix = if seq_str.length() > 20 {
      seq_str[0:20] + "..."
    } else {
      seq_str
    }
    println("   Sequence (first 20 chars): \{prefix}")

    println("\n3. Gene names:")
    for g in entry.gene_names {
      println("   - \{g}")
    }

    println("\n4. Database references:")
    for db in entry.db_references {
      println("   - \{db.database}: \{db.id}")
    }

    println("\n5. Features:")
    for f in entry.features {
      println("   - \{f.feature_type}: \{f.description}")
    }

    println("\n6. Convert to SeqRecord-compatible format:")
    let (header, id, desc, _kwargs) = @bio.uniprot_to_seqrecord(entry)
    println("   Header: \{header}")
    println("   ID: \{id}")
    println("   Description: \{desc}")
  }

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