///|
pub(all) enum AlertLevel {
  Ok
  Page
  Ticket
} derive(Eq, Debug)

///|
pub(all) struct BurnRule {
  name : String
  level : AlertLevel
  threshold_x100 : Int
} derive(Eq, Debug)

///|
pub fn BurnRule::new(
  name : String,
  level : AlertLevel,
  threshold_x100 : Int,
) -> BurnRule {
  {
    name,
    level,
    threshold_x100: if threshold_x100 > 0 {
      threshold_x100
    } else {
      1
    },
  }
}

///|
pub(all) struct AlertDecision {
  level : AlertLevel
  rule_name : String
  burn_rate_x100 : Int
  reason : String
} derive(Eq, Debug)

///|
pub fn evaluate_burn_rule(
  report : BurnReport,
  rule : BurnRule,
) -> AlertDecision {
  if report.burn_rate_x100 >= rule.threshold_x100 {
    {
      level: rule.level,
      rule_name: rule.name,
      burn_rate_x100: report.burn_rate_x100,
      reason: "threshold_exceeded",
    }
  } else {
    {
      level: Ok,
      rule_name: rule.name,
      burn_rate_x100: report.burn_rate_x100,
      reason: "within_budget",
    }
  }
}

///|
pub fn AlertDecision::is_alert(self : AlertDecision) -> Bool {
  match self.level {
    Ok => false
    _ => true
  }
}