/**
 * 备注模板系统（plan.md「2.9 备注模板系统」）。
 * 参考 AutoAccounting 的 Remark Template Engine（16 个占位符 + 相邻重复归一化）。
 */

import type { ImportedEvent } from '../core/types';
import { ADJACENT_DUP_MIN_LEN, ADJACENT_DUP_WHITELIST } from './ruleConfig';

export interface RemarkTemplate {
  id: string;
  name: string;
  template: string;   // 支持占位符，如 "【商户名称】-【金额】"
  enabled: boolean;
}

/** 占位符 → 解析函数（参考 AutoAccounting 的 16 个占位符）。 */
const PLACEHOLDERS: Record<string, (e: ImportedEvent) => string> = {
  '【商户名称】': (e) => e.counterparty || '未知商户',
  '【商品名称】': (e) => e.memo || '',                       // 商品说明
  '【金额】': (e) => e.amount,
  '【分类】': (e) => e.raw?.['category'] || '',    // 分类（需预填）
  '【账本】': (e) => e.raw?.['bookName'] || '',    // 账本名
  '【原始资产】': (e) => e.raw?.['accountFrom'] || '',  // 原始资产账户
  '【目标资产】': (e) => e.raw?.['accountTo'] || '',    // 目标资产账户
  '【规则名称】': (e) => e.raw?.['ruleName'] || '',     // 命中规则名
  '【AI】': (e) => e.raw?.['aiSuggestion'] || '',       // AI 建议备注
  '【货币类型】': (e) => e.currency || 'CNY',
  '【手续费】': (e) => e.raw?.['fee'] || '',
  '【标签】': (e) => e.raw?.['tags'] || '',
  '【交易类型】': (e) => e.direction,
  '【时间】': (e) => e.occurredAt.slice(11, 16),   // HH:mm
  '【日期】': (e) => e.occurredAt.slice(0, 10),     // YYYY-MM-DD
  '【备注】': (e) => e.memo || '',
};

/** 预编译占位符正则，避免运行时循环创建 RegExp */
const PLACEHOLDER_REGEXES = Object.fromEntries(
  Object.keys(PLACEHOLDERS).map(ph => [
    ph,
    new RegExp(ph.replace(/[【】]/g, '\\$&'), 'g')
  ])
);

/** 生成备注：替换模板中的占位符。 */
export function generateRemark(template: string, event: ImportedEvent): string {
  let remark = template;
  for (const [placeholder, resolver] of Object.entries(PLACEHOLDERS)) {
    const rx = PLACEHOLDER_REGEXES[placeholder];
    remark = remark.replace(rx, resolver(event));
  }
  // 相邻重复归一化（如"买菜买菜"→"买菜"）
  remark = normalizeAdjacentDuplicates(remark);
  return remark.trim();
}

/**
 * 相邻重复归一化（参考 AutoAccounting normalizeName）。
 * 只处理相邻重复，避免误删（如"京东自营京东自营旗舰店"→"京东自营旗舰店"）。
 */
export function normalizeAdjacentDuplicates(text: string): string {
  // 匹配连续重复的 N-4 字符片段（N = ADJACENT_DUP_MIN_LEN，默认 3，避免误伤叠词）
  const minLen = ADJACENT_DUP_MIN_LEN;
  const pattern = new RegExp(`(.{${minLen},4})\\1+`, 'g');
  return text.replace(pattern, (match, group) => {
    // 白名单中的叠词不做归一化
    if (ADJACENT_DUP_WHITELIST.includes(group)) return match;
    return group;
  });
}
