/**
 * Memory sanitize —— PRD INV-1 跨 org 注入合规约束
 *
 * 当 per-user memory 的 organizationId 与当前 session.organizationId 不一致时，
 * memory 内容里可能含他组织业务上下文（项目代号 / 客户名 / 财务数字 / 邮箱 / 部门代号），
 * 必须剥离后再注入，仅保留个人偏好类内容（"用户偏好 SQL"、"用户喜欢 dark mode"）。
 *
 * 当前是 regex 基础版（PR M1-step1）；M5+ 接 PII detector 走 ModelRouter，
 * 改为 NLP NER + 字段级 redaction，本 util 退化为最后兜底层。
 */

export interface SanitizeRule {
  readonly name: string;
  readonly pattern: RegExp;
  readonly replacement: string;
}

export const SANITIZE_RULES: readonly SanitizeRule[] = [
  // 邮箱（含内部 / 客户邮箱）
  {
    name: 'email',
    pattern: /[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g,
    replacement: '[email-redacted]',
  },
  // 货币金额（¥/$/￥/€ + 数字）
  {
    name: 'currency',
    pattern: /[¥$￥€]\s*\d[\d,]*(?:\.\d+)?/g,
    replacement: '[amount-redacted]',
  },
  // 项目 / 客户代号（≥2 大写字母 + 可选连字符/下划线 + ≥1 数字，如 FFAI-001 / PRJ_2024 / SAP123）
  {
    name: 'projectCode',
    pattern: /\b[A-Z]{2,}[-_]?\d+\b/g,
    replacement: '[code-redacted]',
  },
  // 长连续数字 ≥ 6 位（工号 / 订单号 / 大额数字）
  {
    name: 'longNumber',
    pattern: /\b\d{6,}\b/g,
    replacement: '[number-redacted]',
  },
];

/**
 * 跨 org 注入前对 memory 内容做兜底脱敏。
 * 当前规则保守（宁可多脱）；命中即替换，多类型规则按 SANITIZE_RULES 顺序串行。
 */
export function sanitizeForCrossOrg(content: string): string {
  let out = content;
  for (const rule of SANITIZE_RULES) {
    out = out.replace(rule.pattern, rule.replacement);
  }
  return out;
}
