/**
 * Statement record generator.
 *
 * Produces Statement records referencing existing Payee IDs and names,
 * with periods, currencies, statuses, and financial amounts.
 */

import type { SeededRng } from '@/lib/mock-data/seed';
import type { Payee, Statement } from '@/lib/mock-data/types';

const CURRENCIES = ['USD', 'EUR', 'GBP', 'JPY', 'BRL', 'AUD', 'CAD', 'MXN'] as const;

const STATUSES: Statement['status'][] = ['Draft', 'Final', 'Published'];

/**
 * Generate Statement records.
 *
 * @param rng    - Seeded PRNG instance
 * @param count  - Number of statements to generate (≥30 recommended)
 * @param payees - Previously generated Payee records to reference
 */
export function generateStatements(rng: SeededRng, count: number, payees: Payee[]): Statement[] {
  const statements: Statement[] = [];

  // Generate period strings covering 24 months (Jan 2024 – Dec 2025)
  const periods: string[] = [];
  for (let year = 2024; year <= 2025; year++) {
    for (let m = 1; m <= 12; m++) {
      periods.push(`${year}-${String(m).padStart(2, '0')}`);
    }
  }

  for (let i = 0; i < count; i++) {
    const id = `STM-${String(i + 1).padStart(4, '0')}`;
    const payee = rng.pick(payees);
    const grossAmount = Math.round(rng.randomFloat(500, 50000) * 100) / 100;
    const deductions = Math.round(grossAmount * rng.randomFloat(0.05, 0.3) * 100) / 100;
    const netPayable = Math.round((grossAmount - deductions) * 100) / 100;

    statements.push({
      id,
      period: rng.pick(periods),
      payeeId: payee.id,
      payeeName: payee.name,
      currency: rng.pick(CURRENCIES),
      status: rng.pick(STATUSES),
      grossAmount,
      deductions,
      netPayable,
    });
  }

  return statements;
}
