import type { AgentPsdTextColorBrandConfig, AgentPsdTextColorConfig } from "@/types/agent"; import { normalizeHexColor } from "@/lib/agents/psd-text-layout"; export const AGENT_PSD_TEXT_COLOR_CONFIG_KEY = "agent_psd_text_color_config"; export const defaultAgentPsdTextColorConfig: AgentPsdTextColorConfig = { enabled: false, colors: ["#ffffff", "#111111"], brandConfigs: [], }; function normalizeBrandName(value: unknown) { return String(value || "").trim().slice(0, 64); } function normalizeColors(value: unknown, fallback: [string, string]) { const colors = Array.isArray(value) ? value .map((item) => normalizeHexColor(String(item || ""), "")) .filter(Boolean) .slice(0, 2) : []; return [ colors[0] || fallback[0], colors[1] || colors[0] || fallback[1], ] as [string, string]; } export function normalizeAgentPsdTextColorConfig( value: unknown ): AgentPsdTextColorConfig { const raw = value && typeof value === "object" && !Array.isArray(value) ? (value as Record) : {}; const baseColors = normalizeColors(raw.colors, defaultAgentPsdTextColorConfig.colors); const uniqueBrandConfigs = new Map(); if (Array.isArray(raw.brandConfigs)) { raw.brandConfigs.forEach((item) => { const record = item && typeof item === "object" && !Array.isArray(item) ? (item as Record) : {}; const brandName = normalizeBrandName(record.brandName); if (!brandName) { return; } uniqueBrandConfigs.set(brandName.toLowerCase(), { brandName, enabled: record.enabled === true, colors: normalizeColors(record.colors, baseColors), }); }); } return { enabled: raw.enabled === true, colors: baseColors, brandConfigs: Array.from(uniqueBrandConfigs.values()).sort((left, right) => left.brandName.localeCompare(right.brandName, "zh-CN") ), }; } export function resolveAgentPsdTextColorConfigForBrand( config: AgentPsdTextColorConfig | null | undefined, brandName?: string | null ): AgentPsdTextColorConfig { const normalized = normalizeAgentPsdTextColorConfig(config); const requestedBrand = normalizeBrandName(brandName); if (!requestedBrand) { return normalized; } const matchedBrandConfig = (normalized.brandConfigs || []).find( (entry) => entry.brandName.toLowerCase() === requestedBrand.toLowerCase() ); if (!matchedBrandConfig) { return normalized; } return { ...normalized, enabled: matchedBrandConfig.enabled, colors: matchedBrandConfig.colors, }; }