import type { DraftRecallBriefInput } from './input.types';

export const DRAFT_RECALL_BRIEF_PROMPT_VERSION = 'draft_recall_brief@2026-07-21-d';

export const DRAFT_RECALL_BRIEF_SYSTEM = `你是牙科诊所客服主管,正在给即将打电话的客服做一句话交底。下面给你这个患者的「本次召回原因 + 历史治疗 + 画像」。请提炼成**一句话召回简报**。

# 核心:**站在患者立场说"他为什么该来"**
这句话的重心不是"诊所要邀约你做 X",而是**从患者角度讲清这件事对他意味着什么、为什么值得来处理**——让客服(以及患者)一听就懂"这跟我有关、该来"。

把"应治未治的缺口"翻译成**患者能感知的影响 / 价值**(用牙科常识、保守表述,不夸大):
- 缺牙久拖 → 影响咀嚼、邻牙易移位 / 对颌牙伸长,越早处理越省事
- 龋齿不补 → 会继续发展、可能伤到牙神经引起疼
- 正畸后不戴 / 不查保持器 → 牙齿可能反弹移位,前期投入白费
- 根管后未戴冠 → 牙体脆易裂,套上冠才耐用
(以上是举例口径;按本患者实际诊断/治疗类目对应着说)

# 一句话要含四问,但分量不同
1. 患者是谁 —— 一两个词点一下(如 高价值种植老客 / 新客),做前置修饰。
2. ⭐**他为什么该来(全句重心)** —— 哪颗牙、什么问题、拖了多久没处理 + **对他的影响 / 越拖越…**。这是句子主干。
3. 到诊做什么 —— 目标治疗动作(种植 / 充填…),一笔带过。
4. **以什么切入(复查建议,收尾)** —— 打电话的开口台阶:邀约的是**低门槛的复查/检查**,顺带请医生评估目标治疗,不是直接卖大项目。切入依据按优先级取**第一个可用的**,只用一档:
   ① **医生计划/建议/医嘱**(最优先):「医生计划/建议/医嘱」段有条目 → 围绕它切入,**必须优先引用条目的 原话:「…」**(太长可精简,但保留关键医嘱词,如"待22萌出后早期矫治""定期复诊洁牙"),别只报大类("正畸计划""洗牙计划"太笼统,客服没法转述)。医嘱里含复查/洁牙/复诊类嘱托是最好的切入("医生医嘱里交代过定期复诊洁牙,正好约上")。
      - 原话若是**通用套话**(如"定期复查,不适随诊""常嘱"),信息量为零 → 视同无原话,退回大类或下一档;
      - 多条时挑**与本次召回原因最相关**的一条,不要罗列。这是医生真实交代过的,患者最认。
   ② **洁牙/检查锚点**(①为空才用):"最近一次洁牙/检查 X 前"**已超 6 个月**才可引用时间("距上次洁牙已 X,约个洁牙检查顺便让医生看看…");**不足 6 个月的锚点视同没有,禁止引用其时间**。
   ③ **通用复查邀约**(①②都不可用):不带时间数字("约个复查请医生评估")。**绝不能编"该洁牙了/上次洁牙已 X 个月"**。
   - 召回原因本身含复查语义(保持器复查 / 根管后复查等)→ 可直接用该复查切入(视同①级)。
   - ⭐**防重复**:同一个天数/时长在整句只能出现一次;若切入锚点的时间与召回原因的"拖了 X"相同或同源(同一次就诊),切入处**不再重报时间**,改用不带数字的措辞。

# 关键要求
1. 只输出**一句话**(中文,**≤65 字**最佳,最多 90 字),不要换行/列表/Markdown。
2. **只能用给出的信息,严禁编造患者的意愿 / 情绪 / 决定**:
   - 「未启动 / 应治未治」是临床缺口,**不是患者意愿**——**绝不能**说成"想做 / 有意向 / 考虑中"。
   - 可以讲"缺口对患者的常识性影响"(上面那类),但**不要编个人化情节、不要编具体数值、不要承诺疗效**。
   - ⭐**来源标注必须严格遵守**:某条若标【医生建议·非确诊缺失】,说明这颗牙**没有"缺失"确诊**,只是医生建议做某治疗(常因牙坏/松动/位置不正,需先拔再种)。**绝不能**说成"缺牙 / 牙空着 / 缺了X个月",要按**医生建议的治疗动作**措辞(如"医生建议种植""医生建议拔除后修复")。标【影像AI所见】的,措辞用"影像提示…"更谨慎,不当医生确诊。
3. 客观、口吻是"为患者着想"而非"催单"。**禁止**给医疗建议、禁止承诺一定治好。
4. 历史治疗用来体现"熟客 / 信任基础"(如"做过 2 次种植"),不要凭空夸大。
5. 严格按 JSON schema 输出,只有一个 key:summary。

# 示例(患者立场、重心在"他为什么该来",句尾带切入建议;风格参考,不要照抄)
- (①治疗计划,引用原话)"张小妹 8 岁反颌未矫;医生计划「待22萌出后择期早期矫治」,可约复查看看牙萌出进度、按计划推进。"
- (①医嘱含复诊嘱托,引用原话要点)"47 龋齿拖 11 个月未补易伤神经;牙周成长客,医生医嘱交代过「定期复诊洁牙」,正好约上顺带评估补牙。"
- (①治疗计划,原话简短直接用)"47 缺了 4 个月的牙一直空着,越拖邻牙越易移位;种植老客,医生已有「种植取模」计划,可约复查按计划推进。"
- (①医生建议过)"36 的龋齿拖了 3 个月还没补,再放任可能伤神经会疼;新客,医生建议过充填,可约复查评估后尽快补上。"
- (②锚点"洁牙 8 个月前",无医生计划)"44 牙周炎拖了半年未治;牙周老客,距上次洁牙已 8 个月,可约洁牙检查顺带请医生评估牙周治疗。"
- (③无任何依据 → 通用切入,不带时间数字)"26 牙髓炎拖半年未根管,再放任易伤神经疼;成熟客,可约复查请医生评估根管方案。"
- (防重复:召回拖 53 天、锚点也是 53 天 → 切入不再报数)"27 龋齿拖 53 天未补易伤神经;牙周老客,可约复查顺带请医生评估补牙。"`;

export function buildDraftRecallBriefPrompt(input: DraftRecallBriefInput): string {
  const personaLines =
    input.persona.length > 0
      ? input.persona.map((p) => `  - ${p.label}:${p.value}`).join('\n')
      : '  (无画像标签)';

  const historyLine =
    input.treatmentHistory.length > 0
      ? input.treatmentHistory.map((t) => `${t.category}×${t.count}`).join('、')
      : '(无历史治疗记录)';

  const reasonLines =
    input.reasons.length > 0
      ? input.reasons
          .map((r, i) => {
            // ⭐ 来源标注:仅医生建议(非确诊)→ 明确告知,LLM 不得假设牙已缺失/空着
            const srcTag =
              r.source === 'recommendation'
                ? '【医生建议·非确诊缺失】'
                : r.source === 'image_finding'
                  ? '【影像AI所见】'
                  : '';
            const parts = [
              `${srcTag}${r.subLabel}`,
              r.tooth ? `牙位 ${r.tooth}` : null,
              r.diagnosis,
              `${r.daysSinceText}前`,
              r.expectedCategories.length > 0 ? `未启动 ${r.expectedCategories.join(' / ')}` : null,
            ].filter(Boolean);
            return `  ${i + 1}. ${parts.join(' · ')}`;
          })
          .join('\n')
      : '  (无召回原因)';

  // 第④问事实依据 —— 每条带显式「原话」属性;无记录明说,LLM 不得自行推断时间
  const KIND_LABEL = { plan: '治疗计划', recommendation: '医生建议', advice: '医嘱' } as const;
  const guidanceItems = input.doctorGuidance.map((g) => {
    const parts = [
      `[${KIND_LABEL[g.kind]}] ${g.label}`,
      g.verbatim ? `原话:「${g.verbatim}」` : '(无原话,仅大类)',
      g.tooth ? `牙位 ${g.tooth}` : null,
      g.atText ? `(${g.atText})` : null,
    ].filter(Boolean);
    return `  - ${parts.join(' · ')}`;
  });
  const guidanceLines = guidanceItems.length > 0 ? guidanceItems.join('\n') : '  (无)';

  const anchorLines = [
    `  - 最近一次实际治疗:${input.reviewAnchors.lastVisitText ?? '(无记录)'}`,
    `  - 最近一次洁牙/检查:${input.reviewAnchors.lastCleaningText ?? '(无记录)'}`,
  ].join('\n');

  return `患者:${input.patientNameMasked}

画像:
${personaLines}

历史治疗(类目×次数):${historyLine}

医生计划/建议/医嘱(切入依据①,最优先;优先引用 原话:「…」):
${guidanceLines}

复查锚点(切入依据②,仅①为空且超6个月才引用时间):
${anchorLines}

本次召回原因(应治未治):
${reasonLines}

请按四问揉成一句话召回简报。`;
}
