import { z } from 'zod';
import { ToneEnum, TONE_DESCRIBE } from '../../shared/tone';

/**
 * 标准档输出 schema —— **去模板 = 自由段数组(固定 4 段)**。
 *
 * 跟稳健档的根本区别:稳健是 4 个**写死角色字段**(opening/informMissed/reviewAdvice/closing),
 * 标准这里是一个**通用 `sections[]` 数组**(每段 {title, markdown}),**不绑角色**——标题、每段讲什么
 * 全由 LLM 定。固定 4 段(`.length(4)`),区别于深度的"段数不限"。
 *
 * 形态与深度档 DeepDraft 一致({tone, sections[{title,markdown}]})→ orchestrator 复用
 * deepDraftToSections / renderMarkdownFromSections 渲染;safety 用 SCRIPT_SAFETY_RULES_SECTIONS。
 * 段内"轮廓/写法/固定例外(预约句·时间占位)"在 system 的 format.md,这里只给形态 + 硬底线。
 */
export const StandardScriptSchema = z.object({
  tone: ToneEnum.describe(TONE_DESCRIBE),

  sections: z
    .array(
      z.object({
        // 不加 .min()/.max() 硬约束,长度/段数只作 describe 软引导(对中文偏严 + qwen3.7-max 简洁易误伤)
        title: z
          .string()
          .describe('该段小标题(约 2-20 字):你自起、自然口语贴这通电话,别用"开场白/告知应治未治/复查建议/结束回访语"这类刻板模板名'),
        markdown: z
          .string()
          .describe('该段正文(约 30-400 字):分短句、行首 `•`;接地病历不编造;具体时间一律用【时间段】占位;无大标题/分隔符/表情'),
      }),
    )
    .describe(
      '固定 4 段(数组顺序即话术顺序);**角色/标题/每段讲什么都由你定,不要套固定段名**。一通回访通常覆盖:打招呼问近况 / 带出本次问题(隐患+趁早好处)/ 邀约来院复查(段尾含固定预约引导句)/ 简短收尾 —— 但怎么分、起什么标题由你决定。详细写法见 system 提示词。',
    ),
});

export type StandardScriptOutputZ = z.infer<typeof StandardScriptSchema>;
