/**
 * 规则配置中心 — 所有可调规则参数的唯一数据源。
 *
 * 设计原则：
 * - 本文件只包含「数据」（关键词、正则、映射表、阈值），不包含业务逻辑
 * - 业务逻辑文件（ocr.ts / rules.ts / categories.ts 等）从此处导入配置
 * - 迭代规则（增删关键词、调整正则、修改阈值）只需修改本文件
 * - 本文件仅 import 类型（Direction），不 import 任何其他 domain 模块（避免循环依赖）
 */

import type { Direction } from '../core/types';

// ─── 1. 关键词过滤（通知/短信监听前置过滤） ──────────────────────

/** 白名单：文本必须包含任一关键词才视为可能的账单（空列表 = 不检查）。 */
export const KEYWORD_FILTER_WHITELIST: string[] = [
  '交易', '消费', '收入', '支出', '转账', '收款', '付款',
  '充值', '提现', '支付', '扣款', '退款',
];

/** 黑名单：包含任一关键词则直接拒绝（优先级高于白名单）。 */
export const KEYWORD_FILTER_BLACKLIST: string[] = [
  '广告', '推广', '优惠券', '红包封面', '会员到期', '活动',
];

// ─── 2. 方向检测规则（有序，首个命中即返回） ─────────────────────

/**
 * 方向检测规则表。
 *
 * 按优先级从高到低排列，detectDirection() 遍历此表，首个命中即返回。
 * direction 为 'default' 表示返回调用方的默认值（用于排除误匹配）。
 *
 * 迭代指南：
 * - 新增方向关键词：在对应优先级位置插入新条目
 * - 调整优先级：移动条目顺序
 * - 注意：「收款方」必须在「收款」之前，避免商户标识被误判为收入
 */
export interface DirectionRule {
  pattern: RegExp;
  direction: Direction | 'default';
  /** 可选注释（仅文档用途）。 */
  note?: string;
}

export const DIRECTION_RULES: DirectionRule[] = [
  { pattern: /退款|退回/, direction: 'refund' },
  // 利息+收入上下文 → income（存款利息）；单独利息/手续费 → fee
  { pattern: /(?:收到|到账|入账|收入).*利息|利息.*(?:到账|入账|收入)/, direction: 'income', note: '存款利息收入' },
  { pattern: /手续费|利息/, direction: 'fee', note: '手续费/贷款利息' },
  { pattern: /转入/, direction: 'income', note: '转入 = 钱到账户' },
  { pattern: /收入|到账|入账/, direction: 'income' },
  { pattern: /向你转账|收到转账/, direction: 'income', note: '别人转给我的单向转账' },
  { pattern: /支出|付款|消费|转出/, direction: 'expense' },
  { pattern: /转账/, direction: 'transfer', note: '方向不明确，标记为 transfer 供后续识别' },
  { pattern: /收款方/, direction: 'default', note: '「收款方」是商户标识，不判为收入' },
  { pattern: /收款/, direction: 'income' },
];

/** 方向检测默认值（所有规则都未命中时使用）。 */
export const DIRECTION_DEFAULT: Direction = 'expense';

// ─── 3. OCR Layer 1 规则模式 ─────────────────────────────────────

/**
 * OCR 截图规则匹配模式。
 *
 * 每条规则定义：主匹配模式（判断是否为该类账单）+ 字段提取器。
 * 迭代指南：新增支付渠道时，在此数组追加新条目即可。
 */
export interface OcrRulePattern {
  name: string;
  /** 主匹配模式（判断是否为该类账单）。 */
  pattern: RegExp;
  /** 字段提取器。 */
  extractors: {
    amount?: RegExp;
    merchant?: RegExp;
    time?: RegExp;
    card?: RegExp;
  };
}

export const OCR_RULES: OcrRulePattern[] = [
  {
    name: '微信支付',
    pattern: /微信支付/,
    extractors: {
      amount: /(?:金额|支付金额|￥|¥)\s*(-?[\d,]+(?:\.\d+)?)/,
      merchant: /(?:商户|收款方|对方)\s*[:：]?\s*([^\n,，。]+?)(?=\s*(?:金额|支付金额|￥|¥|元|支出|收入|付款|收款|退款|消费|转账|尾号|\d{4}[-/年]|\d{1,2}:)|$)/,
      time: /((?:\d{4}[-/年])?\d{1,2}[-/月]\d{1,2}[日]?[\s]+\d{1,2}:\d{2}(?::\d{2})?)/,
    },
  },
  {
    name: '支付宝',
    pattern: /支付宝|alipay/i,
    extractors: {
      amount: /(?:金额|支付金额|￥|¥)\s*(-?[\d,]+(?:\.\d+)?)/,
      merchant: /(?:收款方|对方|商户)\s*[:：]?\s*([^\n,，。]+?)(?=\s*(?:金额|支付金额|￥|¥|元|支出|收入|付款|收款|退款|消费|转账|尾号|\d{4}[-/年]|\d{1,2}:)|$)/,
      time: /((?:\d{4}[-/年])?\d{1,2}[-/月]\d{1,2}[日]?[\s]+\d{1,2}:\d{2}(?::\d{2})?)/,
    },
  },
  {
    name: '银行卡',
    pattern: /尾号\d{4}|信用卡|储蓄卡|借记卡/,
    extractors: {
      amount: /(?:消费|支出|金额|￥|¥)\s*(-?[\d,]+(?:\.\d+)?)/,
      merchant: /(?:商户|对方|于)\s*[:：]?\s*([^\n,，。]+?)(?=\s*(?:金额|支付金额|￥|¥|元|支出|收入|付款|收款|退款|消费|转账|尾号|\d{4}[-/年]|\d{1,2}:)|$)/,
      time: /((?:\d{4}[-/年])?\d{1,2}[-/月]\d{1,2}[日]?[\s]+\d{1,2}:\d{2}(?::\d{2})?)/,
      card: /尾号\s*(\d{4})/,
    },
  },
];

// ─── 4. 账户名映射（resolveSourceAccount 用） ────────────────────

/**
 * 支付方式名称 → 标准账户名映射。
 *
 * 迭代指南：新增支付方式别名时在此追加。
 * key = 原始支付方式文本（精确匹配），value = 标准化名称。
 */
export const ACCOUNT_NAME_MAPPINGS: Record<string, string> = {
  '零钱': '微信零钱',
  '余额': '支付宝余额',
  '账户余额': '支付宝余额',
};

/**
 * 支付方式包含匹配映射（key 被包含即命中）。
 * 优先级低于精确匹配。
 */
export const ACCOUNT_NAME_CONTAINS_MAPPINGS: { keyword: string; mapped: string }[] = [
  { keyword: '花呗', mapped: '支付宝花呗' },
];

/**
 * 负债类账户关键词（匹配到则归入 Liabilities 而非 Assets）。
 * 注意：仅匹配「信用卡」完整词，不匹配单独的「信用」以避免误判。
 */
export const LIABILITY_ACCOUNT_PATTERN: RegExp = /信用卡|花呗|借呗/;

// ─── 5. 账单详情页特征词（OCR 详情页判定） ───────────────────────

/** 详情页特征词列表（命中数 ≥ 阈值即判定为详情页）。 */
export const DETAIL_PAGE_LABELS: string[] = [
  '付款方式', '支付方式', '支付时间', '交易时间', '创建时间', '完成时间',
  '交易成功', '交易关闭', '支付成功', '退款成功', '待发货', '已发货',
  '商品说明', '商品名称', '订单号', '商家订单号', '收款方全称',
  '账单分类', '支付奖励', '计入收支', '退款单号', '物流单号',
  // 微信转账详情页（与消费详情页标签不同）
  '转账说明', '转账时间', '转账单号', '已存入零钱', '收款时间',
];

/**
 * 详情页判定最小命中数。
 * 设为 2 以匹配典型详情页特征词数量。
 */
export const DETAIL_PAGE_MIN_HITS = 2;

// ─── 6. 备注模板归一化 ───────────────────────────────────────────

/**
 * 相邻重复归一化最小匹配长度。
 * 设为 2 保持原有归一化能力，通过白名单保护合法叠词。
 */
export const ADJACENT_DUP_MIN_LEN = 2;

/** 相邻重复归一化白名单（这些叠词不做归一化）。 */
export const ADJACENT_DUP_WHITELIST: string[] = [
  '看看', '试试', '等等', '想想', '听听', '聊聊',
];

// ─── 7. 智能还款识别 ─────────────────────────────────────────────

/** 花呗还款固定目标账户。 */
export const HUABEI_REPAYMENT_ACCOUNT = 'Liabilities:支付宝花呗';

/** 信用卡还款正则（提取卡名）。 */
export const CREDIT_CARD_REPAYMENT_PATTERN = /([^\s|，,]+信用卡(?:（\d+）|\(\d+\))?)/;
