import { actionIcons } from './generated/action'
import { navigationIcons } from './generated/navigation'
import { timeIcons } from './generated/time'
import { statusIcons } from './generated/status'
import { ratingIcons } from './generated/rating'
import { themeIcons } from './generated/theme'
import { brandIcons } from './generated/brand'
import { iconManifest } from './manifest'
import type { IconCategoryRegistry } from './types'

export const iconCategoryRegistry: IconCategoryRegistry = {
  action: actionIcons,
  navigation: navigationIcons,
  time: timeIcons,
  status: statusIcons,
  rating: ratingIcons,
  theme: themeIcons,
  brand: brandIcons,
}

export const iconNameAliases = Object.freeze(
  iconManifest.reduce<Record<string, string>>((aliases, definition) => {
    aliases[definition.name] = definition.name
    for (const alias of definition.aliases ?? []) {
      aliases[alias] = definition.name
    }
    return aliases
  }, {}),
)

export const iconRegistry = Object.freeze(
  iconManifest.reduce<Record<string, string>>((registry, definition) => {
    const svg = iconCategoryRegistry[definition.category][definition.name]
    registry[definition.name] = svg
    for (const alias of definition.aliases ?? []) {
      registry[alias] = svg
    }
    return registry
  }, {}),
)

export function resolveIcon(name: string | null | undefined) {
  if (!name) {
    return null
  }

  const normalizedName = iconNameAliases[name] ?? name
  return iconRegistry[normalizedName] ?? null
}

export function listIconsByCategory(category: keyof typeof iconCategoryRegistry) {
  return Object.entries(iconCategoryRegistry[category]).map(([name, svg]) => ({ name, svg }))
}
