///|
pub struct EndpointSpec {
  provider : String
  path : String
  http_method : HttpMethod
  headers : Array[String]
  events : Array[String]
} derive(Eq, Debug)

///|
pub fn EndpointSpec::new(
  provider : String,
  path : String,
  http_method : HttpMethod,
  headers : Array[String],
  events : Array[String],
) -> EndpointSpec {
  { provider, path, http_method, headers, events }
}

///|
pub fn endpoint_for_profile(
  profile : ProviderProfile,
  path : String,
) -> EndpointSpec {
  let headers = match profile.name {
    "github" =>
      [
        profile.signature_header,
        profile.event_type_header,
        profile.event_id_header,
      ]
    "stripe" => [profile.signature_header]
    "feishu" =>
      [
        profile.signature_header,
        profile.timestamp_header,
        "x-lark-request-nonce",
      ]
    _ =>
      [
        profile.signature_header,
        profile.timestamp_header,
        profile.event_type_header,
        profile.event_id_header,
      ]
  }
  EndpointSpec::new(profile.name, path, Post, headers, [])
}

///|
pub fn endpoint_from_router(
  profile : ProviderProfile,
  router : EventRouter,
  path : String,
) -> EndpointSpec {
  let mut count = 0
  for i in 0.. {
    while offset < router.rules.length() {
      let rule = router.rules[offset]
      offset = offset + 1
      if rule.provider == profile.name && rule.path == path {
        return rule.event_type
      }
    }
    ""
  })
  { ..endpoint_for_profile(profile, path), events, }
}

///|
pub fn endpoint_markdown(spec : EndpointSpec) -> String {
  let builder = StringBuilder::new()
  builder.write_string("## ")
  builder.write_string(spec.provider)
  builder.write_string(" ")
  builder.write_string(method_name(spec.http_method))
  builder.write_string(" ")
  builder.write_string(spec.path)
  builder.write_string("\n\nHeaders:\n")
  for i in 0.. String {
  let builder = StringBuilder::new()
  let providers = provider_catalog()
  for i in 0.. "/webhook/github"
      "feishu" => "/webhook/feishu"
      "stripe" => "/webhook/stripe"
      _ => "/webhook/generic"
    }
    builder.write_string(
      endpoint_markdown(endpoint_from_router(providers[i], router, path)),
    )
    builder.write_string("\n")
  }
  builder.to_string()
}