import { NextRequest, NextResponse } from "next/server";
import { auth } from "@/auth";
import { db } from "@/lib/db";
import { getStripeClient, getStripeMode, getPriceId } from "@/lib/stripe";

const APP_URL = process.env.NEXT_PUBLIC_APP_URL ?? "https://kc-systems.com";

export async function POST(req: NextRequest) {
  const session = await auth();
  if (!session?.user?.id) {
    return NextResponse.json({ error: "Not authenticated." }, { status: 401 });
  }

  const { packageId, currency } = await req.json() as { packageId: string; currency: "usd" | "ngn" };

  if (!packageId || !["usd", "ngn"].includes(currency)) {
    return NextResponse.json({ error: "Invalid request." }, { status: 400 });
  }

  const pkg = await db.subscriptionPackage.findUnique({ where: { id: packageId } });
  if (!pkg || !pkg.isActive) {
    return NextResponse.json({ error: "Package not found." }, { status: 404 });
  }

  // Check not already subscribed
  const existing = await db.subscription.findFirst({
    where: { userId: session.user.id, packageId, status: "active" },
  });
  if (existing) {
    return NextResponse.json({ error: "You already have this subscription." }, { status: 409 });
  }

  const stripe = await getStripeClient();
  const mode = await getStripeMode();

  const priceId = getPriceId(pkg, currency, mode);
  if (!priceId) {
    return NextResponse.json(
      { error: `No Stripe price configured for ${currency.toUpperCase()} in ${mode} mode. Contact admin.` },
      { status: 422 }
    );
  }

  const user = await db.user.findUnique({
    where: { id: session.user.id },
    select: { email: true, name: true, stripeCustomerId: true },
  });
  if (!user) return NextResponse.json({ error: "User not found." }, { status: 404 });

  // Get or create Stripe customer
  let customerId = user.stripeCustomerId;
  if (!customerId) {
    const customer = await stripe.customers.create({
      email: user.email!,
      name: user.name,
      metadata: { userId: session.user.id },
    });
    customerId = customer.id;
    await db.user.update({ where: { id: session.user.id }, data: { stripeCustomerId: customerId } });
  }

  const checkoutSession = await stripe.checkout.sessions.create({
    customer: customerId,
    mode: "subscription",
    line_items: [{ price: priceId, quantity: 1 }],
    success_url: `${APP_URL}/dashboard?subscribed=1`,
    cancel_url: `${APP_URL}/subscribe`,
    metadata: {
      userId: session.user.id,
      packageId,
      currency,
    },
    subscription_data: {
      metadata: { userId: session.user.id, packageId, currency },
    },
  });

  return NextResponse.json({ url: checkoutSession.url });
}
