///|
fn main {
  println("=== Biopython Bio.PDB.binary_cif Demo ===")

  let bytes = @src.binary_cif_sample_bytes()
  let file = @src.binary_cif_parse(bytes) catch {
    _ => abort("failed to parse BinaryCIF sample")
  }

  println("\n1. MessagePack BinaryCIF document")
  println("  Encoded bytes: " + bytes.length().to_string())
  println("  Encoder: " + file.encoder)
  println("  " + file.summary())

  let block = file.get_block(0).unwrap()
  let atom_site = block.get_category("atom_site").unwrap()
  println("\n2. Category and column access")
  println("  Block header: " + block.header)
  println("  _atom_site rows: " + atom_site.row_count.to_string())
  let first_component = atom_site
    .get_column("label_comp_id")
    .unwrap()
    .string_at(0) catch {
      _ => abort("failed to read component column")
    }
  println("  First component: " + first_component.unwrap())
  let first_x = atom_site.get_column("Cartn_x").unwrap().double_at(0) catch {
      _ => abort("failed to read coordinate column")
    }
  println("  First x coordinate: " + first_x.unwrap().to_string())

  println("\n3. CIF missing-value masks")
  let altloc = atom_site.get_column("label_alt_id").unwrap()
  let token0 = altloc.cif_token_at(0) catch {
    _ => abort("failed to read mask row 0")
  }
  let token3 = altloc.cif_token_at(3) catch {
    _ => abort("failed to read mask row 3")
  }
  let token6 = altloc.cif_token_at(6) catch {
    _ => abort("failed to read mask row 6")
  }
  println("  Row 0 token: " + token0)
  println("  Row 3 token: " + token3)
  println("  Row 6 token: " + token6)

  println("\n4. PDB structure construction")
  let structure = @src.binary_cif_to_structure(file) catch {
    _ => abort("failed to construct PDB structure")
  }
  println("  Structure ID: " + structure.get_id())
  println("  Models: " + structure.get_num_models().to_string())
  println("  Chains: " + structure.get_num_chains().to_string())
  println("  Residues: " + structure.get_num_residues().to_string())
  println("  Atoms: " + structure.get_num_atoms().to_string())
  for model in structure.get_models() {
    println(
      "  Model " +
      model.get_id().to_string() +
      ": " +
      model.get_num_chains().to_string() +
      " chain(s), " +
      model.get_atoms().length().to_string() +
      " atom(s)",
    )
  }

  println("\n5. Atom annotations")
  let atoms = structure.get_atoms()
  let first = atoms[0].get_coord()
  println(
    "  First atom " +
    atoms[0].name +
    ": (" +
    first.x.to_string() +
    ", " +
    first.y.to_string() +
    ", " +
    first.z.to_string() +
    ")",
  )
  println("  Alternate location on atom 4: " + atoms[3].altloc.to_string())
  println(
    "  Water residue is hetero: " +
    structure.get_residues()[2].is_het().to_string(),
  )

  println("\nNotes")
  println("  Gzip-compressed .bcif input must be decompressed before parsing.")
  println(
    "  PDB Structure chain IDs are one character; category data keeps full IDs.",
  )
  println("\n=== Demo Complete ===")
}