///|
pub struct GuardManifest {
  name : String
  version : String
  providers : Array[String]
  routes : Int
  checks : Array[String]
} derive(Eq, Debug)

///|
pub fn GuardManifest::new(
  name : String,
  version : String,
  providers : Array[String],
  routes : Int,
  checks : Array[String],
) -> GuardManifest {
  { name, version, providers, routes, checks }
}

///|
pub fn default_manifest(config : GuardConfig) -> GuardManifest {
  let catalog = capabilities_catalog()
  let providers = Array::makei(catalog.length(), i => catalog[i].profile.name)
  GuardManifest::new(
    package_name(),
    version(),
    providers,
    config.router.enabled_count(),
    ["signature", "timestamp", "event_id", "replay", "idempotency", "routing"],
  )
}

///|
pub fn manifest_markdown(manifest : GuardManifest) -> String {
  let builder = StringBuilder::new()
  builder.write_string("# ")
  builder.write_string(manifest.name)
  builder.write_string("\n\nversion: ")
  builder.write_string(manifest.version)
  builder.write_string("\n\nproviders: ")
  for i in 0.. 0 {
      builder.write_string(", ")
    }
    builder.write_string(manifest.providers[i])
  }
  builder.write_string("\n\nroutes: ")
  builder.write_string(manifest.routes.to_string())
  builder.write_string("\n\nchecks: ")
  for i in 0.. 0 {
      builder.write_string(", ")
    }
    builder.write_string(manifest.checks[i])
  }
  builder.write_string("\n")
  builder.to_string()
}

///|
pub fn manifest_json_like(manifest : GuardManifest) -> String {
  let builder = StringBuilder::new()
  builder.write_string("{\"name\":\"")
  builder.write_string(manifest.name)
  builder.write_string("\",\"version\":\"")
  builder.write_string(manifest.version)
  builder.write_string("\",\"routes\":")
  builder.write_string(manifest.routes.to_string())
  builder.write_string(",\"checks\":[")
  for i in 0.. 0 {
      builder.write_string(",")
    }
    builder.write_string("\"")
    builder.write_string(manifest.checks[i])
    builder.write_string("\"")
  }
  builder.write_string("]}")
  builder.to_string()
}