import Stripe from "stripe";

export default defineEventHandler(async (event) => {
  const config = useRuntimeConfig();
  const stripeSecretKey = config.stripeSecretKey;

  if (!stripeSecretKey) {
    throw createError({
      statusCode: 500,
      statusMessage: "Stripe secret key not configured",
    });
  }

  const stripe = new Stripe(stripeSecretKey, {
    apiVersion: "2025-10-29.clover",
  });

  const body = await readBody<{
    designId: string;
    templateId?: string;
    designName?: string;
    amount: number;
    currency?: string;
    successUrl: string;
    cancelUrl: string;
    customerEmail?: string;
  }>(event);

  if (
    !body?.designId ||
    !body?.amount ||
    !body?.successUrl ||
    !body?.cancelUrl
  ) {
    throw createError({
      statusCode: 400,
      statusMessage: "Missing required fields",
    });
  }

  const { currency = "usd" } = body;

  const session = await stripe.checkout.sessions.create({
    mode: "payment",
    payment_method_types: ["card"],
    billing_address_collection: "auto",
    customer_email: body.customerEmail,
    shipping_address_collection: { allowed_countries: ["US", "CA"] },
    line_items: [
      {
        quantity: 1,
        price_data: {
          currency,
          unit_amount: Math.round(body.amount * 100),
          product_data: {
            name: body.designName ?? `Slipmat design ${body.designId}`,
            metadata: {
              designId: body.designId,
              ...(body.templateId ? { templateId: body.templateId } : {}),
            },
          },
        },
      },
    ],
    metadata: {
      designId: body.designId,
      ...(body.templateId ? { templateId: body.templateId } : {}),
    },
    success_url: body.successUrl,
    cancel_url: body.cancelUrl,
  });

  return { id: session.id, url: session.url };
});
