import { describe, it, expect } from 'vitest'
import type {
  ColorTokenKey, ShapeTokenKey, ColorTokens, ShapeTokens, ModePair,
  Palette, PaletteSet, ActiveSelection, EffectiveTokens,
  ContrastLevel, ContrastPair, ContrastReport, Result, ErrorArtMap,
} from './types'

describe('theme-engine types', () => {
  it('compose into a structurally-valid PaletteSet value', () => {
    const colors: Partial<ColorTokens> = { fg: '#000000', bg: '#ffffff' }
    const shape: Partial<ShapeTokens> = { 'radius-sm': '0.125rem', 'font-size-base': '1rem' }
    const pair: ContrastPair = { fg: 'fg', bg: 'bg', level: 'text' }
    const level: ContrastLevel = 'ui'
    const report: ContrastReport = { pass: true, failures: [] }
    const ok: Result<number, string> = { ok: true, value: 1 }
    const err: Result<number, string> = { ok: false, error: 'x' }
    const sel: ActiveSelection = { themeId: 't', paletteId: 'p', mode: 'system' }
    const art: ErrorArtMap = { '404': '<svg/>' }
    expect([colors, shape, pair, level, report, ok, err, sel, art]).toHaveLength(9)
    // ModePair / Palette / PaletteSet / EffectiveTokens used at type level below:
    const pair2: ModePair<number> = { light: 1, dark: 2 }
    expect(pair2.light + pair2.dark).toBe(3)
  })
})

// compile-time shape assertions (no runtime): a drift here fails `tsc --noEmit`
type _ColorKeyIsTokenColor = ColorTokenKey extends string ? true : never
type _EffIsColorAndShape = EffectiveTokens extends ColorTokens & ShapeTokens ? true : never
const _palette = (): Palette => ({ id: 'p', name: 'P', colors: { light: {} as ColorTokens, dark: {} as ColorTokens } })
const _pkg = (): PaletteSet => ({
  id: 't', name: 'T', palettes: [_palette()], defaultPaletteId: 'p',
  shape: { light: {} as ShapeTokens, dark: {} as ShapeTokens },
})
void _palette; void _pkg
const _assert1: _ColorKeyIsTokenColor = true; void _assert1
const _assert2: _EffIsColorAndShape = true; void _assert2
