import { db, ExpenseRecord, Payment } from '../../database/db';

export class AccountsService {
  /**
   * Records a new ISP operating expense (Upstream IIG/NTTN bandwidth, POP electricity, Staff salaries)
   */
  public static addExpense(data: {
    category: ExpenseRecord['category'];
    title: string;
    amount: number;
    paid_to: string;
    payment_method: string;
    expense_date?: string;
  }): ExpenseRecord {
    const expense: ExpenseRecord = {
      id: `exp_${Date.now()}_${Math.random().toString(36).substring(2, 6)}`,
      tenant_id: 'tenant_main',
      category: data.category,
      title: data.title,
      amount: Number(data.amount),
      paid_to: data.paid_to,
      payment_method: data.payment_method,
      expense_date: data.expense_date || new Date().toISOString().slice(0, 10),
      created_at: new Date().toISOString()
    };

    db.expense_records.unshift(expense);
    db.logAudit('SUPER_ADMIN', 'ACCOUNTS', 'EXPENSE_RECORDED', expense);
    db.persist();
    return expense;
  }

  /**
   * Generates complete Profit & Loss Balance Sheet
   */
  public static getFinancialSummary() {
    const totalRevenue = db.payments.reduce((sum, p) => sum + p.amount, 0);
    const totalExpenses = db.expense_records.reduce((sum, e) => sum + e.amount, 0);
    const netProfit = totalRevenue - totalExpenses;

    const expensesByCategory: Record<string, number> = {};
    db.expense_records.forEach(e => {
      expensesByCategory[e.category] = (expensesByCategory[e.category] || 0) + e.amount;
    });

    const revenueByGateway: Record<string, number> = {};
    db.payments.forEach(p => {
      revenueByGateway[p.gateway] = (revenueByGateway[p.gateway] || 0) + p.amount;
    });

    return {
      totalRevenueBDT: totalRevenue,
      totalExpensesBDT: totalExpenses,
      netProfitBDT: netProfit,
      profitMarginPercent: totalRevenue > 0 ? Number(((netProfit / totalRevenue) * 100).toFixed(1)) : 0,
      expensesByCategory,
      revenueByGateway,
      recentExpenses: db.expense_records.slice(0, 10),
      recentPayments: db.payments.slice(0, 10)
    };
  }

  /**
   * Field Collector manual cash collection
   */
  public static recordCollectorCash(params: {
    subscriberUsername: string;
    amount: number;
    collectorName: string;
  }) {
    const sub = db.subscribers.find(s => s.username === params.subscriberUsername);
    if (!sub) throw new Error('Subscriber not found');

    const payment: Payment = {
      id: `pay_cash_${Date.now()}`,
      subscriber_id: sub.id,
      reseller_id: sub.reseller_id,
      amount: params.amount,
      gateway: 'COLLECTOR_CASH',
      trx_id: `CASH-${Date.now().toString().slice(-6)}`,
      collector_name: params.collectorName,
      reference: sub.username,
      status: 'completed',
      created_at: new Date().toISOString()
    };

    db.payments.unshift(payment);
    db.logAudit('FIELD_TECH', params.collectorName, 'COLLECTOR_CASH_RECEIVED', payment);
    db.persist();
    return payment;
  }
}
