///|
pub struct IntegrationGuide {
  manifest : String
  endpoints : String
  cookbook : String
  quality : String
  scenarios : String
} derive(Eq, Debug)

///|
pub fn IntegrationGuide::new(
  manifest : String,
  endpoints : String,
  cookbook : String,
  quality : String,
  scenarios : String,
) -> IntegrationGuide {
  { manifest, endpoints, cookbook, quality, scenarios }
}

///|
pub fn build_integration_guide(config : GuardConfig) -> IntegrationGuide {
  IntegrationGuide::new(
    manifest_markdown(default_manifest(config)),
    endpoint_catalog_markdown(config.router),
    combined_cookbook(),
    quality_text(validate_config(config)),
    scenario_report(run_scenarios(scenario_suite(), config)),
  )
}

///|
pub fn integration_guide_markdown(guide : IntegrationGuide) -> String {
  let builder = StringBuilder::new()
  builder.write_string("# moon_webhook_guard Integration Guide\n\n")
  builder.write_string("## Manifest\n\n")
  builder.write_string(guide.manifest)
  builder.write_string("\n## Endpoints\n\n")
  builder.write_string(guide.endpoints)
  builder.write_string("\n## Cookbooks\n\n")
  builder.write_string(guide.cookbook)
  builder.write_string("\n## Quality\n\n```text\n")
  builder.write_string(guide.quality)
  builder.write_string("```\n\n## Scenarios\n\n")
  builder.write_string(guide.scenarios)
  builder.to_string()
}

///|
pub fn default_integration_guide() -> String {
  integration_guide_markdown(build_integration_guide(GuardConfig::default()))
}

///|
pub fn integration_summary(config : GuardConfig) -> String {
  let guide = build_integration_guide(config)
  "manifest=\{guide.manifest.length()} endpoints=\{guide.endpoints.length()} scenarios=\{guide.scenarios.length()}"
}