///|
pub struct DebugSnapshot {
  canonical : String
  expected_signature : String
  actual_signature : String
  masked_secret : String
  headers : String
} derive(Eq, Debug)

///|
pub fn DebugSnapshot::new(
  canonical : String,
  expected_signature : String,
  actual_signature : String,
  masked_secret : String,
  headers : String,
) -> DebugSnapshot {
  { canonical, expected_signature, actual_signature, masked_secret, headers }
}

///|
pub fn debug_snapshot(
  request : WebhookRequest,
  policy : VerificationPolicy,
) -> DebugSnapshot {
  DebugSnapshot::new(
    canonical_base(request, policy.provider),
    expected_signature(request, policy),
    request.signature(policy.provider.signature_header),
    mask_secret(policy.secret),
    headers_to_text(request.headers),
  )
}

///|
pub fn debug_snapshot_text(snapshot : DebugSnapshot) -> String {
  let builder = StringBuilder::new()
  builder.write_string("secret=")
  builder.write_string(snapshot.masked_secret)
  builder.write_string("\nexpected=")
  builder.write_string(snapshot.expected_signature)
  builder.write_string("\nactual=")
  builder.write_string(snapshot.actual_signature)
  builder.write_string("\nheaders=\n")
  builder.write_string(snapshot.headers)
  builder.write_string("canonical=\n")
  builder.write_string(snapshot.canonical)
  builder.to_string()
}

///|
pub fn explain_verification(
  request : WebhookRequest,
  policy : VerificationPolicy,
) -> String {
  let result = verify_request(request, policy)
  let snapshot = debug_snapshot(request, policy)
  let builder = StringBuilder::new()
  builder.write_string(result.to_text())
  builder.write_string("\n")
  builder.write_string(result_help(result))
  builder.write_string(debug_snapshot_text(snapshot))
  builder.to_string()
}