///|
pub fn BrandBook::render_component_catalog(self : BrandBook) -> String {
  let sections : Array[String] = []
  for component in self.components {
    sections.push(component.render_usage_card())
  }
  if sections.length() == 0 {
    "No components defined."
  } else {
    sections.join("\n\n")
  }
}

///|
pub fn ComponentSpec::render_usage_card(self : ComponentSpec) -> String {
  join_lines([
    "### " + self.name,
    "",
    self.purpose,
    "",
    "**Anatomy**: " + self.anatomy.join(", "),
    "",
    "**Tokens**: " + self.tokens.join(", "),
    "",
    "**States**: " + self.states.join(", "),
    "",
    self.render_state_matrix(),
  ])
}

///|
pub fn ComponentSpec::render_state_matrix(self : ComponentSpec) -> String {
  let lines : Array[String] = ["| State | Token references |", "| --- | --- |"]
  for state in self.states {
    lines.push("| " + state + " | " + self.tokens.join(", ") + " |")
  }
  lines.join("\n")
}

///|
pub fn ComponentSpec::render_token_checklist(self : ComponentSpec) -> String {
  let lines : Array[String] = []
  for token in self.tokens {
    lines.push("- [ ] " + token)
  }
  if lines.length() == 0 {
    "- [ ] Add token references"
  } else {
    lines.join("\n")
  }
}

///|
pub fn ComponentSpec::render_anatomy_list(self : ComponentSpec) -> String {
  self.anatomy.map(fn(part) { "1. " + part }).join("\n")
}

///|
pub fn BrandBook::component_names(self : BrandBook) -> Array[String] {
  let names : Array[String] = []
  for component in self.components {
    names.push(component.name)
  }
  names
}

///|
pub fn BrandBook::find_component(
  self : BrandBook,
  name : String,
) -> ComponentSpec? {
  for component in self.components {
    if component.name == name {
      return Some(component)
    }
  }
  None
}

///|
pub fn BrandBook::components_using_token(
  self : BrandBook,
  token : String,
) -> Array[String] {
  let result : Array[String] = []
  for component in self.components {
    if component.tokens.any(fn(item) { item == token }) {
      result.push(component.name)
    }
  }
  result
}