import type { TokenColor, TokenRadius, TokenFontSize, TokenWeight } from '../tokens'

/** Re-alias of ui-tokens' TokenColor — the contrast pairs + ColorTokens key off this. */
export type ColorTokenKey = TokenColor

/**
 * Shape keys are NAMESPACED on purpose: bare scale names collide ('sm'/'lg'/'xl' are
 * both a radius AND a font-size), and EffectiveTokens flattens color+shape into one
 * record. Space is EXCLUDED — ui-tokens ships no `--mod-space-*` custom property.
 */
export type ShapeTokenKey =
  | `radius-${TokenRadius}`
  | `font-size-${TokenFontSize}`
  | `font-weight-${TokenWeight}`
// New scales in ui-tokens are CSS-only @theme mappings and intentionally excluded from EffectiveTokens.

export type ColorTokens = Record<ColorTokenKey, string>   // value = HEX (#rgb / #rrggbb), per spec §2b
export type ShapeTokens = Record<ShapeTokenKey, string>   // value = CSS length / number string

export type ModePair<T> = { light: T; dark: T }

export interface Palette {
  id: string                       // stable, kebab-case
  name: string                     // human label
  colors: ModePair<ColorTokens>    // BOTH modes REQUIRED
}

/** Optional per-code decorative SVG markup for the ErrorState visual slot. Unvalidated, decorative. */
export type ErrorArtMap = Record<string, string>

export interface PaletteSet {
  id: string                       // stable, kebab-case; unique within an install
  name: string
  palettes: Palette[]              // >= 1
  defaultPaletteId: string         // MUST match a palettes[].id
  shape: ModePair<ShapeTokens>     // non-color tokens, per mode
  meta?: { author?: string; version?: string; description?: string }
  errorArt?: ErrorArtMap
}

export interface ActiveSelection {
  themeId: string
  paletteId: string
  mode: 'light' | 'dark' | 'system'
  overrides?: Partial<ColorTokens & ShapeTokens>
}

export type EffectiveTokens = ColorTokens & ShapeTokens   // resolved, single mode

export type ContrastLevel = 'text' | 'ui'                 // text => AA 4.5 ; ui => AA 3.0
export interface ContrastPair { fg: ColorTokenKey; bg: ColorTokenKey; level: ContrastLevel }

/** A single-mode contrast failure (no palette/mode context — produced by validateContrastTokens). */
export interface ContrastPairFailure {
  fg: ColorTokenKey
  bg: ColorTokenKey
  ratio: number
  required: number
}
/** A two-mode contrast failure — single-mode failure + its palette/mode coordinates. */
export interface ContrastFailure extends ContrastPairFailure {
  paletteId: string
  mode: 'light' | 'dark'
}
export interface ContrastTokenReport { pass: boolean; failures: ContrastPairFailure[] }
export interface ContrastReport { pass: boolean; failures: ContrastFailure[] }

/** Discriminated result — theme-engine defines its own (no shared Result type in the monorepo). */
export type Result<T, E> = { ok: true; value: T } | { ok: false; error: E }
