///|
/// Configuration for HRV analysis.
pub(all) struct HrvConfig {
  min_rr : Double
  max_rr : Double
  relative_threshold : Double
  pnn_threshold : Double
  rolling_window : Int
  normal_range_sd_factor : Double
} derive(FromJson, ToJson, Debug, Eq)

///|
/// Default configuration values.
pub fn HrvConfig::default() -> HrvConfig {
  {
    min_rr: 300.0,
    max_rr: 2000.0,
    relative_threshold: 0.20,
    pnn_threshold: 50.0,
    rolling_window: 7,
    normal_range_sd_factor: 0.75,
  }
}

///|
/// Signal quality and cleaning statistics report.
pub(all) struct QualityReport {
  total_beats : Int
  valid_beats : Int
  ectopic_beats : Int
  clean_ratio : Double
  is_low_quality : Bool
} derive(FromJson, ToJson, Debug, Eq)

///|
/// Computed time-domain HRV metrics.
pub(all) struct HrvMetrics {
  mean_rr : Double
  mean_hr : Double
  sdnn : Double
  rmssd : Double
  pnn50 : Double
  pnn_custom : Double
  quality : QualityReport
} derive(FromJson, ToJson, Debug, Eq)

///|
/// A single day's morning HRV measurement.
pub(all) struct MorningMeasurement {
  date : String
  rmssd : Double
  sdnn : Double
  rr_mean : Double
} derive(FromJson, ToJson, Debug, Eq)

///|
/// Computed morning baseline and trend analysis for a specific day.
pub(all) struct MorningTrend {
  date : String
  today_rmssd : Double
  rmssd_rolling_avg : Double
  rmssd_rolling_sd : Double
  rmssd_normal_range_lower : Double
  rmssd_normal_range_upper : Double
  rmssd_status : String
  recovery_score : Double
} derive(FromJson, ToJson, Debug, Eq)