///|
/// Taxonomy example: NCBI taxonomy database operations.
///
/// Run: moon run examples/taxonomy_demo/main.mbt
fn main {
  println("=== Bio.Taxonomy Demo ===\n")

  let db = @bio.create_example_taxonomy()

  println("1. Database Statistics:")
  println("   Total taxa: \{db.count_taxa()}")
  println("   Species count: \{db.get_all_species().length()}")
  println("   Genera count: \{db.get_all_genera().length()}")

  println("\n2. Query by TaxID:")
  match db.get_scientific_name("9606") {
    Some(name) => println("   TaxID 9606: \{name}")
    None => println("   TaxID 9606: Not found")
  }

  println("\n3. Query by Name:")
  match db.get_taxid_by_name("Homo sapiens") {
    Some(id) => println("   Homo sapiens: tax_id = \{id}")
    None => println("   Homo sapiens: Not found")
  }

  println("\n4. Lineage of Homo sapiens (9606):")
  let lineage = db.get_lineage("9606")
  let mut i = 0
  while i < lineage.length() {
    println("   \{i + 1}. \{lineage[i]}")
    i = i + 1
  }

  println("\n5. Common Ancestor:")
  match db.get_common_ancestor("9606", "9599") {
    Some(ancestor_id) =>
      match db.get_scientific_name(ancestor_id) {
        Some(name) =>
          println(
            "   Common ancestor of human and chimp: \{name} (tax_id: \{ancestor_id})",
          )
        None => println("   Common ancestor: tax_id \{ancestor_id}")
      }
    None => println("   No common ancestor found")
  }

  println("\n6. Taxonomic Distance:")
  let dist = db.get_distance("9606", "9599")
  println("   Distance between human and chimp: \{dist}")

  let dist2 = db.get_distance("9606", "562")
  println("   Distance between human and E. coli: \{dist2}")

  println("\n7. Ancestor Check:")
  let is_ancestor = db.is_ancestor("9604", "9606")
  println(
    "   Is Hominidae (9604) ancestor of Homo sapiens (9606)? \{is_ancestor}",
  )

  println("\n8. Common Names:")
  let common_names = db.get_common_names("9606")
  let mut names_str = "   Human common names: "
  let mut j = 0
  while j < common_names.length() {
    if j > 0 {
      names_str = names_str + ", "
    }
    names_str = names_str + common_names[j]
    j = j + 1
  }
  println(names_str)

  println("\n9. Synonyms:")
  let synonyms = db.get_synonyms("9606")
  let mut syn_str = "   Human synonyms: "
  let mut k = 0
  while k < synonyms.length() {
    if k > 0 {
      syn_str = syn_str + ", "
    }
    syn_str = syn_str + synonyms[k]
    k = k + 1
  }
  println(syn_str)

  println("\n10. Get all taxa by rank 'species':")
  let species = db.get_all_species()
  let mut l = 0
  while l < species.length() {
    println("   - \{species[l].scientific_name}")
    l = l + 1
  }

  println("\n11. Parse nodes.dmp format:")
  let nodes_content = "1\t|\t0\t|\tno rank\t|\n131567\t|\t1\t|\tno rank\t|\n2759\t|\t131567\t|\tsuperkingdom\t|\n"
  let parsed_db = @bio.parse_nodes_dmp(
    @bio.TaxonomyDatabase::new(),
    nodes_content,
  )
  println("   Parsed \{parsed_db.count_taxa()} taxa from nodes.dmp")

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