///|
/// NCBI Entrez database access demo inspired by Biopython Bio.Entrez.
///
/// Run: moon run examples/entrez_demo/main.mbt
fn main {
  println("=== Bio.Entrez Demo ===")

  println("\n1. ESearch - Search PubMed:")
  let results = @bio.esearch(@bio.entrez_db_pubmed(), "CRISPR")
  for result in results {
    println(
      "   ID: \{result.id}, Title: \{result.title}, Score: \{result.score}",
    )
  }

  println("\n2. EFetch - Fetch PubMed article:")
  let xml = @bio.efetch(@bio.entrez_db_pubmed(), "37566892")
  println("   XML: \{xml[0:80]}...")

  println("\n3. Parse PubMed article:")
  match @bio.parse_pubmed(xml) {
    Some(article) => {
      println("   PMID: \{article.pmid}")
      println("   Title: \{article.title}")
      println("   Journal: \{article.journal}")
    }
    None => println("   Failed to parse")
  }

  println("\n4. ESearch - Search Gene:")
  let gene_results = @bio.esearch(@bio.entrez_db_gene(), "TP53")
  for result in gene_results {
    println("   ID: \{result.id}, Title: \{result.title}")
  }

  println("\n5. EFetch - Fetch Gene record:")
  let gene_xml = @bio.efetch(@bio.entrez_db_gene(), "7157")
  println("   XML: \{gene_xml[0:80]}...")

  println("\n6. Parse Gene record:")
  match @bio.parse_gene(gene_xml) {
    Some(gene) => {
      println("   GeneID: \{gene.gene_id}")
      println("   Symbol: \{gene.symbol}")
      println("   Description: \{gene.description}")
      println("   Chromosome: \{gene.chromosome}")
    }
    None => println("   Failed to parse")
  }

  println("\n7. Get gene info:")
  match @bio.get_gene_info("TP53") {
    Some(gene) => {
      println("   GeneID: \{gene.gene_id}")
      println("   Symbol: \{gene.symbol}")
      println("   Organism: \{gene.organism}")
    }
    None => println("   Gene not found")
  }

  println("\n8. Get taxonomy:")
  match @bio.get_taxonomy("Homo sapiens") {
    Some(tax) => {
      println("   TaxID: \{tax.tax_id}")
      println("   Scientific Name: \{tax.scientific_name}")
      println("   Common Name: \{tax.common_name}")
      println("   Rank: \{tax.rank}")
    }
    None => println("   Taxonomy not found")
  }

  println("\n9. EGQuery - Global query:")
  let global = @bio.egquery("cancer")
  for kv in global {
    println("   \{kv.0}: \{kv.1}")
  }

  println("\n10. EInfo - Database info:")
  let info = @bio.einfo()
  for kv in info {
    println("   \{kv.0}: \{kv.1}")
  }
}