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 { fileIcons } from './generated/file'
import { communicationIcons } from './generated/communication'
import { indicatorIcons } from './generated/indicator'
import { featureIcons } from './generated/feature'
import { mediaIcons } from './generated/media'
import { networkIcons } from './generated/network'
import { settingIcons } from './generated/setting'
import { othersIcons } from './generated/others'
import { userIcons } from './generated/user'
import { inputIcons } from './generated/input'
import { outputIcons } from './generated/output'
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,
  file: fileIcons,
  communication: communicationIcons,
  indicator: indicatorIcons,
  feature: featureIcons,
  media: mediaIcons,
  network: networkIcons,
  setting: settingIcons,
  others: othersIcons,
  user: userIcons,
  input: inputIcons,
  output: outputIcons,
}

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 }))
}
