import { describe, it, expect } from 'vitest'
import * as engine from './index'
import { contrastRatio, parseHex, relativeLuminance, type Rgb } from './index'

describe('theme-engine public barrel', () => {
  it('exports the public functions + CONTRAST_PAIRS + errors + guard', () => {
    for (const name of [
      'validatePaletteSet', 'validateContrast', 'validateContrastTokens', 'resolveMode',
      'resolveActiveTheme', 'mergeOverrides', 'applyTheme', 'themeToCss', 'subscribeToSystemMode',
    ]) expect(typeof (engine as Record<string, unknown>)[name]).toBe('function')
    for (const name of ['parseHex', 'relativeLuminance', 'contrastRatio'])
      expect(typeof (engine as Record<string, unknown>)[name]).toBe('function')
    expect(Array.isArray(engine.CONTRAST_PAIRS)).toBe(true)
    expect(typeof engine.isThemeError).toBe('function')
    expect(typeof engine.ThemeValidationError).toBe('function')
    expect(typeof engine.ThemeColorFormatError).toBe('function')
    expect(typeof engine.ThemeResolutionError).toBe('function')
    expect(typeof engine.ThemeOverrideError).toBe('function')
  })
  it('does NOT leak internal helpers', () => {
    const e = engine as Record<string, unknown>
    for (const internal of ['cssVarFor', 'makeValidPaletteSet'])
      expect(e[internal]).toBeUndefined()
  })
})

describe('theme-engine barrel — contrast primitives', () => {
  it('re-exports parseHex (hex → rgb tuple)', () => {
    expect(parseHex('#ffffff')).toEqual([255, 255, 255])
    expect(parseHex('not-a-hex')).toBeNull()
  })

  it('re-exports contrastRatio (WCAG ratio, ~21 for black/white)', () => {
    const ratio = contrastRatio(parseHex('#000000')!, parseHex('#ffffff')!)
    expect(ratio).toBeCloseTo(21, 0)
  })

  it('re-exports relativeLuminance (0 for black, ~1 for white)', () => {
    expect(relativeLuminance(parseHex('#000000')!)).toBeCloseTo(0, 5)
    expect(relativeLuminance(parseHex('#ffffff')!)).toBeCloseTo(1, 5)
  })

  it('re-exports the Rgb type for type-only seam wiring', () => {
    // Compile-time proof Rgb is nameable from the public barrel (DTS completeness).
    const ink: Rgb = parseHex('#000000')!
    const bg: Rgb = [255, 255, 255]
    expect(contrastRatio(ink, bg)).toBeCloseTo(21, 0)
  })
})
