///|
pub struct BatchReport {
  results : Array[VerificationResult]
} derive(Eq, Debug)

///|
pub fn BatchReport::new(results : Array[VerificationResult]) -> BatchReport {
  { results, }
}

///|
pub fn BatchReport::accepted(self : BatchReport) -> Int {
  accepted_count(self.results)
}

///|
pub fn BatchReport::rejected(self : BatchReport) -> Int {
  rejected_count(self.results)
}

///|
pub fn BatchReport::total(self : BatchReport) -> Int {
  self.results.length()
}

///|
pub fn BatchReport::acceptance_rate(self : BatchReport) -> Double {
  if self.total() == 0 {
    0.0
  } else {
    self.accepted().to_double() / self.total().to_double()
  }
}

///|
pub fn verify_batch_report(
  requests : Array[WebhookRequest],
  policy : VerificationPolicy,
) -> BatchReport {
  BatchReport::new(verify_batch(requests, policy))
}

///|
pub fn result_to_markdown(result : VerificationResult) -> String {
  let builder = StringBuilder::new()
  builder.write_string("| provider | event | id | status | diagnostics |\n")
  builder.write_string("| --- | --- | --- | --- | --- |\n")
  builder.write_string("| ")
  builder.write_string(result.provider)
  builder.write_string(" | ")
  builder.write_string(result.event_type)
  builder.write_string(" | ")
  builder.write_string(result.event_id)
  builder.write_string(" | ")
  if result.is_ok() {
    builder.write_string("accepted")
  } else {
    builder.write_string("rejected")
  }
  builder.write_string(" | ")
  for i in 0.. 0 {
      builder.write_string(", ")
    }
    builder.write_string(diagnostic_name(result.diagnostics[i].code))
  }
  builder.write_string(" |\n")
  builder.to_string()
}

///|
pub fn batch_report_markdown(report : BatchReport) -> String {
  let builder = StringBuilder::new()
  builder.write_string("# Webhook Verification Report\n\n")
  builder.write_string("accepted=")
  builder.write_string(report.accepted().to_string())
  builder.write_string(" rejected=")
  builder.write_string(report.rejected().to_string())
  builder.write_string(" total=")
  builder.write_string(report.total().to_string())
  builder.write_string("\n\n")
  builder.write_string("| provider | event | id | status |\n")
  builder.write_string("| --- | --- | --- | --- |\n")
  for i in 0.. String {
  let builder = StringBuilder::new()
  builder.write_string("provider,event,id,status,diagnostics\n")
  for i in 0.. 0 {
        builder.write_string("|")
      }
      builder.write_string(diagnostic_name(result.diagnostics[j].code))
    }
    builder.write_string("\n")
  }
  builder.to_string()
}

///|
pub fn summarize_results(results : Array[VerificationResult]) -> String {
  let report = BatchReport::new(results)
  "accepted=\{report.accepted()} rejected=\{report.rejected()} total=\{report.total()}"
}