/**
 * script-facts — 确定性渲染 helper(**不含 PII**):智能日期 + 牙位俗称。
 *
 * 设计原则:LLM 不该做的确定性活(日期格式、FDI→俗称查表)在这里算好,作为事实塞 user prompt。
 *   ⚠️ 人名/称呼(PII)派生不在本文件 —— 见 shared/pii.ts(callSalutation / deidentifyDoctor);
 *      病种文案见 tiers/stable/phrasing.ts。
 */

// ─────────────────────────────────────────────────────────
// 智能日期显示(今年→X月X号 / 去年→去年X月 / 更早→XXXX年X月)
//   —— 替代提示词里那段 python datetime 函数(LLM 不该跑日期逻辑)
// ─────────────────────────────────────────────────────────
export function smartDateDisplay(visit: Date | string | null | undefined, now: Date): string | null {
  if (!visit) return null;
  const d = visit instanceof Date ? visit : new Date(visit);
  if (Number.isNaN(d.getTime())) return null;
  const m = d.getMonth() + 1;
  if (d.getFullYear() === now.getFullYear()) return `${m}月${d.getDate()}号`;
  if (d.getFullYear() === now.getFullYear() - 1) return `去年${m}月`;
  return `${d.getFullYear()}年${m}月`;
}


// ─────────────────────────────────────────────────────────
// 牙位俗称渲染(FDI → 患者口语;边界渲染器,ScriptContext 里只存 FDI 结构)
//   设计:粗粒度即可("上门牙"够,不需要"左上中切牙"),让客服讲话自然。
//   多牙位 "/" 分隔,去重保序。三档话术 + 实时教练共用。
//
//   FDI 规则:第1位=象限(1-4 恒牙,5-8 乳牙);第2位=位置(1=中切,2=侧切,3=尖牙,
//   4-5=前磨,6-7=磨牙,8=智齿);1x/2x 上颌,3x/4x 下颌。
// ─────────────────────────────────────────────────────────
export function fdiToFriendly(fdi: string): string | null {
  const s = fdi.trim();
  if (s === '*whole' || s.toLowerCase() === 'whole') return '全口';
  // ① FDI 数字记法:第1位象限(1-4 恒牙,5-8 乳牙),第2位位置
  const m = /^([1-8])([1-8])$/.exec(s);
  if (m) {
    const q = Number(m[1]);
    const t = Number(m[2]);
    const upper = q === 1 || q === 2 || q === 5 || q === 6;
    const baby = q >= 5 ? '乳' : '';
    const where = upper ? '上' : '下';
    if (t === 1 || t === 2) return `${where}${baby}门牙`;
    if (t === 3) return `${where}尖牙`;
    if (t === 4 || t === 5) return `${where}小磨牙`;
    if (t === 6 || t === 7) return `${where}大磨牙`;
    if (t === 8) return '智齿';
    return null;
  }
  // ② 乳牙"象限+字母"记法(host):1-4 象限 + A-E(A中切/B侧切/C尖牙/D第一乳磨/E第二乳磨)
  const d = /^([1-4])([A-Ea-e])$/.exec(s);
  if (d) {
    const q = Number(d[1]);
    const tooth = d[2]!.toUpperCase();
    const where = q === 1 || q === 2 ? '上' : '下';
    if (tooth === 'A' || tooth === 'B') return `${where}乳门牙`;
    if (tooth === 'C') return `${where}乳尖牙`;
    if (tooth === 'D' || tooth === 'E') return `${where}乳磨牙`;
    return null;
  }
  return null;
}

/** FDI 牙位串/数组 → 俗称("上门牙/智齿");都解析不出兜底原样返回 */
export function toothFriendly(tooth: string | string[]): string {
  const parts = Array.isArray(tooth)
    ? tooth
    : tooth.split(/[;,，;\s]+/).map((s) => s.trim()).filter(Boolean);
  const friendly: string[] = [];
  const seen = new Set<string>();
  for (const p of parts) {
    const label = fdiToFriendly(p);
    if (label && !seen.has(label)) {
      seen.add(label);
      friendly.push(label);
    }
  }
  const raw = Array.isArray(tooth) ? tooth.join('/') : tooth;
  return friendly.length > 0 ? friendly.join('/') : raw;
}
