/**
 * 信用卡管理（plan.md「5.4 信用卡管理」）。
 * 双轨制：账户本身在 .bean（如 Liabilities:CreditCard:CMB），
 * 本表只存 UI 增强字段（账单日/还款日/额度），不写回 .bean。
 */

import { addDecimals, subtractDecimals, toDateString } from '../core/decimal';
import type { Transaction } from '../core/types';

export interface CreditCard {
  id: string;
  name: string;
  lastFour: string;
  bankName: string;
  billingDay: number;      // 账单日（1-28）
  paymentDay: number;      // 还款日（1-28）
  creditLimit: string;
  currency: string;
  /** 关联的 Beancount 账户。 */
  linkedAccount: string;
}

export interface BillingPeriod {
  periodStart: string;
  periodEnd: string;
  dueDate: string;
}

/** 计算信用卡账单周期。 */
export function calculateBillingPeriod(card: CreditCard, currentDate: Date): BillingPeriod {
  const year = currentDate.getFullYear();
  const month = currentDate.getMonth();
  // 限制账单日/还款日不超过 28，防止月份溢出
  const billingDay = Math.min(card.billingDay, 28);
  const paymentDay = Math.min(card.paymentDay, 28);
  // 账单周期：上月账单日 ~ 本月账单日
  const periodStart = new Date(year, month - 1, billingDay);
  const periodEnd = new Date(year, month, billingDay);
  const dueDate = new Date(year, month, paymentDay);
  return {
    periodStart: toDateString(periodStart),
    periodEnd: toDateString(periodEnd),
    dueDate: toDateString(dueDate),
  };
}

/** 计算本期应还金额。 */
export function calculateStatementAmount(
  transactions: Transaction[],
  card: CreditCard,
  period: BillingPeriod,
): string {
  const periodTx = transactions.filter(t => {
    const date = t.date.slice(0, 10);
    return date >= period.periodStart && date < period.periodEnd
      && t.postings.some(p => p.account === card.linkedAccount || p.account.startsWith(card.linkedAccount + ':'));
  });
  return periodTx.reduce((sum, t) => {
    const expense = t.postings
      .filter(p => p.amount && p.amount.startsWith('-'))
      .reduce((s, p) => addDecimals([s, p.amount!.replace('-', '')]), '0');
    return addDecimals([sum, expense]);
  }, '0');
}

/** 计算可用额度（额度 - 当前欠款）。 */
export function calculateAvailableCredit(
  card: CreditCard,
  currentBalance: string,
): string {
  // balance 为欠款（正数），可用 = 额度 - 欠款
  const balanceAbs = currentBalance.startsWith('-') ? currentBalance.slice(1) : currentBalance;
  return subtractDecimals(card.creditLimit, balanceAbs);
}
