/**
 * One-time script: Allocate credits for active subscriptions with 0 balance.
 *
 * Run inside the API container:
 *   npx tsx allocate-credits.ts
 *
 * This script finds users with active subscriptions who have 0 credit balance
 * and allocates credits based on their subscription tier.
 */

import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

async function main() {
  // Find all active subscriptions
  const subscriptions = await prisma.subscription.findMany({
    where: { status: 'active' },
    include: { user: true },
  });

  console.log(`Found ${subscriptions.length} active subscription(s)`);

  for (const sub of subscriptions) {
    // Get current balance
    const latestTransaction = await prisma.creditTransaction.findFirst({
      where: { user_id: sub.user_id },
      orderBy: { created_at: 'desc' },
      select: { balance_after: true },
    });

    const currentBalance = latestTransaction?.balance_after ?? 0;

    // Look up tier credit allocation
    const tier = await prisma.subscriptionTier.findUnique({
      where: { plugin_slug: { plugin: sub.plugin, slug: sub.plan_tier } },
    });

    const creditAllocation = tier?.credit_allocation ?? 1_000_000;

    console.log(`User ${sub.user_id} (${sub.user?.email}): tier=${sub.plan_tier}, balance=${currentBalance}, allocation=${creditAllocation}`);

    if (currentBalance <= 0) {
      const newBalance = currentBalance + creditAllocation;

      await prisma.creditTransaction.create({
        data: {
          user_id: sub.user_id,
          type: 'allocation',
          amount: creditAllocation,
          balance_after: newBalance,
          description: `Credit allocation for ${sub.plan_tier} plan (manual recovery)`,
        },
      });

      console.log(`  -> Allocated ${creditAllocation} credits. New balance: ${newBalance}`);
    } else {
      console.log(`  -> Balance is positive, skipping.`);
    }
  }
}

main()
  .catch(console.error)
  .finally(() => prisma.$disconnect());
