/**
 * 分类/渠道颜色统一色板（docs/ui-redesign-design.md §3.2）。
 *
 * 纯 TS 模块，不依赖 React Native 与 domain 层，因此：
 * - components/（CategoryPicker 等）用它给分类配色；
 * - domain/channelConfig.ts 用它引用渠道品牌色；
 * 全工程的颜色字面量只允许存在于 presets.ts 与本文件（P5 grep 审计）。
 */

/** 12 色循环色板：未知/用户自定义分类按 id 哈希取色。 */
export const CATEGORY_PALETTE = [
  '#D97706', // Amber
  '#3B82F6', // Blue
  '#EC4899', // Pink
  '#06B6D4', // Cyan
  '#6366F1', // Indigo
  '#8B5CF6', // Purple
  '#10B981', // Emerald
  '#64748B', // Slate
  '#F43F5E', // Rose
  '#14B8A6', // Teal
  '#EF4444', // Red
  '#65A30D', // Lime
] as const;

/** 内置分类具名颜色（Amber/Lime 已加深以满足 WCAG 非文本对比度 ≥3:1）。 */
const NAMED_CATEGORY_COLORS: Record<string, string> = {
  food: '#D97706',
  transport: '#3B82F6',
  shopping: '#EC4899',
  housing_utility: '#06B6D4',
  housing_rent: '#6366F1',
  housing_communication: '#8B5CF6',
  entertainment: '#10B981',
  services: '#64748B',
  personal_care: '#F43F5E',
  clothing: '#14B8A6',
  health: '#EF4444',
  learning: '#65A30D',
  salary: '#22C55E',
  income_activity: '#EF4444',
  income_investment: '#D97706',
};

/**
 * 本地 FNV-1a 哈希。
 * 注：domain/ledger.ts 也有 hash()，但 theme 层不反向依赖 domain 解析器，故保留这份 8 行实现。
 */
function fnv1a(input: string): number {
  let h = 0x811c9dc5;
  for (let i = 0; i < input.length; i++) {
    h ^= input.charCodeAt(i);
    h = Math.imul(h, 0x01000193);
  }
  return h >>> 0;
}

/** 取分类颜色：具名映射优先，否则按 id 哈希在 12 色板内确定性循环。 */
export function getCategoryColor(categoryId: string): string {
  // 用 hasOwn 防止 'constructor'/'toString' 等 id 经原型链命中假值
  const named = Object.hasOwn(NAMED_CATEGORY_COLORS, categoryId)
    ? NAMED_CATEGORY_COLORS[categoryId]
    : undefined;
  if (named) return named;
  return CATEGORY_PALETTE[fnv1a(categoryId) % CATEGORY_PALETTE.length];
}

/** 渠道品牌色（供 domain/channelConfig.ts 引用）。 */
export const CHANNEL_BRAND_COLORS = {
  alipay: '#1677FF',
  wechat: '#07C160',
  bank: '#E53935',
} as const;

/** 标签可选色（tag 页颜色选择器与内置默认标签共用）。 */
export const TAG_COLORS = [
  '#F44336', '#E91E63', '#9C27B0', '#2196F3',
  '#00BCD4', '#4CAF50', '#FF9800', '#795548',
] as const;
