import { NextRequest, NextResponse } from 'next/server';
import { db, schema } from '@/lib/db';
import { eq, sql } from 'drizzle-orm';
import { getSession } from '@/lib/auth';
import { isCompanyOwner } from '@/lib/companies';
import { getPlanCapabilities } from '@/lib/plan-access';

/**
 * POST /api/companies/[id]/slots
 * Purchase one additional conversion slot for the company.
 * Owner-only. Payment is processed externally (Stripe/PayPal) before calling this.
 * Body: { quantity?: number } — defaults to 1
 */
export async function POST(
  request: NextRequest,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const { id: companyId } = await params;

    const accessToken = request.cookies.get('scriba.access_token')?.value;
    const session = await getSession(accessToken);
    if (!session) {
      return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
    }

    const owner = await isCompanyOwner(session.user.id, companyId);
    if (!owner && session.user.role !== 'admin') {
      return NextResponse.json({ error: 'Only the company owner can purchase extra conversion slots' }, { status: 403 });
    }

    const body = await request.json().catch(() => ({}));
    const rawQuantity = typeof body.quantity === 'number' ? body.quantity : 1;
    if (!Number.isFinite(rawQuantity) || rawQuantity < 1 || rawQuantity > 100) {
      return NextResponse.json({ error: 'quantity must be an integer between 1 and 100' }, { status: 400 });
    }
    const quantity = Math.floor(rawQuantity);

    // Look up the company's plan to determine the per-slot price
    const company = await db.query.companies.findFirst({
      where: eq(schema.companies.id, companyId),
      columns: { package: true, extraConversionSlots: true },
    });
    if (!company) {
      return NextResponse.json({ error: 'Company not found' }, { status: 404 });
    }

    const pricePerSlotCents = getPlanCapabilities(company.package).extraConversionPriceEur * 100;
    const totalCents = pricePerSlotCents * quantity;

    await db
      .update(schema.companies)
      .set({
        extraConversionSlots: sql`extra_conversion_slots + ${quantity}`,
        updatedAt: new Date(),
      })
      .where(eq(schema.companies.id, companyId));

    // Record the purchase so it shows up in the billing estimate
    await db.insert(schema.slotPurchases).values({
      id: crypto.randomUUID(),
      companyId,
      userId: session.user.id,
      quantity,
      pricePerSlotCents,
      totalCents,
    });

    const updated = await db.query.companies.findFirst({
      where: eq(schema.companies.id, companyId),
      columns: { extraConversionSlots: true },
    });

    return NextResponse.json({
      success: true,
      extraConversionSlots: updated?.extraConversionSlots ?? (company.extraConversionSlots + quantity),
      slotChargeCents: totalCents,
    });
  } catch (error) {
    console.error('Slot purchase error:', error);
    return NextResponse.json({ error: 'Failed to purchase conversion slot' }, { status: 500 });
  }
}
