import { arrowIcons } from './generated/arrow'
import { audioIcons } from './generated/audio'
import { cutIcons } from './generated/cut'
import { editIcons } from './generated/edit'
import { featureIcons } from './generated/feature'
import { fileIcons } from './generated/file'
import { filterIcons } from './generated/filter'
import { indicatorIcons } from './generated/indicator'
import { inputIcons } from './generated/input'
import { loadIcons } from './generated/load'
import { locationIcons } from './generated/location'
import { logoIcons } from './generated/logo'
import { markIcons } from './generated/mark'
import { meetingIcons } from './generated/meeting'
import { menuIcons } from './generated/menu'
import { messageIcons } from './generated/message'
import { networkIcons } from './generated/network'
import { othersIcons } from './generated/others'
import { outputIcons } from './generated/output'
import { payIcons } from './generated/pay'
import { pictureIcons } from './generated/picture'
import { previewIcons } from './generated/preview'
import { searchIcons } from './generated/search'
import { settingIcons } from './generated/setting'
import { shareIcons } from './generated/share'
import { timeIcons } from './generated/time'
import { userIcons } from './generated/user'
import { videoIcons } from './generated/video'
import type { IconCategoryRegistry } from '../types'
import { iconCatalogManifest } from './manifest'

export { iconCatalogManifest } from './manifest'

export const iconCatalogRegistry: IconCategoryRegistry = {
  "arrow": arrowIcons,
  "audio": audioIcons,
  "cut": cutIcons,
  "edit": editIcons,
  "feature": featureIcons,
  "file": fileIcons,
  "filter": filterIcons,
  "indicator": indicatorIcons,
  "input": inputIcons,
  "load": loadIcons,
  "location": locationIcons,
  "logo": logoIcons,
  "mark": markIcons,
  "meeting": meetingIcons,
  "menu": menuIcons,
  "message": messageIcons,
  "network": networkIcons,
  "others": othersIcons,
  "output": outputIcons,
  "pay": payIcons,
  "picture": pictureIcons,
  "preview": previewIcons,
  "search": searchIcons,
  "setting": settingIcons,
  "share": shareIcons,
  "time": timeIcons,
  "user": userIcons,
  "video": videoIcons,
}

export const iconCatalogNameAliases = Object.freeze(
  iconCatalogManifest.reduce<Record<string, string>>((aliases, definition) => {
    aliases[definition.name] = definition.name
    return aliases
  }, {}),
)

export const iconCatalog = Object.freeze(
  Object.values(iconCatalogRegistry).reduce<Record<string, string>>((registry, group) => {
    Object.assign(registry, group)
    return registry
  }, {}),
)

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

  return iconCatalog[iconCatalogNameAliases[name] ?? name] ?? null
}
