import { potentialTreatmentCardLabel } from '@pac/types';

/**
 * persona feature.description 的展示辅助 —— 把后端那句自包含描述裁成不同密度的展示形态。
 *
 * 后端每个特征产一句 description(如 `重要价值 · 距上次 140 天 · 就诊20次 · 累计¥154,350`),
 * 详情抽屉整句显示,紧凑位(右侧 hint 列 / 标签云 chip)放不下,要短词。
 *
 * 注:这里曾有一套 `[enum] 文本` 前缀的解析(`[gap] 治疗链有 3 处缺口` → chip「缺口」+ 正文),
 * 服务的是 treatment_chain_status / recall_risk / value / do_not_contact_status 四个特征 ——
 * W7 已把它们摘除(前三个并入 rfm,免打扰并入 special_attention)。现存 16 个 extractor
 * 没有一个产 `[enum]` 前缀,那套解析与它的中文字典已随之删除。
 */

/**
 * 短标签 —— 用于"关键事实"等紧凑位置。
 *   `新客/未消费(累计净消费 ¥58.00,含 ...)` → `新客`
 *   `重要价值 · 距上次 140 天 · 累计¥154,350` → `重要价值`
 * 规则:截到第一个分隔符(`·` / `/` / 半角或全角括号)之前。
 */
export function shortPersonaValueLabel(raw: string | null | undefined): string {
  if (!raw) return '—';
  const stop = raw.search(/[·\/(()]/);
  return (stop > 0 ? raw.slice(0, stop) : raw).trim();
}

/**
 * 潜在治疗的展示中文 —— **从 code 查表,不读 data.labels**。
 *
 * ⚠️ 2026-07-30 线上口径不一致就是这里踩的:同一个患者,召回池卡片显示「充填治疗」、
 * 详情页 chip 显示「潜在补牙」。因为 `data.labels` 是**算画像那一刻烤进 JSON 的**
 * (`{"types":["filling"],"labels":["潜在补牙"]}`),而卡片早就改成"只拿 code、中文查表"了。
 * 措辞这几天改过三轮,烤死的那份自然全是旧词 —— 要改回来得全量重算画像(百万级、几小时)。
 *
 * 纪律:**凡是中文措辞可能改的标签,展示一律 code → 查表**,别读 labels。
 * 目前只有 potential_treatment 有 code 表(POTENTIAL_TREATMENT_CARD_LABEL);
 * 其余多值特征(治疗史/权益/禁忌/时间偏好…)暂时只能读 labels,它们的措辞也没改过。
 */
function potentialTreatmentLabels(data: unknown): string[] | null {
  const types = (data as { types?: unknown } | null | undefined)?.types;
  if (!Array.isArray(types)) return null;
  const codes = types.filter((t): t is string => typeof t === 'string');
  return codes.length > 0 ? codes.map(potentialTreatmentCardLabel) : null;
}

/**
 * 多值标签的紧凑显示(首值 + `+N` 溢出)。
 *
 * 治疗史 / 权益 / 禁忌 / 潜在治疗 / 时间偏好 / 治疗敏感 / 特别关注 这 7 个特征是「`/` 并列多值」,
 * 直接交给 shortPersonaValueLabel 会在第一个 `/` 处截断、只剩首值且不提示还有更多。
 * 这里改读结构化 `data.labels`(这 7 个后端都带),显示首值 + `+N`,完整列表走 hover 卡片。
 * 单值特征 → `{ text, more: 0 }`。
 *
 * ⭐ 传 featureKey:potential_treatment 走 code 查表(见上方注释),不读烤死的 labels。
 */
export function compactPersonaValue(
  raw: string | null | undefined,
  data?: unknown,
  featureKey?: string,
): { text: string; more: number } {
  const fromCode = featureKey === 'potential_treatment' ? potentialTreatmentLabels(data) : null;
  const labels =
    fromCode ?? (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 };
}

/** 抽屉里"全部展开"用的多值中文 —— 同样对 potential_treatment 走 code 查表 */
export function personaValueLabels(data: unknown, featureKey?: string): string[] | null {
  const fromCode = featureKey === 'potential_treatment' ? potentialTreatmentLabels(data) : null;
  if (fromCode) return fromCode;
  const labels = (data as { labels?: unknown } | null | undefined)?.labels;
  return Array.isArray(labels) && labels.every((x) => typeof x === 'string')
    ? (labels as string[])
    : null;
}
