import { z } from 'zod';

/**
 * DraftPlanScript AiCall 的 Zod 输出 schema。
 *
 * 4 模块结构(2026-06-02 重构,对齐业务"参考话术"提示词):
 *   开场白 → 告知应治未治 → 复查建议 → 结束回访语(顺序固定,缺一不可)
 *
 * 设计:per-段 markdown 字段(等价业务要的 {scripts:[{title,content}]},但带 zod 强校验 +
 *   流式 + 安全闸,更稳)。LLM 只把"程序算好的事实"(称呼/智能日期/单个应治未治项/风险要点/
 *   复查时长 —— 见 script-facts.ts)润色成话术,不做年龄分支/日期格式/优先级/查表等确定性判断。
 *   段内"短句"用 markdown bullet(`• ...`)分行,便于客服与患者互动。
 *   ⚠️ 各段短句**数量与具体结构**(成人 4 句 / 儿童 5 句等)以 system prompt 里匹配到的
 *   人群模板(population skill)为准,本 schema 只描述模块用途与通用格式,不写死句数。
 */
export const DraftPlanScriptSchema = z.object({
  tone: z
    .enum(['warm', 'professional', 'urgent'])
    .describe('整体语气标签:warm=温和家常 / professional=专业稳重 / urgent=有时效紧迫'),

  opening: z
    .string()
    .min(50)
    .max(600)
    .describe(
      [
        '【第一部分·开场白 — 以医生名义,有温度】',
        '用 `• ` bullet 分 3-4 句,内容必须包含(顺序):',
        '1. 自报家门:用「{诊所}的{岗位角色}{岗位姓名}」(岗位角色严禁写"回访专员")',
        '2. 智能称呼:user 给的 {称呼}(已算好,直接用,不要自己改)',
        '3. 以「{最后一次就诊医生}医生特意交代」体现医生关怀',
        '4. 用 user 给的 {智能日期} 问近况:「自从{智能日期}检查后,口腔情况怎么样?」',
        '禁止:加大标题/═══分隔符、加表情、写成抒情排比',
      ].join('\n'),
    ),

  informMissed: z
    .string()
    .min(80)
    .max(900)
    .describe(
      [
        '【第二部分·告知应治未治 — 只讲 user 给的那一个 {应治未治项},严禁提其他项】',
        '用 `• ` bullet 分短句(**句数与结构以系统提示词里匹配的人群模板为准**:成人 4 句 / 儿童 5 句),每句一个重点,口语化,温和提醒非推销:',
        '现状描述:以「{最后一次就诊医生}医生上次检查注意到您有{应治未治项}的情况」表达,不要说"我们发现了"',
        '健康提醒:从 user 给的 {风险要点} 里灵活挑 1-2 条口语说,不堆砌、不吓唬、不用"如A、B、C"书面句式',
        '个人化关怀:用 user 给的 {治疗优势要点},以"趁现在/早一点"口吻;禁止提具体年龄/职业',
        '专业建议:体现「{最后一次就诊医生}医生也特别嘱咐提醒您」,禁止"建议您关注一下"这类书面语',
      ].join('\n'),
    ),

  reviewAdvice: z
    .string()
    .min(80)
    .max(900)
    .describe(
      [
        '【第三部分·复查建议 — 有温度有引导,主动约】',
        '用 `• ` bullet 分短句(**句数与结构以系统提示词里匹配的人群模板为准**:成人 4 句 / 儿童 5 句):',
        '核心:复查重要性 +「让{最后一次就诊医生}医生帮您再仔细看看」+(成人)直接用 {复查时长} 原文',
        '引导预约必须严格用「{最后一次就诊医生}医生【时间段1】和【时间段2】这两个时间段有空,您看哪个方便?」',
        '⚠️【时间段1】【时间段2】保留占位结构,严禁替换成"周三上午"等具体时间(PAC 无排班 API)',
      ].join('\n'),
    ),

  closing: z
    .string()
    .min(40)
    .max(500)
    .describe(
      [
        '【第四部分·结束回访语 — 简单有温度,含两种情况】',
        '分两块,各用 `• ` bullet:',
        '【预约成功】:「好的,那我们【具体预约时间】见」+「祝您生活愉快」(【具体预约时间】保留占位,不写死)',
        '【预约不成功】:「没关系,我下周再联系您」+「祝您生活愉快」',
        '禁止:承诺式"已为您约好/敲定 X";禁止加粗具体时间',
      ].join('\n'),
    ),
});

export type DraftPlanScriptOutputZ = z.infer<typeof DraftPlanScriptSchema>;
