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

/**
 * 企微话术的输出 schema —— **单次生成,只有一个**。
 *
 * ⚠️ 2026-08 砍掉了 `WecomPlanSchema`(规划大纲)与 `WecomVerifySchema`(LLM 自检):
 *   企微稿是一整块几百字、没有分段结构,"先列大纲"收益极小;而客服拿到后本来就要
 *   自己过一遍再发,LLM 自检是在给一个人本来就会做的事再花一次钱和 30 秒。
 *   安全**没有放松** —— 机器硬扫(禁词/承诺/占位残留)保留在 wecom.strategy 里,
 *   它不花钱、且拦的正是模型自己发现不了的东西。
 *
 * ⚠️ 与电话深度档最本质的差别就在这里:**没有 `sections[]`,只有一整块 `markdown`**。
 *   电话稿分段是给「伴飞」逐段高亮用的;企微是**一条发出去的消息**,分段没有意义,
 *   反而会诱导模型写成"第一段…第二段…"的汇报体,复制过去很怪。
 *
 * ⚠️ 同样不加 .min()/.max() 硬约束 —— 理由与电话档一致(见 tiers/deep/schema.ts):
 *   硬长度约束对中文偏严,模型差一点就整体 fail 走兜底;形态靠 system + describe 引导。
 */

// ── 一次性写出整块正文 ──
export const WecomWriteSchema = z.object({
  tone: ToneEnum.describe(TONE_DESCRIBE),
  markdown: z
    .string()
    .describe(
      '完整企微消息正文(约 120-400 字),**一整块、可直接复制发送**。' +
        '⛔ 不要小标题、不要 `##`、不要分段编号、不要"第一/第二"。' +
        '按微信阅读节奏用空行断成几个短自然段;接地病历不编造。' +
        '⭐ 适度用**表情**(全文 2-4 个,放在句末缓和语气,如 😊 🦷 ~),' +
        '这是微信而不是公文 —— 但⛔ 不要每句都带、不要用夸张促销类表情(🔥💰🉐)。' +
        '⛔ 除自报家门的【回访客服】外,**不许出现任何其他【】占位符**(时间尤其不许):' +
        '这条消息是整段复制直发的,占位符会原样进患者微信;' +
        '要约时间就写"您方便的时候回我一下,我帮您安排"。',
    ),
});
export type WecomWriteZ = z.infer<typeof WecomWriteSchema>;

