
export class ThemeValidationError extends Error {
  override readonly name = 'ThemeValidationError'
  readonly code = 'THEME_VALIDATION' as const
  constructor(readonly field: string, readonly detail: string) {
    super(`theme validation: ${field} — ${detail}`)
  }
}

export class ThemeColorFormatError extends Error {
  override readonly name = 'ThemeColorFormatError'
  readonly code = 'THEME_COLOR_FORMAT' as const
  constructor(readonly field: string, readonly detail: string) {
    super(`theme color format: ${field} — expected hex, got ${detail}`)
  }
}

export class ThemeResolutionError extends Error {
  override readonly name = 'ThemeResolutionError'
  readonly code = 'THEME_RESOLUTION' as const
  constructor(readonly detail: string) {
    super(`theme resolution: ${detail}`)
  }
}

export class ThemeOverrideError extends Error {
  override readonly name = 'ThemeOverrideError'
  readonly code = 'THEME_OVERRIDE' as const
  constructor(readonly key: string) {
    super(`theme override: unknown token key — ${key}`)
  }
}

export type ThemeError =
  | ThemeValidationError
  | ThemeColorFormatError
  | ThemeResolutionError
  | ThemeOverrideError

/** Structural guard — matches any THEME_-coded error object. NEVER use `instanceof` across packages. */
export function isThemeError(e: unknown): e is { code: string; message?: string } {
  return (
    typeof e === 'object' &&
    e !== null &&
    'code' in e &&
    typeof (e as { code: unknown }).code === 'string' &&
    (e as { code: string }).code.startsWith('THEME_')
  )
}
