/**
 * 交易标志系统（plan.md「2.2 交易标志系统」）。
 * 参考 AutoAccounting 的 Bill Flag System（位运算标志位）。
 */

export enum TransactionFlag {
  NONE = 0,
  EXCLUDE_FROM_STATS = 1 << 0,   // 不计入统计图表（但影响余额）
  EXCLUDE_FROM_BUDGET = 1 << 1,  // 不计入预算使用
  TRANSFER = 1 << 2,             // 标记为转账（自动识别）
  RECURRING = 1 << 3,            // 周期性交易模板
}

export function hasFlag(flags: number, flag: TransactionFlag): boolean {
  return (flags & flag) !== 0;
}

export function setFlag(flags: number, flag: TransactionFlag): number {
  return flags | flag;
}

export function clearFlag(flags: number, flag: TransactionFlag): number {
  return flags & ~flag;
}

export function toggleFlag(flags: number, flag: TransactionFlag): number {
  return hasFlag(flags, flag) ? clearFlag(flags, flag) : setFlag(flags, flag);
}

/** 统计过滤：是否应计入统计（排除 EXCLUDE_FROM_STATS）。 */
export function shouldCountInStats(flags: number): boolean {
  return !hasFlag(flags, TransactionFlag.EXCLUDE_FROM_STATS);
}

/** 预算过滤：是否应计入预算（排除 EXCLUDE_FROM_BUDGET）。 */
export function shouldCountInBudget(flags: number): boolean {
  return !hasFlag(flags, TransactionFlag.EXCLUDE_FROM_BUDGET);
}

/** 把 flags 序列化为 Beancount metadata（写回 .bean 时用）。 */
export function flagsToMetadata(flags: number): Record<string, string> {
  const meta: Record<string, string> = {};
  if (hasFlag(flags, TransactionFlag.EXCLUDE_FROM_STATS)) meta['bm-exclude-stats'] = 'true';
  if (hasFlag(flags, TransactionFlag.EXCLUDE_FROM_BUDGET)) meta['bm-exclude-budget'] = 'true';
  if (hasFlag(flags, TransactionFlag.TRANSFER)) meta['bm-transfer'] = 'true';
  if (hasFlag(flags, TransactionFlag.RECURRING)) meta['bm-recurring'] = 'true';
  return meta;
}
