/**
 * Work record generator.
 *
 * Produces realistic music catalogue entries with titles, ISWCs, genres,
 * rights types, writer splits, creation dates, and 24-month income history.
 */

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

const GENRES = [
  'Pop', 'Rock', 'Jazz', 'Classical', 'Hip-Hop',
  'R&B', 'Electronic', 'Latin', 'Country', 'Folk',
] as const;

const TITLE_ADJECTIVES = [
  'Midnight', 'Golden', 'Broken', 'Electric', 'Silent',
  'Burning', 'Velvet', 'Crystal', 'Neon', 'Fading',
  'Crimson', 'Hollow', 'Rising', 'Frozen', 'Endless',
  'Savage', 'Gentle', 'Wild', 'Lost', 'Sacred',
] as const;

const TITLE_NOUNS = [
  'Dreams', 'Heart', 'Rain', 'Fire', 'Sky',
  'River', 'Shadow', 'Light', 'Storm', 'Echo',
  'Horizon', 'Whisper', 'Thunder', 'Flame', 'Ocean',
  'Wings', 'Dust', 'Moon', 'Stars', 'Road',
] as const;

const TITLE_SUFFIXES = [
  '', '', '', '', '',
  ' (Remix)', ' (Acoustic)', ' (Live)', ' (Deluxe)', ' (Radio Edit)',
] as const;

/** Generate a realistic-looking ISWC code: T-NNN.NNN.NNN-N */
function generateIswc(rng: SeededRng): string {
  const a = String(rng.randomInt(0, 999)).padStart(3, '0');
  const b = String(rng.randomInt(0, 999)).padStart(3, '0');
  const c = String(rng.randomInt(0, 999)).padStart(3, '0');
  const check = rng.randomInt(0, 9);
  return `T-${a}.${b}.${c}-${check}`;
}

/** Generate a plausible song title. */
function generateTitle(rng: SeededRng): string {
  const adj = rng.pick(TITLE_ADJECTIVES);
  const noun = rng.pick(TITLE_NOUNS);
  const suffix = rng.pick(TITLE_SUFFIXES);
  return `${adj} ${noun}${suffix}`;
}

/**
 * Generate 24 months of income data (Jan 2024 – Dec 2025).
 * Amounts follow a base level with random variation per month.
 */
function generateMonthlyIncome(rng: SeededRng): Array<{ month: string; amount: number }> {
  const months: Array<{ month: string; amount: number }> = [];
  const baseIncome = rng.randomFloat(50, 5000);

  for (let year = 2024; year <= 2025; year++) {
    for (let m = 1; m <= 12; m++) {
      const month = `${year}-${String(m).padStart(2, '0')}`;
      const variation = rng.randomFloat(0.5, 1.5);
      const amount = Math.round(baseIncome * variation * 100) / 100;
      months.push({ month, amount });
    }
  }

  return months;
}

/**
 * Generate Work records.
 *
 * @param rng   - Seeded PRNG instance
 * @param count - Number of works to generate (≥200 recommended)
 */
export function generateWorks(rng: SeededRng, count: number): Work[] {
  const works: Work[] = [];
  const startDate = new Date('2024-01-01');
  const endDate = new Date('2025-12-31');

  for (let i = 0; i < count; i++) {
    const id = `WRK-${String(i + 1).padStart(5, '0')}`;

    // Generate 1–4 writer splits that sum to 100%
    const splitCount = rng.randomInt(1, 4);
    const rawSplits: number[] = [];
    let remaining = 100;
    for (let s = 0; s < splitCount - 1; s++) {
      const maxSplit = remaining - (splitCount - s - 1); // leave at least 1% per remaining writer
      const split = rng.randomInt(1, Math.max(1, maxSplit));
      rawSplits.push(split);
      remaining -= split;
    }
    rawSplits.push(remaining);

    const writerSplits = rawSplits.map((percentage, idx) => ({
      composerId: `CMP-${String(rng.randomInt(1, 50)).padStart(4, '0')}`,
      percentage,
    }));

    works.push({
      id,
      title: generateTitle(rng),
      iswc: generateIswc(rng),
      genre: rng.pick(GENRES),
      rightsType: rng.next() < 0.6 ? 'controlled' : 'uncontrolled',
      writerSplits,
      createdAt: rng.randomDate(startDate, endDate),
      monthlyIncome: generateMonthlyIncome(rng),
    });
  }

  return works;
}
