/**
 * `--patients-file` 的解析helper —— 独立成模块,**不要塞回 reparse.cli.ts**。
 *
 * 原因:CLI 文件末尾是 `void main()`(全仓 CLI 通例),任何 import 都会当场启动 Nest
 * 并真跑一次 reparse。2026-07-27 我把测试直接 import CLI,结果测试跑起来对本地库
 * 执行了一次真实 reparse(115 行 Nest 日志)—— 纯函数放这里,测试只碰这里。
 * (CLI 侧另加了 require.main 闸做第二道防线。)
 */

const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;

/**
 * 解析 --patients-file 的内容。
 *
 * 宽容到什么程度是刻意的:操作者多半是 `psql -tAc ... > ids.txt` 直接倒出来的,
 * 会带前后空格、空行、行尾逗号;混着 uuid 和病历号也很常见(手上有什么用什么)。
 * 但**不做猜测性纠错** —— 认不出的原样返回,由调用方去库里查、查不到就报出来,不静默丢。
 */
export function parsePatientsFile(raw: string): string[] {
  const seen = new Set<string>();
  const out: string[] = [];
  for (const line of raw.split(/\r?\n/)) {
    // 允许行尾注释:`<id>   # 张三 缺牙` —— 圈人清单常顺手标注是谁
    const token = line.split('#')[0]!.trim().replace(/[,;]+$/, '');
    if (!token) continue;
    if (seen.has(token)) continue;
    seen.add(token);
    out.push(token);
  }
  return out;
}

/** 按形态拆成 uuid(patient.id)与其余(当 externalId 去库里查) */
export function splitPatientTokens(tokens: string[]): { ids: string[]; externalIds: string[] } {
  const ids: string[] = [];
  const externalIds: string[] = [];
  for (const t of tokens) (UUID_RE.test(t) ? ids : externalIds).push(t);
  return { ids, externalIds };
}
