/**
 * disease-knowledge — 病种知识的**单一访问源**(tier-agnostic,按 subKey keyed)。
 *
 * 背景(收口):原先病种内容散在 3 处、靠中文 key 双跳访问,易漂:
 *   subKey ──SUBKEY_TO_MISSED──▶ 中文key ──┬─ MISSED_DIAGNOSIS_KEY_POINTS[exact]
 *                                          ├─ TREATMENT_DURATION[exact]
 *                                          └─ canonicalMissedKey[includes]
 *   两套字典对同一病种用了**不同中文 key**(如 jaw_cyst:keypoints 用「囊肿」、duration 用「颌骨囊肿」),
 *   exact 查表时静默丢内容(jaw_cyst 拿不到 risks/advantages = 原 bug)。
 *
 * 本文件把"subKey → 内容"的解析**收成一处**:一个 SUBKEY_MAP 显式声明每个病种在两套字典里的
 *   中文 key(消除不一致),对外只暴露 `diseaseKnowledgeForSubKey(subKey)` 一个访问器。
 *
 * 多档共用(铺路):
 *   - 稳健档:程序挑 risks 1-2 条 → 填 4 段模板槽(现状)。
 *   - 标准/深度档:把整段 risks/advantages 作为"规则事实"给 LLM,自由组织(后续接入)。
 *
 * 注:内容(MISSED_DIAGNOSIS_KEY_POINTS / TREATMENT_DURATION)暂仍存 script-facts.ts;
 *   本文件只统一**访问**。内容后续可整体迁入 script-common/(见 ai-script-generation.md §八ter)。
 */
import {
  MISSED_DIAGNOSIS_KEY_POINTS,
  TREATMENT_DURATION,
  missedFromReason,
  lookupKeyPoints,
  lookupReviewDuration,
  type MissedKeyPoints,
} from '../script-facts';

export interface DiseaseKnowledge {
  /** 患者口径病种名(话术里说的,如"缺失牙""错颌畸形(牙齿不齐)") */
  label: string;
  /** 不处理的风险(口语,稳健挑 1-2 / 标准深度全给) */
  risks: string[];
  /** 趁早处理的好处 */
  advantages: string[];
  /** 复查说明文案 */
  reviewDuration: string;
  /** 年龄适应性(可选,按年龄组取一句) */
  ageFit?: MissedKeyPoints['ageFit'];
}

/**
 * subKey → 内容定位(单一源)。
 *   `kp` = MISSED_DIAGNOSIS_KEY_POINTS 里的中文 key;`dur` = TREATMENT_DURATION 里的中文 key。
 *   两者**刻意分列**:同病种两套字典用的中文 key 可能不同(如 jaw_cyst),在此对齐,杜绝静默丢内容。
 */
const SUBKEY_MAP: Record<string, { label: string; kp: string; dur: string }> = {
  missing_tooth: { label: '缺失牙', kp: '缺失牙', dur: '缺失牙' },
  caries_no_filling: { label: '龋齿', kp: '龋齿', dur: '龋齿' },
  endo_no_rct: { label: '牙髓/根尖周炎', kp: '根尖周炎', dur: '根尖周炎' },
  perio_no_srp: { label: '牙周炎', kp: '牙周炎', dur: '牙周炎' },
  ortho_no_consult: { label: '错颌畸形（牙齿不齐）', kp: '错颌畸形', dur: '错颌畸形' },
  hard_tissue_damage: { label: '牙体缺损', kp: '牙体损伤', dur: '牙体损伤' },
  gum_alveolar_lesion: { label: '牙龈/牙槽问题', kp: '牙龈问题', dur: '牙龈问题' },
  impacted_tooth: { label: '阻生牙', kp: '阻生牙', dur: '阻生牙' },
  // ⭐ 修复:keypoints 字典里是「囊肿」,duration 字典里是「颌骨囊肿」—— 分列对齐,不再静默丢 risks
  jaw_cyst: { label: '颌骨囊肿', kp: '囊肿', dur: '颌骨囊肿' },
  development_eruption: { label: '牙齿萌出异常', kp: '恒牙萌出空间不足', dur: '恒牙萌出空间不足' },
};

/** subKey(可带 @tooth 后缀)→ 病种知识;未映射 → null(调用方用 label 文本兜底) */
export function diseaseKnowledgeForSubKey(
  subKey: string | null | undefined,
): DiseaseKnowledge | null {
  const base = (subKey ?? '').split('@')[0]!.trim();
  const m = base ? SUBKEY_MAP[base] : undefined;
  if (!m) return null;
  const kp = MISSED_DIAGNOSIS_KEY_POINTS[m.kp];
  return {
    label: m.label,
    risks: kp?.risks ?? [],
    advantages: kp?.advantages ?? [],
    reviewDuration: TREATMENT_DURATION[m.dur] ?? TREATMENT_DURATION['其他']!,
    ageFit: kp?.ageFit,
  };
}

/**
 * reason → 病种知识(**话术 prompt + fallback 共用的唯一入口**)。
 *   subKey 优先(精确);未映射 → 文本归一兜底(老路径,处理无 subKey 的边界)。
 *   后续标准/深度档也调此函数拿同一份病种知识(只是消费方式不同)。
 */
export function resolveDisease(
  reason:
    | { subKey?: string | null; dxCode?: string | null; reason?: string | null; scenarioLabel?: string | null }
    | null
    | undefined,
  fallbackLabel: string,
): DiseaseKnowledge {
  const dk = reason ? diseaseKnowledgeForSubKey(reason.subKey) : null;
  if (dk) return dk;
  // 兜底:无 subKey / 未映射 → 文本归一(canonicalMissedKey)
  const m = reason ? missedFromReason(reason) : { label: fallbackLabel, key: null };
  const kp = lookupKeyPoints(m.key);
  return {
    label: m.label || fallbackLabel,
    risks: kp?.risks ?? [],
    advantages: kp?.advantages ?? [],
    reviewDuration: lookupReviewDuration(m.key),
    ageFit: kp?.ageFit,
  };
}
