import { z } from 'zod';
import { ToneEnum, TONE_DESCRIBE } from '../draft-plan-script/shared/tone';

/**
 * 企微话术(深度档)三步的输出 schema。
 *
 * ⚠️ 与电话深度档最本质的差别就在这里:**没有 `sections[]`,只有一整块 `markdown`**。
 *   电话稿分段是给「伴飞」逐段高亮用的;企微是**一条发出去的消息**,分段没有意义,
 *   反而会诱导模型写成"第一段…第二段…"的汇报体,复制过去很怪。
 *
 * ⚠️ 同样不加 .min()/.max() 硬约束 —— 理由与电话档一致(见 tiers/deep/schema.ts):
 *   硬长度约束对中文偏严,模型差一点就整体 fail 走兜底;形态靠 system + describe 引导。
 */

// ── 步骤1:要点规划(⚠️ 不是"分段",是**讲的顺序**)──
export const WecomPlanSchema = z.object({
  points: z
    .array(
      z.object({
        point: z.string().describe('这一点要讲什么(一句话,口语化,**必须能追到给定患者信息/病历事实**)'),
        why: z.string().describe('为什么排在这个位置——承上启下:接住上一点的什么、为下一点铺什么'),
      }),
    )
    .describe(
      '要点**顺序**(3-6 条):从果(让患者明白该回来处理)倒推到因,排成层层递进的推进线。' +
        '⚠️ 这是"讲的先后",**不是分段** —— 最终产出是一整段连贯文字,不许出现小标题。',
    ),
});
export type WecomPlanZ = z.infer<typeof WecomPlanSchema>;

// ── 步骤2:写(一次性单块)──
export const WecomWriteSchema = z.object({
  tone: ToneEnum.describe(TONE_DESCRIBE),
  markdown: z
    .string()
    .describe(
      '完整企微消息正文(约 120-400 字),**一整块、可直接复制发送**。' +
        '⛔ 不要小标题、不要 `##`、不要分段编号、不要"第一/第二"、不要表情符号。' +
        '按微信阅读节奏用空行断成几个短自然段;接地病历不编造;时间用【时间段】占位。',
    ),
});
export type WecomWriteZ = z.infer<typeof WecomWriteSchema>;

// ── 步骤3:独立对抗校验 ──
export const WecomVerifySchema = z.object({
  pass: z.boolean().describe('①接地②安全③逻辑与分寸④可直接发送(无标题/无占位残留/无客服自己看的话)全过 → true'),
  issues: z
    .array(
      z.object({
        section: z.string().describe('出问题的位置(可填"开头""结尾""整体")'),
        problem: z.string().describe('问题:①接地不实②安全越界(报价/承诺疗效/写死时间/≤18拍片)③逻辑与分寸(跑题/不递进/没说后果/吓唬/推销施压)④不可直接发送(出现小标题、内部标签、给客服看的说明)'),
        fix: z.string().describe('修法建议(回喂改写)'),
      }),
    )
    .describe('逐条列出有问题的点;全部 OK 则空数组'),
  quality: z
    .object({
      natural: z.number().describe('像微信里真人发的(1-5):不书面公文、不机器腔'),
      warmth: z.number().describe('关怀温度(1-5):医疗关怀感,不冷淡也不推销'),
      focus: z.number().describe('聚焦(1-5):紧扣本次问题,不发散'),
      nonPushy: z.number().describe('不推销(1-5):邀约自然,不促单 / 不报价 / 不施压'),
      sendable: z.number().describe('可直接发送度(1-5):复制粘贴就能发,不用再删改'),
      overall: z.number().describe('综合质量分(1-5,可含半分)'),
    })
    .describe('质量细项打分(1-5);只评质量,不影响 pass/issues'),
});
export type WecomVerifyZ = z.infer<typeof WecomVerifySchema>;
