import {
  PERSONA_TAG_FILTER_DIMS,
  personaTagDimId,
  potentialTreatmentItemName,
} from '@pac/types';

/**
 * personaTags 圈人字典(从 `PERSONA_TAG_FILTER_DIMS` 生成,单一真理源,自动同步)。
 *
 * 格式给 LLM 看:`key(中文): code=中文 / code=中文 …`,一维一行。
 * 入参格式:"key:value" 逗号串;同维多选 OR,跨维 AND(如 "rfm:important_value,urgency_level:urgent")。
 *
 * ⚠️ **凡是收 personaTags 的工具都必须挂这份字典**(MCP 的 list_recall_queue /
 *   get_cohort_attributes,以及助手本地的 propose_assignment)——
 *   少给一处,模型在那处就得自己猜 key 和 value code。
 * 🔴 而猜错的维度会被 `cohort-filter.personaTagsSql` **静默丢掉**(`if (!dim) continue`):
 *   筛选条件等于没加,人数一个不少地返回,**不报错也看不出来**。
 *   所以这份字典不是"锦上添花的说明",是防静默失败的必需品。
 *
 * ⛔ 别再在某个工具里内联一份简写版 —— 那就是第二份真理源。
 */
const PERSONA_TAGS_HELP = PERSONA_TAG_FILTER_DIMS.map((d) =>
  // ⚠️ 用 personaTagDimId 不用 d.key:source='patient' 的维度 key 为空串、筛选串用 id,
  //   用 key 会给 LLM 一个空维度名,它照着发就永远筛不出人。
  // 开集维度(医生)options 为空 → 提示取值是自由文本,并指向名单接口,免得 LLM 瞎猜姓名。
  d.dynamic
    ? `${personaTagDimId(d)}(${d.nameZh}): <医生姓名,精确匹配;名单见 GET /pac/v1/plans/doctors>`
    : `${personaTagDimId(d)}(${d.nameZh}): ${d.options.map((o) => `${o.value}=${o.zh}`).join(' / ')}`,
).join('\n');

/**
 * 🔴 2026-08-14 补上「码不许说出口」那一句 —— 此前它**只在系统提示词的公共层**里
 *   （以 `personaTags` 为例被点名）。公共层是主管和客服共用的，而这些码只有圈人这条线才有，
 *   把它们摆进公共层等于让另一条线的人也读一遍与自己无关的词。
 * ⇒ 约束挪到**产生这些码的那一格参数上**：模型读到码的同一眼就读到怎么说。
 *   `POTENTIAL_TREATMENT_DESC` / `TEMPERATURE_TOOL_DESC` 早就是这么写的，这里是漏的那一份。
 */
export const PERSONA_TAGS_DESC =
  '画像圈人(可选):"key:value" 逗号串,同维多选 OR、跨维 AND。' +
  '⛔ **只能用下表里的 key 和 value**,写别的会被静默忽略(筛选等于没加,人数却照样返回)。' +
  '\n🔴 ⛔ **这些 key 和 value 只用于调工具,一个字都不许说给主管** —— ' +
  '回话一律用下表右边的中文说法。' +
  '\n可用维度与取值:\n' +
  PERSONA_TAGS_HELP;

/**
 * 潜在治疗(矩阵那一行)的取值说明 —— 同样从 `PERSONA_TAG_FILTER_DIMS` 生成。
 *
 * 🔴 与温度同一条规矩:**码给模型调工具用,中文给主管听**。
 *   把 code=中文 的对照表给全,模型才有得翻;⛔ 不给对照表它就只能把 `filling` 原样念出来。
 */
const POTENTIAL_TREATMENT_DIM = PERSONA_TAG_FILTER_DIMS.find(
  (d) => d.key === 'potential_treatment',
);

export const POTENTIAL_TREATMENT_DESC =
  '矩阵的一行:潜在治疗(界面标题就叫「潜在治疗」)。按此表把主管的话翻成取值:' +
  // ⚠️ 中文取 `potentialTreatmentItemName` —— 那是**矩阵实际渲染用的**同一个函数。
  //   ⛔ 别改用 dim.options 的 zh:那份曾漂成「补牙」,而界面上是「充填」。
  (POTENTIAL_TREATMENT_DIM?.options ?? [])
    .map((o) => `${potentialTreatmentItemName(o.value)}=${o.value}`)
    .join(' · ') +
  '。\n🔴 ⛔ **这些取值码只用于调工具,一个字都不许说给主管** —— 回话一律用中文' +
  '(「充填」「种植」「牙周」…);⛔ 也别自己发明「病种」「科室」这类界面上没有的叫法。';
