/**
 * persona-display — persona feature.description 展示辅助
 *
 * 后端 persona feature description 故意带 `[英文 enum]` 前缀(给 LLM prompt 当
 * machine-readable hint,例 `[gap] 治疗链有 3 处缺口`),前端展示要中文化或分离成 chip。
 *
 * 用法:
 *   const { tag, text } = cleanPersonaValue(feature.value);
 *   // tag 渲染成小灰 chip(可空);text 主描述
 */

const PERSONA_STATUS_ZH: Record<string, string> = {
  // treatment_chain_status
  gap: '缺口',
  ongoing: '在管',
  closed: '闭环',
  in_progress: '在管',
  no_chain: '无链',
  // recall_risk
  high: '高',
  medium: '中',
  low: '低',
  none: '无',
  // do_not_contact_status
  contactable: '可触达',
  DNC: '拒不打扰',
  // value
  diamond: '钻卡',
  gold: '金卡',
  silver: '银卡',
  normal: '普通',
  new: '新客',
};

export function cleanPersonaValue(raw: string | null | undefined): {
  tag: string | null;
  text: string;
} {
  if (!raw) return { tag: null, text: '—' };
  const m = /^\s*\[([A-Za-z_]+)\]\s*(.*)$/.exec(raw);
  if (!m) return { tag: null, text: raw };
  const enumKey = m[1]!;
  const text = m[2]!.trim();
  const tag = PERSONA_STATUS_ZH[enumKey] ?? enumKey;
  // 文本完全等同 tag 翻译时(例 "[contactable] 可触达") 只显示 tag,避免重复
  if (text === PERSONA_STATUS_ZH[enumKey]) return { tag, text: '' };
  return { tag, text };
}

/**
 * 取 persona description 的"短标签" — 用于"关键事实"等紧凑位置(右侧 hint 列)
 *
 * 后端 description 常带详细括号(给客服详情看),紧凑位放不下,要短词:
 *   "新客/未消费(累计净消费 ¥58.00,含 ...)" → "新客"
 *   "钻卡(LTV ¥48,200,含 ...)"              → "钻卡"
 *   "[gap] 治疗链有 3 处缺口 — K05..."        → "缺口"(取 [enum] 翻译)
 *
 * 规则:
 *   ① 有 [enum] 前缀 → 用翻译后的 tag(简洁)
 *   ② 否则 → 截首段(到第一个 "/" 或 "(" 或 "(" 前)
 */
export function shortPersonaValueLabel(raw: string | null | undefined): string {
  if (!raw) return '—';
  // ① [enum] 前缀模式 — 直接用 tag
  const m = /^\s*\[([A-Za-z_]+)\]/.exec(raw);
  if (m) return PERSONA_STATUS_ZH[m[1]!] ?? m[1]!;
  // ② 截首段:遇到 · / 或 ( 或 ( 停(分隔符语义都是"主词 · 详情")
  const stop = raw.search(/[·\/(()]/);
  return (stop > 0 ? raw.slice(0, stop) : raw).trim();
}
