/**
 * phrasing —— 稳健档**口语文案模板**(tier-specific:仅稳健档用)。
 *
 * 设计决策(2026-06):风险要点 / 治疗优势 / 复查时长 是**稳健模板**(为填 4 段模板槽而写的口语文案),
 *   不是 tier-agnostic 知识。标准/深度档**去模板** —— 不用这些文案,病种只给 canonical label
 *   (shared/disease-knowledge),措辞由 LLM 接 病历(医生真实医嘱/检查/建议)自行组织。
 *
 * 本文件 = (原 script-facts 的病种文案字典)+(原 script-common/disease-knowledge 的访问逻辑)合并收口。
 *   病种 canonical label 留 shared(diseaseLabelForSubKey);本文件只补 risks/advantages/reviewDuration 文案。
 *
 * resolveDisease 行为与重组前一致(稳健档输出不变):subKey 优先精确,文本兜底归一。
 */
import { diseaseLabelForSubKey } from '../../shared/disease-knowledge';
import { diagnosisCodeNameZh } from '@pac/types';

// ─────────────────────────────────────────────────────────
// 漏诊项关键要点配置(稳健档"告知应治未治"小节2/3 灵活组合用)
//   渐进式披露:user prompt 只塞**命中那一个病种**的要点,不发全表。
// ─────────────────────────────────────────────────────────
export interface MissedKeyPoints {
  /** 风险要点(口语化,2-4 条灵活组合) */
  risks: string[];
  /** 治疗优势要点(趁现在/早处理) */
  advantages: string[];
  /** 年龄适应性(可选,按年龄组取一句) */
  ageFit?: Partial<Record<'青年' | '中年' | '老年', string>>;
}

export const MISSED_DIAGNOSIS_KEY_POINTS: Record<string, MissedKeyPoints> = {
  牙槽骨吸收: {
    risks: [
      '时间久了,牙齿容易松动,吃东西会不太舒服',
      '牙缝可能慢慢变大,食物容易卡进去',
      '如果放着不管,牙齿还有脱落的风险',
      '可能需要拔牙再种,医生说这样治疗周期会更长',
      '后面如果骨头吸收严重了,想要做修复就比较难了',
    ],
    advantages: ['趁现在早处理,能稳住牙槽骨', '早一点介入,对牙齿稳定有帮助,也避免将来多花功夫'],
    ageFit: { 青年: '年轻时治疗效果更好', 中年: '正是关键时期,及时治疗很重要', 老年: '虽然年龄大了,但治疗仍有意义' },
  },
  缺失牙: {
    risks: [
      '缺牙的地方如果不处理,旁边的牙齿可能会慢慢歪掉',
      '上面的牙齿还可能伸长出来,位置就不对了',
      '时间一长,吃东西也会不太舒服,容易咬不到位',
      '食物卡得多了,还容易蛀牙、牙周炎',
      '不修复的话骨头会萎缩,后面再想种牙就困难一些',
    ],
    advantages: ['及时修复能恢复咀嚼、保护邻牙', '趁现在牙槽骨条件还不错,早点处理效果更好'],
    ageFit: { 青年: '年轻时修复适应性强', 中年: '正值事业期,形象很重要', 老年: '晚年生活质量需要保障' },
  },
  残根: {
    risks: ['长时间不处理可能引发反复炎症', '容易形成慢性牙龈肿痛', '可能影响邻牙健康', '后期拔除难度会增加'],
    advantages: ['越早处理越简单', '避免引发急性疼痛', '减少对邻牙的影响'],
  },
  残冠: {
    risks: ['容易堆积食物导致反复牙龈炎', '可能出现牙齿折裂扩大损伤', '影响咬合舒适度'],
    advantages: ['及时处理避免二次损伤', '利于后续修复效果', '咬合功能更稳定'],
  },
  囊肿: {
    risks: ['如果持续增大可能压迫周围组织', '容易导致骨吸收', '可能影响邻牙位置', '拖久了处理范围会更大'],
    advantages: ['及早关注避免扩大范围', '早期处理恢复更快', '减少对周围骨组织的破坏'],
  },
  根尖周炎: {
    risks: ['容易导致持续性咬牙痛', '可能形成小脓包或脸肿', '长期不处理会影响其他牙', '感染可能逐渐加重'],
    advantages: ['越早处理越容易控制炎症', '避免发展成急性疼痛', '能更好地保住这颗牙'],
  },
  乳牙滞留: {
    risks: ['可能影响恒牙正常萌出', '易导致牙列不齐', '恒牙可能被挤偏'],
    advantages: ['及时处理更有利于恒牙发育', '减少以后矫正难度', '让牙列更整齐'],
  },
  楔状缺损: {
    risks: ['越磨越深可能导致牙髓敏感', '长期易出现冷热敏感', '咬合压力不均会加重缺损'],
    advantages: ['越早处理越容易控制敏感', '可以保护牙体结构', '改善咬合舒适度'],
  },
  龋齿: {
    risks: ['如果放任不管会越变越深', '可能引发牙痛或感染', '可能需要更复杂的治疗'],
    advantages: ['早处理范围小、恢复快', '能避免发展成根管问题', '保持牙齿长期稳定'],
  },
  阻生牙: {
    risks: ['可能反复发炎肿痛', '挤压邻牙导致牙列不齐', '可能形成囊肿或引发感染'],
    advantages: ['早观察早处理更安全', '减少发炎频率', '避免推挤邻牙'],
  },
  埋伏牙: {
    risks: ['可能影响周围牙根结构', '容易引发局部炎症', '可能挤压造成牙列拥挤'],
    advantages: ['早期监测干预更安全', '减少后期并发症', '利于牙列整体稳定'],
  },
  多生牙: {
    risks: ['可能阻挡恒牙正常萌出', '会影响邻牙位置', '可能导致牙列拥挤'],
    advantages: ['越早处理越不影响恒牙', '减少后期矫正难度', '让牙列发育更顺畅'],
  },
  // ── PAC 子场景(应治未治)对应口径 ──
  牙周炎: {
    risks: [
      '牙龈容易出血、红肿,刷牙时尤其明显',
      '时间久了牙槽骨吸收,牙齿会慢慢松动',
      '牙缝可能变大,食物容易塞牙',
      '不控制的话,后面可能要拔牙',
    ],
    advantages: ['趁现在做基础治疗,能把炎症控制住', '早点干预,牙齿能保留得更久'],
    ageFit: { 青年: '年轻时牙周恢复能力强', 中年: '正是该好好维护的时候', 老年: '维护好牙周,晚年吃东西更舒服' },
  },
  错颌畸形: {
    risks: [
      '牙齿排列不齐,刷牙容易刷不干净,易蛀牙、牙龈发炎',
      '咬合不好,长期可能影响咀嚼和颞下颌关节',
      '也会影响笑容和自信',
    ],
    advantages: ['早点评估,矫治方案选择更多', '趁现在牙周条件好,矫正更稳'],
    ageFit: { 青年: '年轻时矫正配合度和效果都更好', 中年: '成人也能做隐形矫正,不影响工作' },
  },
  牙体损伤: {
    risks: ['缺损放着不管会越来越大', '可能出现冷热敏感或牙痛', '严重了可能伤到牙神经,要做根管'],
    advantages: ['早修复范围小、花费少', '能保护剩余牙体,避免折裂'],
  },
  牙龈问题: {
    risks: ['牙龈反复红肿出血', '可能慢慢退缩,牙根暴露敏感', '不处理会影响牙齿稳固'],
    advantages: ['早处理容易控制', '保护牙龈和牙槽骨健康'],
  },
  恒牙萌出空间不足: {
    risks: ['恒牙可能没地方长,容易长歪或拥挤', '将来矫正难度会更大'],
    advantages: ['趁换牙期早干预,引导恒牙顺利萌出', '减少以后正畸的复杂程度'],
  },
  儿牙早矫: {
    risks: ['不良习惯或颌骨发育问题越拖越难纠正', '可能影响恒牙排列和脸型发育'],
    advantages: ['替牙期是早矫黄金期,效果好、周期短', '趁现在引导,省去将来复杂矫正'],
  },
};

// ─────────────────────────────────────────────────────────
// 复查时长配置(非治疗时长)— "复查建议·检查说明"小节用
// ─────────────────────────────────────────────────────────
export const TREATMENT_DURATION: Record<string, string> = {
  儿牙早矫: '复查检查约30-45分钟,医生会详细评估宝宝的恒牙萌出情况和间隙保持需求',
  恒牙萌出空间不足: '复查检查约30分钟,医生会详细评估恒牙萌出情况',
  缺失牙: '复查检查约30分钟,了解缺失牙位目前状况',
  牙槽骨吸收: '复查检查约30-45分钟,需要仔细检查牙周健康状况',
  牙周病: '复查检查约30-45分钟,评估牙周健康情况',
  牙周炎: '复查检查约30-45分钟,评估牙周健康情况',
  错颌畸形: '复查检查约30分钟,医生评估咬合与矫治方案',
  牙体损伤: '复查检查约20-30分钟,查看牙体缺损情况',
  根尖周炎: '复查检查约20-30分钟,查看牙髓和根尖情况',
  牙龈问题: '复查检查约20-30分钟,评估牙龈健康',
  阻生牙: '复查检查约20-30分钟,评估阻生牙位置',
  颌骨囊肿: '复查检查约30分钟,评估囊肿范围',
  龋齿: '复查检查约20-30分钟,查看牙齿状况',
  其他: '复查检查约30分钟',
};

// ─────────────────────────────────────────────────────────
// subKey → 文案字典键(刻意分列:同病种两套字典中文 key 可能不同,如 jaw_cyst)
// ─────────────────────────────────────────────────────────
const SUBKEY_PHRASING: Record<string, { kp: string; dur: string }> = {
  missing_tooth: { kp: '缺失牙', dur: '缺失牙' },
  caries_no_filling: { kp: '龋齿', dur: '龋齿' },
  endo_no_rct: { kp: '根尖周炎', dur: '根尖周炎' },
  perio_no_srp: { kp: '牙周炎', dur: '牙周炎' },
  ortho_no_consult: { kp: '错颌畸形', dur: '错颌畸形' },
  hard_tissue_damage: { kp: '牙体损伤', dur: '牙体损伤' },
  gum_alveolar_lesion: { kp: '牙龈问题', dur: '牙龈问题' },
  impacted_tooth: { kp: '阻生牙', dur: '阻生牙' },
  // 修复:keypoints 字典里是「囊肿」,duration 字典里是「颌骨囊肿」—— 分列对齐,不再静默丢 risks
  jaw_cyst: { kp: '囊肿', dur: '颌骨囊肿' },
  development_eruption: { kp: '恒牙萌出空间不足', dur: '恒牙萌出空间不足' },
};

// ── 文本兜底归一(处理无 subKey 的边界) ──
const MISSED_PRIORITY = ['儿牙早矫', '恒牙萌出空间不足', '缺失牙', '牙槽骨吸收'];

function canonicalMissedKey(missedText: string | null | undefined): string | null {
  const s = (missedText ?? '').trim();
  if (!s) return null;
  const keys = [
    ...new Set([...MISSED_PRIORITY, ...Object.keys(MISSED_DIAGNOSIS_KEY_POINTS), ...Object.keys(TREATMENT_DURATION)]),
  ];
  for (const k of keys) if (s.includes(k)) return k;
  return null;
}

function lookupReviewDuration(key: string | null): string {
  return (key && TREATMENT_DURATION[key]) || TREATMENT_DURATION['其他']!;
}

export interface DiseaseKnowledge {
  /** 患者口径病种名(话术里说的,如"缺失牙") */
  label: string;
  /** 不处理的风险(口语,稳健挑 1-2) */
  risks: string[];
  /** 趁早处理的好处 */
  advantages: string[];
  /** 复查说明文案 */
  reviewDuration: string;
  /** 年龄适应性(可选) */
  ageFit?: MissedKeyPoints['ageFit'];
}

/**
 * reason → 病种文案(**稳健档 prompt + fallback 共用入口**)。
 *   label 走 shared(canonical);risks/advantages/reviewDuration 走本文件(稳健文案)。
 *   subKey 优先精确;未映射 → 文本归一兜底。行为与重组前 disease-knowledge.resolveDisease 一致。
 */
export function resolveDisease(
  reason:
    | {
        subKey?: string | null;
        dxCode?: string | null;
        reason?: string | null;
        scenarioLabel?: string | null;
        leadTrigger?: { type: string; code: string } | null;
      }
    | null
    | undefined,
  fallbackLabel: string,
): DiseaseKnowledge {
  const base = (reason?.subKey ?? '').split('@')[0]!.trim();
  // 触发感知:仅医生建议为首(无诊断)→ {应治未治项}用建议名(如"建议种植"),不套"缺失牙";
  //   风险/优势仍按子场景(种植/修复缺口的风险本就适用),只换病种名。
  const lead = reason?.leadTrigger;
  const isRecLead = lead?.type === 'recommendation' && !!lead.code;
  const label = isRecLead
    ? diagnosisCodeNameZh(lead!.code) || diseaseLabelForSubKey(base)
    : (diseaseLabelForSubKey(base) ?? null);
  const phrasing = base ? SUBKEY_PHRASING[base] : undefined;
  if (label && phrasing) {
    const kp = MISSED_DIAGNOSIS_KEY_POINTS[phrasing.kp];
    return {
      label,
      risks: kp?.risks ?? [],
      advantages: kp?.advantages ?? [],
      reviewDuration: TREATMENT_DURATION[phrasing.dur] ?? TREATMENT_DURATION['其他']!,
      ageFit: kp?.ageFit,
    };
  }
  // 兜底:无 subKey / 未映射 → 文本归一
  const text = `${reason?.scenarioLabel ?? ''} ${reason?.reason ?? ''}`;
  const key = canonicalMissedKey(text);
  const kp = key ? MISSED_DIAGNOSIS_KEY_POINTS[key] : null;
  return {
    label: label ?? key ?? fallbackLabel,
    risks: kp?.risks ?? [],
    advantages: kp?.advantages ?? [],
    reviewDuration: lookupReviewDuration(key),
    ageFit: kp?.ageFit,
  };
}
