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

/**
 * 版本历史:
 *   2026-06-16-d  初版(仅 taskDate/type/status/内容/结果)
 *   2026-07-24-e  ⭐ 加今日锚点 + 程序判定的「未来排程」标记 + taskStatus。
 *                 修生产事故:未来排程被写成"最新一次未执行,需优先补做"。
 */
export const DRAFT_RECALL_SUMMARY_PROMPT_VERSION = 'draft_recall_summary@2026-07-24-e';

export const DRAFT_RECALL_SUMMARY_SYSTEM = `你是牙科诊所客服主管。下面是一个患者的历史联系/回访记录(结构化、看着累)。请提炼成**重点**,让接手客服**一眼抓住关键**,而不是逐条复述。

# 关键要求
1. 输出中文,不要换行/列表/Markdown。
2. **是"重点提炼"不是"总结罗列"**:抓最值得注意的那一点——比如"近期联系密但未到诊""多次未接通""有种植意向待跟进""术后回访已完成、可推新项目"。**不要**把所有回访类型都列出来。
3. 优先突出**对下一步有用的信号**(还没接通 / 已表达意向 / 长期未到诊 / 刚成交别打扰 等)。
4. 客观,**禁止**承诺疗效、编造、给医疗建议。
5. 严格按 JSON schema 输出,只有一个 key:summary。

# ⭐ 时间纪律(硬约束,违反即错)
记录里**包含诊所已排好、但还没到日子的未来任务**,这类条目已用【未来排程·尚未到期】标出。
- 【未来排程·尚未到期】的条目**绝不能**说成"未执行 / 未回访 / 漏做 / 缺失 / 需补做 / 需优先跟进该次"——
  它只是**还没到时间**,不是任何人的疏漏。需要提及时只能说"已排 X 月 X 日复查洁牙"这类中性表述。
- 只有标了【已过期·未执行】的条目才算真正漏做。
- "最近一次""最新一次"这类说法**只能指已过期的条目**,不要用未来排程当"最近一次"。
- 判断哪条是未来、哪条已过期**已经替你算好了**,直接用标记,不要自己比日期。

# 示例(风格参考,不要照抄)
- "近 3 次活动邀约均未接通,建议换企微触达。"
- "术后回访已完成,有种植意向待跟进。"
- "半年内 5 次回访无到诊,流失风险高。"
- "4 月术后回访已完成,10 月 9 日已排复查洁牙,暂无需额外动作。"  ← 未来排程的正确写法`;

export function buildDraftRecallSummaryPrompt(input: DraftRecallSummaryInput): string {
  const lines =
    input.items.length > 0
      ? input.items
          .map((it, i) => {
            // 未来 / 过期 由 orchestrator 程序判定后传入(见 input.types.isFuture 注释),
            // 这里只负责渲染成模型看得懂的显式标记 —— LLM 不做日期比较。
            const when = it.isFuture ? '【未来排程·尚未到期】' : null;
            const parts = [
              it.taskDate ?? '—',
              when,
              it.type ?? '回访',
              it.status,
              // 「已预约」「创建新回访」跟「未完成」语义差很远,漏了会被当成没做
              it.taskStatus ? `任务:${it.taskStatus}` : null,
              it.treatmentItems ? `项目:${it.treatmentItems}` : null,
              it.followContent ? `内容:${it.followContent.slice(0, 40)}` : null,
              it.result ? `结果:${it.result.slice(0, 40)}` : null,
            ].filter(Boolean);
            return `${i + 1}. ${parts.join(' · ')}`;
          })
          .join('\n')
      : '(无历史联系记录)';

  const futureCount = input.items.filter((it) => it.isFuture).length;
  const futureNote = futureCount
    ? `\n⚠️ 其中 ${futureCount} 条是**尚未到期的未来排程**(已标注),不得表述为未执行/漏做/需补做。`
    : '';

  return `今天:${input.today}
患者:${input.patientNameMasked}
历史联系 / 回访记录(时间倒序,共 ${input.items.length} 条):
${lines}${futureNote}

请概括以上历史联系的重点。`;
}
