/**
 * 亲戚关系方向的**运行时纠正** —— 按年龄实时判,不信源数据填的方向。
 *
 * ## 为什么需要(2026-07-30 测试服全量实证)
 * `patient_relations.relationship` 的方向在两个宿主上质量差了两个数量级:
 *
 *   jvs-dw(瑞尔)  43,279 条亲戚边,与年龄矛盾 428 条 → **1.0%**,基本可信
 *   friday          2,427 条亲戚边,矛盾 1,187 条;只看父母/子女**对**更刺眼:
 *                   mother↔child 326 对里只有 8 对方向对(2.5%)
 *                   father↔child 231 对里只有 9 对方向对(3.9%)
 *                   → **97% 是反的**
 *
 * 根因在 data/friday/assemblers/patient_relation.yaml:那份 enum_mapping 假设源码语义是
 * 「本人是对方的 X」,于是映射时取了**逆关系**(码2 爸爸 → child)。数据说这个假设是错的 ——
 * FRIDAY 存的码本来就是「对方是本人的 X」,跟 PAC 契约同向,多反转了一次。
 * 摄入侧要修(改 yaml + 重摄该资源),但那是另一件事;**展示侧不能等**:
 * 跟客服说"这是他妈妈"而实际是女儿,通话中会当场出丑。
 *
 * ## 做法:年龄定方向
 * 生日覆盖率 98.8%(会显示的那批边),所以这道判定几乎总能用上。
 *   · 标成长辈但对方更年轻 → 实际是晚辈
 *   · 标成晚辈但对方更年长 → 实际是长辈(按对方性别拆父/母;性别缺 → 「父母」不硬猜)
 *   · 配偶 / 兄弟姐妹是**对称关系**,没有方向可纠,原样返回
 *   · 任一方缺生日 → 原样返回(不猜)
 *
 * 同龄(差 0 岁)也算矛盾:父母子女不可能同岁,而配偶同岁很正常 —— 后者本就不参与判定。
 */

/** 长辈类(关系人比本人年长才合理) */
const ELDER: Record<string, string> = { mother: 'child', father: 'child', grandparent: 'grandchild' };
/** 晚辈类(关系人比本人年轻才合理)→ 纠正后的长辈码由性别决定,见下 */
const YOUNGER = new Set(['child', 'grandchild']);

export interface KinResolution {
  /** 纠正后的关系码(可能等于入参) */
  relationship: string;
  /** 是否被年龄纠正过 —— UI 可据此给一句 hover 说明,让客服知道这不是源数据原文 */
  ageCorrected: boolean;
}

/**
 * @param relationship 源数据里的关系码
 * @param selfAge      本人年龄
 * @param relAge       关系人年龄
 * @param relGender    关系人性别('男'/'女'/'M'/'F' 等;缺失 → 纠正成通用「父母」)
 */
export function resolveKinRelationship(
  relationship: string,
  selfAge: number | null | undefined,
  relAge: number | null | undefined,
  relGender?: string | null,
): KinResolution {
  const keep = { relationship, ageCorrected: false };
  if (selfAge == null || relAge == null) return keep;

  // 长辈类标错 → 降到对应晚辈类(child / grandchild),不需要性别
  if (ELDER[relationship] && relAge <= selfAge) {
    return { relationship: ELDER[relationship]!, ageCorrected: true };
  }

  // 晚辈类标错 → 升到长辈类;父/母要看关系人性别,拿不到就用中性的 parent
  if (YOUNGER.has(relationship) && relAge >= selfAge) {
    if (relationship === 'grandchild') return { relationship: 'grandparent', ageCorrected: true };
    const g = (relGender ?? '').trim().toUpperCase();
    const code = g === '男' || g === 'M' ? 'father' : g === '女' || g === 'F' ? 'mother' : 'parent';
    return { relationship: code, ageCorrected: true };
  }

  return keep;
}
