/**
 * 展示标签 + tone 元数据 — 后端 enum 跟前端 UI 之间的桥。
 *
 * 单一真理源,前后端共用。新加 enum 值时在这里加一行 label,前端自动拿到。
 */
import { PersonaFeatureKey, PlanScenario } from './enums';

// ─────────────────────────────────────────────────────────
// Tone — UI 色板键(brand=PAC 主色,其余对应 Tailwind 色板 indigo/amber/...)
// ─────────────────────────────────────────────────────────

export type Tone =
  | 'brand'
  | 'indigo'
  | 'emerald'
  | 'amber'
  | 'rose'
  | 'sky'
  | 'violet'
  | 'slate';

// ─────────────────────────────────────────────────────────
// PlanScenario 中文展示标签
// ─────────────────────────────────────────────────────────

export const PLAN_SCENARIO_LABEL: Record<string, string> = {
  [PlanScenario.TREATMENT_AFTERCARE_RECALL]: '疗效保障',
  [PlanScenario.TREATMENT_INITIATION_RECALL]: '潜在治疗',
  treatment_chain_disruption_recall: '链中断', // 待业务拍板,暂未入 enum
  missed_diagnosis_recall: '漏诊召回', // W6+ 影像 AI
};

export const planScenarioLabel = (key: string): string =>
  PLAN_SCENARIO_LABEL[key] ?? key;

// ─────────────────────────────────────────────────────────
// PersonaFeatureKey 中文展示 + UI tone
// ─────────────────────────────────────────────────────────

/**
 * 只登记**在跑的** 16 个标签 —— 与 PERSONA_FEATURE_SPECS 一一对应
 * (CI 对账见 pac-service tests/persona-spec-drift.spec.ts)。
 *
 * 曾经把 PersonaFeatureKey 里全部枚举值(含 W7 摘除的 value / treatment_chain_status /
 * recall_risk / do_not_contact_status,以及一批只存在于路线图上的候选 key)都列在这里,
 * 结果是"看着有 30 个标签、实际只出 16 个"。枚举保留路线图,展示元数据只登记真会上屏的。
 *
 * tone 的语义(客服要能扫一眼分轻重,所以红色是稀缺资源):
 *   rose   ⚠️ 警示 —— 看到要小心/要避让(禁忌、爽约、敏感、急迫)
 *   amber  ⏳ 机会 —— 有事可做(潜在治疗、治疗史这类可切入点)
 *   indigo 💰 价值 —— 钱与权益
 *   brand  📈 阶段 —— 客户所处位置
 *   sky/slate 基础属性 —— 不需要判断,只是背景信息
 */
export const PERSONA_FEATURE_META: Record<string, { label: string; tone: Tone }> = {
  // ⚠️ 警示
  [PersonaFeatureKey.URGENCY_LEVEL]: { label: '急迫等级', tone: 'rose' },
  [PersonaFeatureKey.SPECIAL_ATTENTION]: { label: '特别关注', tone: 'rose' },
  [PersonaFeatureKey.CONTRAINDICATION]: { label: '禁忌标签', tone: 'rose' },
  [PersonaFeatureKey.TREATMENT_SENSITIVITY]: { label: '治疗敏感', tone: 'rose' },
  // ⏳ 机会 / 可切入点
  [PersonaFeatureKey.POTENTIAL_TREATMENT]: { label: '潜在治疗', tone: 'amber' },
  [PersonaFeatureKey.TREATMENT_HISTORY]: { label: '治疗史', tone: 'amber' },
  // 💰 价值与权益(折扣锚点是价格参考,不是警示 —— 原来标红与"禁忌"同色,轻重不分)
  [PersonaFeatureKey.RFM]: { label: '价值分群', tone: 'indigo' },
  [PersonaFeatureKey.ENTITLEMENT_STATUS]: { label: '权益身份', tone: 'indigo' },
  [PersonaFeatureKey.DISCOUNT_ANCHOR]: { label: '折扣锚点', tone: 'indigo' },
  // 📈 阶段与关系(转介绍达人是正面信息,同理不该标红)
  [PersonaFeatureKey.LIFECYCLE_STAGE]: { label: '生命周期', tone: 'brand' },
  [PersonaFeatureKey.REFERRAL_CHAMPION]: { label: '转介绍达人', tone: 'brand' },
  // 基础属性
  [PersonaFeatureKey.TIME_PREFERENCE]: { label: '时间偏好', tone: 'sky' },
  [PersonaFeatureKey.AGE_BRACKET]: { label: '年龄段', tone: 'sky' },
  [PersonaFeatureKey.ACQUISITION_CHANNEL]: { label: '获客渠道', tone: 'slate' },
  [PersonaFeatureKey.FAMILY_STRUCTURE]: { label: '家庭构成', tone: 'slate' },
  [PersonaFeatureKey.GENDER]: { label: '性别', tone: 'slate' },
};

export const personaFeatureMeta = (key: string): { label: string; tone: Tone } =>
  PERSONA_FEATURE_META[key] ?? { label: key, tone: 'slate' };

/**
 * 潜在治疗 —— **卡片展示用**中文(与画像内部存的 `潜在种植` 等不同)。
 *
 * 为什么单独一份字典、而不是直接用 persona data 里的 labels:
 *   labels 是**算画像那一刻写死进 JSON 的**,改措辞要全量重算画像才生效(百万级,几小时)。
 *   卡片只拿 code(implant/perio/…)、中文在这里查表 → 改词即时生效、且全站一处。
 *
 * 措辞对齐业务口径(2026-07-29):统一「XX治疗」,filling 用「充填治疗」不用「补牙治疗」,
 * early_ortho 用「早期矫治」(「早矫治疗」不通)。
 * code 来源:potential-treatment.feature 的 classifyGapToLabel,改那边要同步这里。
 */
export const POTENTIAL_TREATMENT_CARD_LABEL: Record<string, string> = {
  implant: '种植治疗',
  ortho: '正畸治疗',
  early_ortho: '早期矫治',
  endo: '根管治疗',
  perio: '牙周治疗',
  filling: '充填治疗',
  restoration: '修复治疗',
  extraction: '拔牙治疗',
};

/// code → 卡片中文;未知 code 原样返回(宁可露出生码,也不静默吞掉一个标签)
export function potentialTreatmentCardLabel(code: string): string {
  return POTENTIAL_TREATMENT_CARD_LABEL[code] ?? code;
}

/**
 * 项目名的例外 —— 砍后缀砍不出来的那几个,在这里显式给。
 * early_ortho 的卡片措辞是「早期矫治」(没有「治疗」后缀可砍),业务要的项目名是「早矫」。
 * ⚠️ 只放**真的推不出来**的;能靠砍后缀得到的别往这里堆,否则又变成两张手维护的表。
 */
const POTENTIAL_TREATMENT_ITEM_OVERRIDE: Record<string, string> = {
  early_ortho: '早矫',
};

/**
 * code → **项目名**:种植 / 正畸 / 早矫 / 根管 / 牙周 / 充填 / 修复 / 拔牙。
 *
 * 用途只有一个:发给宿主的 postMessage 载荷(`treatments`)。宿主拿它当**项目名**落单,
 * 「种植治疗」在那边读起来像句子、不像项目;界面上客服看的仍是「种植治疗」(业务 2026-07-29 定的措辞)。
 *
 * ⭐ 默认从卡片措辞**推导**(砍掉结尾的「治疗」)而非另立一张全表 —— 两张手维护的表必然漂;
 * 推不出来的走上面那张例外表(目前只有早矫一个)。
 */
export function potentialTreatmentItemName(code: string): string {
  return (
    POTENTIAL_TREATMENT_ITEM_OVERRIDE[code] ?? potentialTreatmentCardLabel(code).replace(/治疗$/, '')
  );
}
