///|
/// Verdict represents the outcome severity of a runtime monitor check.
/// Mirrors ETG diagnostic severity model.
pub(all) enum Verdict {
  /// All checks passed, no issues.
  Pass
  /// Non-critical observation requiring attention.
  Warn(String)
  /// Critical issue requiring recovery or stop.
  Fail(String)
  /// Fatal condition preventing continued operation.
  Block(String)
} derive(Eq, Debug)

///|
/// MonitorResult binds a named monitor to its verdict.
pub(all) struct MonitorResult {
  name : String
  verdict : Verdict
} derive(Eq, Debug)

///|
pub fn Verdict::severity(self : Verdict) -> Int {
  match self {
    Pass => 0
    Warn(_) => 1
    Fail(_) => 2
    Block(_) => 3
  }
}

///|
pub fn Verdict::is_passing(self : Verdict) -> Bool {
  self is (Pass | Warn(_))
}

///|
/// Compute the worst verdict from a set of monitor results.
pub fn worst_verdict(results : Array[MonitorResult]) -> Verdict {
  let mut worst : Verdict = Pass
  for r in results {
    if r.verdict.severity() > worst.severity() {
      worst = r.verdict
    }
  }
  worst
}