///|
/// NACCESS (Bio.PDB.NACCESS) demo.
///
/// Loads sample NACCESS output (RSA residue-level and ASA atom-level data),
/// inspects per-residue and per-atom accessibility, classifies residues as
/// exposed vs buried, reports chain totals, and demonstrates round-trip
/// serialization back to RSA/ASA file content.

///|
fn main {
  println("=== Bio.PDB.NACCESS Demo ===")
  println("Inspired by Biopython Bio.PDB.NACCESS module")
  println("")

  // 1. Load sample NACCESS data (RSA + ASA).
  println("1. Load sample NACCESS data")
  let rsa_content = @bio.naccess_sample_rsa()
  let asa_content = @bio.naccess_sample_asa()
  let result = @bio.naccess_parse(rsa_content, asa_content)
  println("  Parsed RSA and ASA content into a NaccessResult")
  println("")

  // 2. Print result info.
  println("2. Result Info")
  println("  Residues: \{result.get_num_residues()}")
  println("  Atoms   : \{result.get_num_atoms()}")
  println("  Total ASA: \{result.total_abs_asa} A^2")
  println("  Chains  : \{result.chain_totals.length()}")
  println("")

  // 3. Show residue details.
  println("3. Residue Details")
  println("  res    num  chn  abs_all  rel_all  abs_side  rel_side")
  for r in result.get_residues() {
    println(
      "  \{r.res_name}\t\{r.res_num}\t\{r.chain_id}\t\{r.abs_all}\t\{r.rel_all}\t\{r.abs_side_chain}\t\{r.rel_side_chain}",
    )
  }
  println("")

  // 4. Show atom details.
  println("4. Atom Details (ASA)")
  println("  num  atom  res    chn  abs_asa  rel_asa")
  for a in result.get_atoms() {
    println(
      "  \{a.atom_num}\t\{a.atom_name}\t\{a.res_name}\t\{a.chain_id}\t\{a.abs_asa}\t\{a.rel_asa}",
    )
  }
  println("")

  // 5. Show exposed vs buried residues (threshold = 20% relative ASA).
  println("5. Exposed vs Buried Residues (threshold = 20%)")
  let exposed = @bio.naccess_exposed_residues(result, 20.0)
  let buried = @bio.naccess_buried_residues(result, 20.0)
  println("  Exposed (\{exposed.length()}):")
  for r in exposed {
    println("    \{r.res_name} \{r.res_num} (rel_all=\{r.rel_all}%)")
  }
  println("  Buried (\{buried.length()}):")
  for r in buried {
    println("    \{r.res_name} \{r.res_num} (rel_all=\{r.rel_all}%)")
  }
  println("  Count exposed: \{@bio.naccess_count_exposed(result, 20.0)}")
  println("  Mean rel ASA : \{@bio.naccess_mean_rel_asa(result)}%")
  println("")

  // 6. Show chain totals.
  println("6. Chain Totals")
  println("  Chain A: \{@bio.naccess_chain_total_asa(result, "A")} A^2")
  println("  Chain B: \{@bio.naccess_chain_total_asa(result, "B")} A^2")
  println(
    "  Chain A residues: \{@bio.naccess_get_chain_residues(result, "A").length()}",
  )
  println(
    "  Chain B residues: \{@bio.naccess_get_chain_residues(result, "B").length()}",
  )
  println("")

  // 7. Demonstrate serialization (write RSA/ASA).
  println("7. Serialization (round-trip)")
  let rsa_out = @bio.naccess_write_rsa(result)
  let asa_out = @bio.naccess_write_asa(result)
  // Show first few lines of serialized RSA.
  let rsa_lines = rsa_out.split("\n").to_array()
  println("  RSA output (\{rsa_lines.length()} lines, first 3):")
  let mut i = 0
  while i < 3 && i < rsa_lines.length() {
    println("    \{rsa_lines[i]}")
    i = i + 1
  }
  let asa_lines = asa_out.split("\n").to_array()
  println("  ASA output (\{asa_lines.length()} lines, first 3):")
  let mut j = 0
  while j < 3 && j < asa_lines.length() {
    println("    \{asa_lines[j]}")
    j = j + 1
  }
  // Verify round-trip: re-parse and check counts match.
  let reparsed = @bio.naccess_parse(rsa_out, asa_out)
  println(
    "  Round-trip: \{reparsed.get_num_residues()} residues, \{reparsed.get_num_atoms()} atoms",
  )
  println("")

  // 8. Standard ASA reference values.
  println("8. Standard ASA Reference Values")
  let std_res = ["ALA", "GLY", "MET", "CYS", "TRP"]
  for name in std_res {
    println("  \{name}: \{@bio.naccess_standard_asa(name)} A^2")
  }
  println("")

  // 9. Print summary.
  println("9. Summary")
  let summary = @bio.naccess_summary(result)
  println(summary)
}