///|
/// Bio.NMR demo: NMR restraint and chemical-shift analysis.
///
/// Demonstrates NOE distance restraints, dihedral-angle restraints,
/// chemical-shift table queries, and NMR peak-list parsing.
fn main {
  println("=== Bio.NMR Demo ===\n")

  // 1. NOE distance restraints.
  println("1. NOE Distance Restraints:")
  let restraints = @bio.nmr_sample_noe_restraints()
  for i in 0.. {
        let v = @bio.noe_violation(r, d)
        let status = if v > 0.0 { "VIOLATED" } else { "ok" }
        println(
          "   #\{r.restraint_id}: observed=\{d} A, violation=\{v} A [\{status}]",
        )
      }
      None => continue
    }
  }
  // Summary.
  let summary = @bio.noe_restraint_summary(restraints)
  println(
    "\n   Summary: total=\{summary.total}, violated=\{summary.violated}, max_violation=\{summary.max_violation} A",
  )

  // 2. Dihedral-angle restraints.
  println("\n3. Dihedral Angle Restraints:")
  let dihedrals = @bio.nmr_sample_dihedral_restraints()
  for i in 0.. {
        let viol = @bio.dihedral_violation(d, v)
        let status = if viol > 0.0 { "VIOLATED" } else { "ok" }
        println(
          "   #\{d.restraint_id}: observed=\{v} deg, violation=\{viol} deg [\{status}]",
        )
      }
      None => continue
    }
  }

  // 3. Chemical shifts.
  println("\n5. Chemical Shifts:")
  let table = @bio.nmr_sample_chemical_shifts()
  println("   Total shifts: \{table.shifts.length()}")
  let h_shifts = @bio.shifts_for_element(table, "H")
  println("   H shifts: \{h_shifts.length()}")
  let n_shifts = @bio.shifts_for_element(table, "N")
  println("   N shifts: \{n_shifts.length()}")
  let c_shifts = @bio.shifts_for_element(table, "C")
  println("   C shifts: \{c_shifts.length()}")
  let mean_h = @bio.mean_shift_by_element(table, "H")
  println("   Mean H shift: \{mean_h} ppm")
  // Lookup example.
  let ha_15 = @bio.lookup_shift(table, 15, "HA")
  println("   15.HA shift: \{ha_15.unwrap_or(-1.0)} ppm")

  // 4. Peak list.
  println("\n6. Peak List:")
  let list = @bio.nmr_sample_peak_list()
  println("   Label: \{list.label}")
  println("   Dimensions: \{list.n_dim}")
  println("   Peaks: \{list.peaks.length()}")
  for i in 0..