import { describe, expect, it } from 'vitest'

import {
  iconManifest,
  iconCategoryRegistry,
  iconNameAliases,
  iconRegistry,
  resolveIcon,
} from '../src/icons'
import { loadCatalogIcon } from '../src/icons/catalog/runtime'

describe('icon architecture', () => {
  it('keeps a manifest entry for every categorized icon', () => {
    const iconNames = new Set<string>()

    for (const definition of iconManifest) {
      expect(iconNames.has(definition.name)).toBe(false)
      iconNames.add(definition.name)

      expect(iconCategoryRegistry[definition.category][definition.name]).toBeTypeOf('string')
      expect(iconRegistry[definition.name]).toBe(iconCategoryRegistry[definition.category][definition.name])
    }
  })

  it('resolves both category names and legacy aliases', () => {
    expect(resolveIcon('time/clock')).toBe(resolveIcon('clock'))
    expect(resolveIcon('navigation/arrow-dropdown')).toBe(resolveIcon('arrow-dropdown'))
    expect(resolveIcon('action/selected')).toBe(resolveIcon('selected'))
  })

  it('maps aliases back to canonical names', () => {
    expect(iconNameAliases.clock).toBe('time/clock')
    expect(iconNameAliases['arrow-dropdown']).toBe('navigation/arrow-dropdown')
    expect(iconNameAliases.selected).toBe('action/selected')
  })

  it('loads generated catalog icons by category on demand', async () => {
    const skin = await loadCatalogIcon('setting/skin')
    const english = await loadCatalogIcon('setting/english')
    const chinese = await loadCatalogIcon('setting/chinese')

    expect(resolveIcon('setting/skin')).toBeNull()
    expect(skin).toContain('<svg')
    expect(english).toContain('<svg')
    expect(chinese).toContain('<svg')
  })
})
