///|
pub struct ProviderCapabilities {
  profile : ProviderProfile
  supports_timestamp : Bool
  supports_event_id : Bool
  supports_event_type : Bool
  recommended_window_seconds : Int
  notes : String
} derive(Eq, Debug)

///|
pub fn ProviderCapabilities::new(
  profile : ProviderProfile,
  supports_timestamp : Bool,
  supports_event_id : Bool,
  supports_event_type : Bool,
  recommended_window_seconds : Int,
  notes : String,
) -> ProviderCapabilities {
  {
    profile,
    supports_timestamp,
    supports_event_id,
    supports_event_type,
    recommended_window_seconds,
    notes,
  }
}

///|
pub fn github_capabilities() -> ProviderCapabilities {
  ProviderCapabilities::new(
    ProviderProfile::github(),
    false,
    true,
    true,
    300,
    "GitHub HMAC-SHA256 raw-body signature plus delivery id; no signed timestamp.",
  )
}

///|
pub fn feishu_capabilities() -> ProviderCapabilities {
  ProviderCapabilities::new(
    ProviderProfile::feishu(),
    true,
    true,
    true,
    300,
    "Feishu style request timestamp and nonce headers.",
  )
}

///|
pub fn stripe_capabilities() -> ProviderCapabilities {
  ProviderCapabilities::new(
    ProviderProfile::stripe(),
    true,
    true,
    true,
    300,
    "Stripe style versioned signature and event id mapping.",
  )
}

///|
pub fn generic_capabilities() -> ProviderCapabilities {
  ProviderCapabilities::new(
    ProviderProfile::generic(),
    true,
    true,
    true,
    300,
    "Generic HMAC-like webhook profile for internal systems.",
  )
}

///|
pub fn capabilities_catalog() -> Array[ProviderCapabilities] {
  [
    github_capabilities(),
    feishu_capabilities(),
    stripe_capabilities(),
    generic_capabilities(),
  ]
}

///|
pub fn capability_for(name : String) -> ProviderCapabilities {
  let catalog = capabilities_catalog()
  for i in 0.. VerificationPolicy {
  VerificationPolicy::for_provider(capability_for(provider_name).profile)
  .with_secret(secret)
  .with_clock(now)
}

///|
pub fn provider_markdown_table() -> String {
  let catalog = capabilities_catalog()
  let builder = StringBuilder::new()
  builder.write_string("| provider | signature | timestamp | event | id |\n")
  builder.write_string("| --- | --- | --- | --- | --- |\n")
  for i in 0.. WebhookRequest {
  { ..request, provider: capability_for(provider_name).profile.name }
}

///|
pub fn describe_provider(provider_name : String) -> String {
  let cap = capability_for(provider_name)
  cap.profile.name + ": " + cap.notes
}