///|
fn main {
  let target = @slo.SloTarget::new("checkout-api", 9900, 30 * 24 * 60)
  let window = @slo.RequestWindow::new("5m", 5, 1000, 980)
  let budget = @slo.evaluate_budget(target, window)
  let burn = @slo.calculate_burn_rate(target, window)
  let alert = @slo.evaluate_burn_rule(
    burn,
    @slo.BurnRule::new("fast-burn", @slo.AlertLevel::Page, 150),
  )
  let forecast = @slo.forecast_budget(target, window, 5)
  let service = @slo.evaluate_service_objective(
    @slo.ServiceObjective::new("checkout", target, @slo.standard_burn_rules()),
    @slo.RequestWindow::new("30m", 30, 10000, 9950),
    [
      @slo.RequestWindow::new("5m", 5, 1000, 980),
      @slo.RequestWindow::new("1h", 60, 10000, 9970),
      @slo.RequestWindow::new("6h", 360, 60000, 59850),
      @slo.RequestWindow::new("24h", 1440, 240000, 239200),
    ],
    @slo.ReleaseGate::new("prod", 8000, true),
  )

  println("MoonSLOKit demo")
  println("availability_bp: \{window.availability_bp()}")
  println("burn_rate: \{burn.rate_label()}")
  println("budget: \{budget.to_json()}")
  println("alert: \{alert.to_json()}")
  println("forecast: \{forecast.to_json()}")
  println("service: \{service.to_json()}")
  let batch = @slo.RequestBatch::new("checkout-api")
    .add(@slo.RequestEvent::new(1, true, 42))
    .add(@slo.RequestEvent::new(1, false, 1200))
    .add(@slo.RequestEvent::new(2, true, 55))
  let health = @slo.HealthReport::from_windows(
    "checkout",
    target,
    [window, @slo.RequestBatch::to_window(batch, 5)],
    @slo.IncidentTimeline::new(),
  )
  println("health: \{health.to_json()}")
  println("metrics: \n\{health.to_metrics()}")
}