///|
fn main {
  println(
    "======================================================================",
  )
  println(
    "           MOONBIT FORCE PLATE ANALYSIS SUITE (CLI DEMO)              ",
  )
  println(
    "======================================================================",
  )

  // 1. CMJ Analysis Demo
  let trial_cmj = @cmd.generate_synthetic_cmj_trial(
    "Athlete_PRO_01", 1000.0, 75.0,
  )
  println("[+] Synthetic CMJ trial generated: 75.0 kg, 1000 Hz")

  let fz_raw = trial_cmj.get_fz()
  let butter_coeffs = @filter.compute_butterworth_lowpass(10.0, 1000.0)
  let _fz_filtered = @filter.apply_biquad_zero_phase(fz_raw, butter_coeffs)
  println("[+] Zero-phase 4th order Butterworth filter applied (fc = 10 Hz)")

  let cmj_report = @jump.analyze_cmj_trial(trial_cmj, 75.0)
  let ascii_rpt = @export.format_cmj_ascii_report(trial_cmj, cmj_report)
  println(ascii_rpt)

  // 2. IMTP Analysis Demo
  println(
    "----------------------------------------------------------------------",
  )
  let trial_imtp = @cmd.generate_synthetic_imtp_trial(
    "Athlete_PRO_01", 1000.0, 75.0,
  )
  let imtp_report = @jump.analyze_imtp_trial(trial_imtp, 75.0)
  println("ISOMETRIC MID-THIGH PULL (IMTP) RESULTS:")
  println(
    "  IMTP Peak Force (N)      : " + imtp_report.peak_force_n.to_string(),
  )
  println(
    "  IMTP Relative Force (BW) : " + imtp_report.peak_force_rel_bw.to_string(),
  )
  println(
    "  Force at 100ms (N)       : " + imtp_report.force_at_100ms_n.to_string(),
  )
  println(
    "  Force at 200ms (N)       : " + imtp_report.force_at_200ms_n.to_string(),
  )
  println(
    "  Peak RFD (N/s)           : " + imtp_report.peak_rfd_n_s.to_string(),
  )

  let dsd = @jump.calculate_dynamic_strength_deficit(
    cmj_report.peak_force_n,
    imtp_report.peak_force_n,
  )
  println("  Dynamic Strength Deficit : " + dsd.to_string())

  // 3. Posturography Sway Demo
  println(
    "----------------------------------------------------------------------",
  )
  let trial_sway = @cmd.generate_synthetic_sway_trial(
    "Athlete_PRO_01", 10.0, 100.0,
  )
  let sway_report = @sway.analyze_sway_trial(trial_sway)
  let hull_area = @sway.compute_cop_convex_hull_area(
    trial_sway.get_cop_points(),
  )

  println("POSTUROGRAPHY STATIC BALANCE RESULTS (10s Trial):")
  println(
    "  Total COP Path Length  : " +
    sway_report.total_path_length_mm.to_string() +
    " mm",
  )
  println(
    "  Mean COP Velocity      : " +
    sway_report.mean_velocity_mm_s.to_string() +
    " mm/s",
  )
  println(
    "  95% Ellipse Area       : " +
    sway_report.ellipse_95_area_mm2.to_string() +
    " mm^2",
  )
  println("  Convex Hull Sway Area  : " + hull_area.to_string() + " mm^2")

  println(
    "----------------------------------------------------------------------",
  )
  let benchmark = @cmd.run_cmj_benchmark(
    @cmd.BenchmarkConfig::new(2000, 3, 1000.0, 75.0),
  )
  println("DETERMINISTIC PIPELINE BENCHMARK:")
  println("  " + @cmd.format_benchmark_result(benchmark))
  println(
    "======================================================================",
  )
}