///|
/// ChemmineR module demo - Cheminformatics toolkit for small-molecule analysis.
///
/// Run: moon run examples/chemminer_demo
fn main {
  println("=== ChemmineR Module Demo ===")
  println(
    "Cheminformatics: SDF parsing, molecular descriptors, fingerprints, similarity",
  )
  println("Reference: Backman et al. (2011) Bioinformatics 27:2400-1")
  println("")

  // ------------------------------------------------------------------
  // 1. Load sample molecules and compute descriptors
  // ------------------------------------------------------------------
  println("=== 1. Molecular Descriptors ===")
  let molecules = [
    @bio.chem_sample_water(),
    @bio.chem_sample_methane(),
    @bio.chem_sample_ethanol(),
    @bio.chem_sample_benzene(),
    @bio.chem_sample_aspirin(),
  ]
  for mol in molecules {
    let summary = @bio.chem_molecule_summary(mol)
    println(summary)
    println("")
  }

  // ------------------------------------------------------------------
  // 2. Atom-pair fingerprints and similarity
  // ------------------------------------------------------------------
  println("=== 2. Atom-Pair Fingerprints & Similarity ===")
  let methane = @bio.chem_sample_methane()
  let ethanol = @bio.chem_sample_ethanol()
  let benzene = @bio.chem_sample_benzene()
  let aspirin = @bio.chem_sample_aspirin()
  let fp_methane = @bio.chem_atom_pair_fingerprint(methane)
  let fp_ethanol = @bio.chem_atom_pair_fingerprint(ethanol)
  let fp_benzene = @bio.chem_atom_pair_fingerprint(benzene)
  let fp_aspirin = @bio.chem_atom_pair_fingerprint(aspirin)
  println("Methane fingerprint size: " + fp_methane.length().to_string())
  println("Ethanol fingerprint size: " + fp_ethanol.length().to_string())
  println("Benzene fingerprint size: " + fp_benzene.length().to_string())
  println("Aspirin fingerprint size: " + fp_aspirin.length().to_string())
  println("")
  let tanimoto_bb = @bio.chem_tanimoto(fp_benzene, fp_aspirin)
  let dice_bb = @bio.chem_dice(fp_benzene, fp_aspirin)
  println("Benzene vs Aspirin Tanimoto: " + tanimoto_bb.to_string())
  println("Benzene vs Aspirin Dice: " + dice_bb.to_string())
  println("")

  // ------------------------------------------------------------------
  // 3. Substructure search
  // ------------------------------------------------------------------
  println("=== 3. Substructure Search ===")
  let is_benzene_in_aspirin = @bio.chem_substructure_match(benzene, aspirin)
  println(
    "Benzene is substructure of Aspirin: " + is_benzene_in_aspirin.to_string(),
  )
  let is_water_in_ethanol = @bio.chem_substructure_match(
    @bio.chem_sample_water(),
    ethanol,
  )
  println(
    "Water is substructure of Ethanol: " + is_water_in_ethanol.to_string(),
  )
  println("")

  // ------------------------------------------------------------------
  // 4. SDF parsing and round-trip
  // ------------------------------------------------------------------
  println("=== 4. SDF Parsing & Round-Trip ===")
  let sdf_text = @bio.chem_sample_sdf_text()
  let parsed = @bio.chem_parse_sdf(sdf_text)
  println("Parsed " + parsed.length().to_string() + " molecule(s) from SDF")
  for mol in parsed {
    println(
      "  " +
      mol.name() +
      ": " +
      mol.n_atoms().to_string() +
      " atoms, " +
      mol.n_bonds().to_string() +
      " bonds",
    )
  }
  println("")
  let reserialized = @bio.chem_molecule_to_sdf(parsed[0])
  let reparsed = @bio.chem_parse_sdf(reserialized)
  println(
    "Round-trip: parsed " + reparsed.length().to_string() + " molecule(s)",
  )
  println("  Name: " + reparsed[0].name())
  println("  Atoms: " + reparsed[0].n_atoms().to_string())
  println("  Bonds: " + reparsed[0].n_bonds().to_string())
  println("")

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