///|
pub fn TokenCatalog::colors(self : TokenCatalog) -> Array[CatalogEntry] {
  self.by_kind(Color)
}

///|
pub fn TokenCatalog::numbers(self : TokenCatalog) -> Array[CatalogEntry] {
  self.by_kind(Number)
}

///|
pub fn TokenCatalog::texts(self : TokenCatalog) -> Array[CatalogEntry] {
  self.by_kind(Text)
}

///|
pub fn TokenCatalog::booleans(self : TokenCatalog) -> Array[CatalogEntry] {
  self.by_kind(Boolean)
}

///|
pub fn TokenCatalog::names_for_query(
  self : TokenCatalog,
  query : String,
) -> Array[String] {
  let result : Array[String] = []
  for entry in self.search(query) {
    result.push(entry.name)
  }
  result
}

///|
pub fn TokenCatalog::paths_for_prefix(
  self : TokenCatalog,
  prefix : String,
) -> Array[String] {
  let result : Array[String] = []
  for entry in self.by_prefix(prefix) {
    result.push(entry.path)
  }
  result
}

///|
pub fn TokenCatalog::grouped_markdown(self : TokenCatalog) -> String {
  let sections : Array[String] = []
  let kinds = [Color, Number, Text, Boolean]
  for kind in kinds {
    let entries = self.by_kind(kind)
    if entries.length() > 0 {
      sections.push("### " + token_kind_name(kind))
      sections.push("")
      for entry in entries {
        sections.push(
          "- `" + entry.path + "`: " + theme_value_display(entry.value),
        )
      }
    }
  }
  sections.join("\n")
}

///|
pub fn CatalogStats::summary(self : CatalogStats) -> String {
  "total=" +
  self.total.to_string() +
  ", colors=" +
  self.color_count.to_string() +
  ", numbers=" +
  self.number_count.to_string() +
  ", text=" +
  self.text_count.to_string() +
  ", booleans=" +
  self.boolean_count.to_string() +
  ", documented=" +
  self.documentation_rate().to_string() +
  "%"
}

///|
pub fn BrandBook::token_catalog_markdown(self : BrandBook) -> String {
  TokenCatalog::from_brand_book(self).to_markdown()
}

///|
pub fn BrandBook::token_catalog_stats(self : BrandBook) -> CatalogStats {
  TokenCatalog::from_brand_book(self).stats()
}

///|
pub fn BrandBook::search_tokens(
  self : BrandBook,
  query : String,
) -> Array[CatalogEntry] {
  TokenCatalog::from_brand_book(self).search(query)
}