import type { ScriptContext } from '../../shared/input.types';
import { buildRichFactBlock, buildDeepExtensions } from '../../shared/fact-block';
import type { DeepPlan, DeepWriteInput, DeepVerifyInput } from './types';

/** 深度档事实块 = 标准厚块 + 深度扩展(价值/风险 + 历史联系);三步共用,给"分析"全信息 */
function deepFacts(ctx: ScriptContext): string {
  const ext = buildDeepExtensions(ctx);
  return ext ? `${buildRichFactBlock(ctx)}\n\n${ext}` : buildRichFactBlock(ctx);
}

/** 步骤1:规划 user prompt —— 深度厚事实块(全信息),产出大纲由 plan 的 system + schema 约束 */
export function buildPlanPrompt(ctx: ScriptContext): string {
  return `${deepFacts(ctx)}

---
# 你的任务(本步:规划,不写话术)
基于以上事实,规划这通回访电话拆成几段、每段讲什么。要点须来自上面事实,不编造。`;
}

/** 步骤2:写 user prompt —— 深度厚事实块 + 上一步大纲(+ repair 反馈) */
export function buildWritePrompt(input: DeepWriteInput): string {
  const outline = renderPlanOutline(input.plan);
  const repair = input.repairIssues?.length
    ? `\n\n# ⚠️ 上一稿校验未过,按以下逐条修正后重写\n${input.repairIssues
        .map((i) => `- [${i.section}] 问题:${i.problem} → 修:${i.fix}`)
        .join('\n')}`
    : '';
  return `${deepFacts(input.ctx)}

---
# 本步大纲(按它逐段写,可微调措辞,不要新增事实)
${outline}${repair}`;
}

/** 步骤3:独立对抗校验 user prompt —— 事实 + 待验草稿(新开上下文,对抗) */
export function buildVerifyPrompt(input: DeepVerifyInput): string {
  const draft = input.draft.sections
    .map((s, i) => `### 第${i + 1}段:${s.title}\n${s.markdown}`)
    .join('\n\n');
  return `${deepFacts(input.ctx)}

---
# 你的任务(本步:对抗校验,不改写)
逐句核对下面这份话术草稿:
1. **接地**:每个说法能否追到上面"本次回访患者信息"里的事实?追不到 = 编造 → 记 issue。
2. **安全**:有无报价/费用、疗效承诺、写死具体时间(应保留【时间段】)、≤18 提拍片?有 = 越界 → 记 issue。
全部通过 → pass=true、issues 空;否则 pass=false 并逐条列出。

## 待校验草稿
${draft}`;
}

function renderPlanOutline(plan: DeepPlan): string {
  return plan.sections
    .map(
      (s, i) =>
        `${i + 1}. 【${s.title}】(${s.intent})\n${s.points.map((p) => `   - ${p}`).join('\n')}`,
    )
    .join('\n');
}
