/**
 * 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();
}

/**
 * 多值标签的紧凑显示(方案 A:首值 + "+N" 溢出)
 *
 * 治疗史 / 权益 / 禁忌 / 潜在治疗 / 时间偏好 / 治疗敏感 / 特别关注 这 7 个特征
 * 是"`/` 并列多值",description 会被 shortPersonaValueLabel 在 `/` 处误截只剩第一个、
 * 且不提示还有更多。这里改读结构化 `data.labels`(后端这 7 个都带),chip 显示
 * 第一个值 + `+N`(N=剩余个数),完整列表走 hover 卡片。单值特征 → { text, more:0 }。
 */
export function compactPersonaValue(
  raw: string | null | undefined,
  data?: unknown,
): { text: string; more: number } {
  const labels = (data as { labels?: unknown } | null | undefined)?.labels;
  if (Array.isArray(labels) && labels.length > 0 && typeof labels[0] === 'string') {
    return { text: labels[0] as string, more: labels.length - 1 };
  }
  return { text: shortPersonaValueLabel(raw), more: 0 };
}
