import type { DraftPlanSummaryInput } from './input.types';

export const DRAFT_PLAN_SUMMARY_PROMPT_VERSION = 'draft_plan_summary@2026-05-17-a';

export const DRAFT_PLAN_SUMMARY_SYSTEM = `你是某连锁牙科诊所的病历整理专员,擅长把散乱的就诊数据归纳成客服一眼能读懂的摘要。

# 核心原则
1. 三段摘要**各司其职**,不要重复:
   - onePage = 行动摘要(客服打电话前最快了解 patient)
   - medicalRecord = 事实记录(按时间倒序列病历事件)
   - treatmentChain = 治疗链状态(按链组织,讲清下一步)
2. 一律使用临床准确的术语(牙位号 11-48、根管/种植/正畸等)。
3. **禁止**编造未提供的事实;**禁止**承诺疗效;**禁止**给医疗建议(那是医生的事)。
4. 称呼一律用"X 先生/女士",不要用"亲""宝"等口语化称呼。
5. 输出严格按 JSON schema,3 个 key,字段内是 Markdown 文本。`;

export function buildDraftPlanSummaryPrompt(input: DraftPlanSummaryInput): string {
  const { patient, clinicName, plan, personaFeatures, facts, chains } = input;

  const personaLines = personaFeatures.length > 0
    ? personaFeatures
        .map((f) => `- ${f.label}:${f.description}${f.score !== null ? ` (score=${f.score})` : ''}`)
        .join('\n')
    : '- (无)';

  const reasonsLines = plan.reasons.length > 0
    ? plan.reasons
        .map((r, i) => `${i + 1}. [${r.scenarioLabel}, 优先级 ${r.priorityScore}] ${r.reason}`)
        .join('\n')
    : '- (无)';

  // 事实按类分组(节省 token 比时间序拼一长串好)
  const factGroups: Record<string, typeof facts> = {};
  for (const f of facts) {
    if (!factGroups[f.type]) factGroups[f.type] = [];
    factGroups[f.type]!.push(f);
  }
  const factsBlock = Object.entries(factGroups)
    .map(([type, fs]) => {
      const lines = fs
        .slice(0, 8)  // 每类截 8 条,防 token 爆
        .map((f) => {
          const when = f.occurredAt?.slice(0, 10) ?? '未知';
          const title = f.title ?? '';
          const summary = f.summary ?? '';
          const contentKeys = f.content
            ? Object.entries(f.content)
                .filter(([k]) => !['raw', 'rawJson', 'metadata'].includes(k))
                .slice(0, 5)
                .map(([k, v]) => `${k}=${typeof v === 'string' ? v.slice(0, 50) : JSON.stringify(v)?.slice(0, 50)}`)
                .join(' ')
            : '';
          return `  - ${when} ${title}${summary ? ` :: ${summary}` : ''}${contentKeys ? ` { ${contentKeys} }` : ''}`;
        })
        .join('\n');
      return `### ${type}\n${lines}`;
    })
    .join('\n\n');

  const chainsBlock = chains.length > 0
    ? chains
        .map((c) => {
          const nodes = c.nodes
            .map((n) => `${n.stage}.${n.label}${n.done ? '✓' : n.current ? '◉' : '○'}@${n.at.slice(0, 10)}`)
            .join(' → ');
          return `### ${c.name} [${c.status}, 当前阶段 ${c.currentStage}${c.gapDays ? `, 间隔 ${c.gapDays} 天` : ''}]\n${nodes}`;
        })
        .join('\n\n')
    : '(无治疗链数据)';

  return `# 患者档案

## 基本
- 诊所:${clinicName}
- 称呼:${patient.nameMasked}(已脱敏) · ${patient.gender ?? '?'} · ${patient.age ?? '?'} 岁

## 召回原因
${reasonsLines}

## 画像特征
${personaLines}

## 临床事实(按类分组,每类截最近 8 条)
${factsBlock || '(无事实记录)'}

## 治疗链
${chainsBlock}

# 任务
请按 schema 输出 3 段摘要。

- onePage:抓核心,客服 30 秒读完,知道"找谁、为啥、聊啥、注意啥"
- medicalRecord:按时间倒序列病历事件,每条一行,重点放在未闭环治疗 + 待做事项
- treatmentChain:按链组织,每条链讲清楚当前阶段 + 下一步建议;闭环链一句话带过

不要输出任何 JSON 以外的文字。`;
}
