/**
 * 交易级去重键存储（已处理交易的 LRU 缓存 + 磁盘持久化）。
 *
 * 从 automationPipeline.ts 提取，职责单一：
 * - 记录本次运行期间已处理的交易键（日期+金额+对手方）
 * - LRU 淘汰（最大 500 条）
 * - 持久化到磁盘（App 重启后恢复，避免重复弹窗）
 */

import * as FileSystem from 'expo-file-system/legacy';
import { logger } from '../../utils/logger';

const processedTxKeys = new Set<string>();

/** 最大容量，超出时清理最旧的条目。 */
const PROCESSED_TX_KEYS_MAX = 500;

/** 持久化文件路径。 */
const TX_KEYS_FILE = (FileSystem.documentDirectory ?? '') + 'processed_tx_keys.json';
const TX_KEYS_TMP = TX_KEYS_FILE + '.tmp';

/** 加载已处理的交易键（App 启动时调用）。 */
export async function loadProcessedTxKeys(): Promise<void> {
  try {
    const info = await FileSystem.getInfoAsync(TX_KEYS_FILE);
    if (info.exists) {
      const content = await FileSystem.readAsStringAsync(TX_KEYS_FILE);
      const keys: string[] = JSON.parse(content);
      for (const k of keys) processedTxKeys.add(k);
    }
  } catch (e) {
    logger.warn('txKeyStore', `加载 processedTxKeys 失败: ${e}`);
  }
}

/** 保存已处理的交易键到磁盘（原子写入：tmp + rename）。 */
function saveProcessedTxKeys(): void {
  const keys = Array.from(processedTxKeys);
  const content = JSON.stringify(keys);
  FileSystem.writeAsStringAsync(TX_KEYS_TMP, content)
    .then(() => FileSystem.moveAsync({ from: TX_KEYS_TMP, to: TX_KEYS_FILE }))
    .catch(e => {
      logger.warn('txKeyStore', `保存 processedTxKeys 失败: ${e}`);
    });
}

/** 添加已处理的交易键（带 LRU 淘汰 + 持久化）。 */
export function addProcessedTxKey(key: string): void {
  if (processedTxKeys.size >= PROCESSED_TX_KEYS_MAX) {
    const oldest = processedTxKeys.keys().next().value;
    if (oldest) processedTxKeys.delete(oldest);
  }
  processedTxKeys.add(key);
  saveProcessedTxKeys();
}

/** 检查交易键是否已处理。 */
export function hasProcessedTxKey(key: string): boolean {
  return processedTxKeys.has(key);
}

/** 删除交易键（用户忽略交易时调用）。 */
export function removeProcessedTxKey(key: string): void {
  processedTxKeys.delete(key);
  saveProcessedTxKeys();
}

/** 清空所有已处理的交易键。 */
export function clearProcessedTxKeys(): void {
  processedTxKeys.clear();
  saveProcessedTxKeys();
}
