/**
 * pii — 人名"去名留称呼"的**单一源**(患者 / 监护人 / 医生)。
 *
 * 纪律:
 *   - **不暴露真名(全名)**:徐雅静 / 韩维 这种全名不进 user prompt。
 *   - **但要有可用称呼**:给"姓 + 敬称"的自然称呼(徐女士 / 韩医生),LLM 直接用、客服也直接看。
 *   - 真名(全名)只在 PAC 内部 ScriptContext(深度档/内部可取),不进 prompt。
 *
 * 本文件统一产"称呼"(姓级):
 *   - 患者 / 监护人:callSalutation(年龄 + 性别 + 监护人 aware)、pickGuardian(挑监护人)。
 *   - 医生:deidentifyDoctor(取姓,模板拼"X医生")。
 */

/**
 * 医生去名 → 姓(模板会拼成"{姓}医生")。
 *   "韩维" → "韩"(→ 韩医生);空 → "您的主治"(→ 您的主治医生)。
 *   注:复姓(欧阳…)只取首字,极少见,暂接受。
 */
export function deidentifyDoctor(name: string | null | undefined): string {
  const n = (name ?? '').trim();
  if (!n) return '您的主治';
  // 已是泛指(如"您的主治医生")→ 去掉"医生"后缀避免重复(模板会补)
  if (n.endsWith('医生')) return n.slice(0, -2);
  return n.charAt(0);
}

/**
 * 患者通话称呼 — "姓 + 先生/女士"(性别未知默认先生,亚洲诊所语境;无名 → "您")。
 * 只取姓(去名),不出全名。
 */
function nameSpokenForm(name: string | null, gender: string | null): string {
  const surname = (name ?? '').charAt(0);
  if (!surname) return '您';
  if (gender === '男' || gender === 'M' || gender === 'male') return `${surname}先生`;
  if (gender === '女' || gender === 'F' || gender === 'female') return `${surname}女士`;
  return `${surname}先生`;
}

const RELATIONSHIP_LABEL_ZH: Record<string, string> = {
  mother: '妈妈',
  father: '爸爸',
  grandparent: '祖辈',
};

/**
 * 从关系行里挑监护人:优先已建档(有姓名),关系优先 妈妈 > 爸爸 > 祖辈。
 */
export function pickGuardian(
  rels: Array<{ relationship: string; relatedPatient: { name: string | null } | null }>,
): { relationship: string; relationshipLabel: string; name: string | null } | null {
  const order = ['mother', 'father', 'grandparent'];
  const sorted = [...rels].sort((a, b) => {
    const an = a.relatedPatient?.name ? 0 : 1;
    const bn = b.relatedPatient?.name ? 0 : 1;
    if (an !== bn) return an - bn; // 有姓名优先
    return order.indexOf(a.relationship) - order.indexOf(b.relationship);
  });
  const g = sorted[0];
  if (!g) return null;
  return {
    relationship: g.relationship,
    relationshipLabel: RELATIONSHIP_LABEL_ZH[g.relationship] ?? '家长',
    name: g.relatedPatient?.name ?? null,
  };
}

/**
 * 通话称呼(单一源:年龄 + 性别 + 监护人 aware)— 姓级,绝不出全名。
 * - 未成年(≤12,打给监护人):妈妈→"{监护人姓}女士"、爸爸→"{监护人姓}先生";无监护人姓名 → "{患者姓}家长"。
 * - 成人:姓 + 先生/女士。
 */
export function callSalutation(
  name: string | null,
  gender: string | null,
  age: number | null,
  guardian: { relationship: string; name: string | null } | null,
): string {
  const surname = (name ?? '').charAt(0);
  if (age != null && age <= 12) {
    const gName = (guardian?.name ?? '').trim();
    if (gName) {
      const gs = gName.charAt(0);
      if (guardian!.relationship === 'mother') return `${gs}女士`;
      if (guardian!.relationship === 'father') return `${gs}先生`;
    }
    return surname ? `${surname}家长` : '您';
  }
  return nameSpokenForm(name, gender);
}
