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

/**
 * 稳健档 4 段输出 schema(顺序固定:开场白 → 告知应治未治 → 复查建议 → 结束回访语)。
 *
 * ⚠️ describe 会被注入 system,所以这里**只描述段用途 + 格式 + 关键硬约束**,
 *   详细写法(开场顺序 / 句位 / 措辞)以 system 提示词(format.md + 人群句位模板)为单一源,
 *   不在 describe 里复述,避免与模板冲突(历史教训:describe 写反了开场顺序、写死了"下周")。
 */
export const DraftPlanScriptSchema = z.object({
  tone: ToneEnum.describe(TONE_DESCRIBE),

  // ⚠️ 不加 .min()/.max() 硬长度约束 —— 长度只作 prompt 软引导(写在 describe 里)。
  //   历史踩坑:硬约束对中文偏严(中文信息密度高,qwen 写得简洁就被打回 too_small → 整段作废走兜底);
  //   长度形态由 system 提示词 + describe 引导即可,不靠 schema 卡。
  opening: z
    .string()
    .describe('第一部分·开场白(约 50-300 字)。markdown,`• ` 短句分行。内容/顺序按系统提示词的模板,不要大标题/分隔符/表情。'),

  informMissed: z
    .string()
    .describe('第二部分·告知应治未治(约 80-400 字)。**只讲本次一个 {应治未治项}**,温和提醒非推销;markdown `• ` 短句分行。'),

  reviewAdvice: z
    .string()
    .describe('第三部分·复查建议(约 80-400 字)。引导预约用【时间段1】【时间段2】占位、**不写死具体时间**;markdown `• ` 短句分行。'),

  closing: z
    .string()
    .describe('第四部分·结束回访语(约 40-200 字)。含【预约成功】/【预约不成功】两种;时间用【具体预约时间】占位、不承诺、不写死。'),
});

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