///|
pub(all) enum RegistryKind {
  Template
  Preset
  Theme
} derive(Debug, Eq)

///|
pub fn template_search(query : String) -> Array[TemplateInfo] {
  let needle = query.to_lower()
  list_templates().filter(info => {
    info.name.to_lower().contains(needle) ||
    info.summary.to_lower().contains(needle)
  })
}

///|
pub fn preset_search(query : String) -> Array[PresetInfo] {
  let needle = query.to_lower()
  list_presets().filter(info => {
    info.name.to_lower().contains(needle) ||
    info.summary.to_lower().contains(needle)
  })
}

///|
pub fn theme_search(query : String) -> Array[ThemeInfo] {
  let needle = query.to_lower()
  list_themes().filter(info => {
    info.name.to_lower().contains(needle) ||
    info.summary.to_lower().contains(needle)
  })
}

///|
pub fn templates_for_preset(preset : String) -> Array[TemplateInfo] {
  list_templates().filter(info => {
    info.supported_presets.any(name => name == preset)
  })
}

///|
pub fn templates_for_theme(theme : String) -> Array[TemplateInfo] {
  list_templates().filter(info => {
    info.supported_themes.any(name => name == theme)
  })
}

///|
pub fn registry_names(kind : RegistryKind) -> Array[String] {
  match kind {
    Template => template_names()
    Preset => preset_names()
    Theme => theme_names()
  }
}

///|
pub fn registry_contains(kind : RegistryKind, name : String) -> Bool {
  registry_names(kind).any(value => value == name)
}

///|
pub fn registry_summary() -> String {
  "templates=" +
  list_templates().length().to_string() +
  ",presets=" +
  list_presets().length().to_string() +
  ",themes=" +
  list_themes().length().to_string()
}