///|
/// Aggregate telemetry health payloads for one station cycle.
pub struct TelemetryBatchSummary {
  payload_count : Int
  healthy_count : Int
  degraded_count : Int
  critical_count : Int
  mean_score : Double
}

///|
/// Summarize a telemetry batch.
pub fn telemetry_batch_summary(
  payloads : Array[TelemetryHealth],
) -> TelemetryBatchSummary {
  let mut healthy = 0
  let mut degraded = 0
  let mut critical = 0
  let mut score = 0.0
  for payload in payloads {
    score += payload.quality_score
    match payload.state {
      "healthy" => healthy += 1
      "critical" => critical += 1
      _ => degraded += 1
    }
  }
  {
    payload_count: payloads.length(),
    healthy_count: healthy,
    degraded_count: degraded,
    critical_count: critical,
    mean_score: if payloads.is_empty() {
      0.0
    } else {
      score / payloads.length().to_double()
    },
  }
}

///|
/// Format telemetry batch health.
pub fn telemetry_batch_text(summary : TelemetryBatchSummary) -> String {
  "payloads=" +
  summary.payload_count.to_string() +
  " healthy=" +
  summary.healthy_count.to_string() +
  " degraded=" +
  summary.degraded_count.to_string() +
  " critical=" +
  summary.critical_count.to_string() +
  " mean_score=" +
  summary.mean_score.to_string()
}