import Stripe from "stripe";
import { env } from "@/lib/env";
import { getStripeServerClient } from "@/lib/stripe";
import { completeCartById } from "@/lib/medusa/orders";

function json(status: number, payload: Record<string, unknown>) {
  return Response.json(payload, { status });
}

export async function POST(request: Request) {
  if (!env.stripeWebhookSecret) {
    return json(500, { error: "STRIPE_WEBHOOK_SECRET is missing." });
  }

  const signature = request.headers.get("stripe-signature");
  if (!signature) {
    return json(400, { error: "Missing stripe-signature header." });
  }

  const body = await request.text();
  const stripe = getStripeServerClient();

  let event: Stripe.Event;

  try {
    event = stripe.webhooks.constructEvent(body, signature, env.stripeWebhookSecret);
  } catch (error) {
    const message =
      error instanceof Error ? error.message : "Invalid webhook signature.";
    return json(400, { error: message });
  }

  try {
    switch (event.type) {
      case "checkout.session.completed":
      case "checkout.session.async_payment_succeeded": {
        const session = event.data.object as Stripe.Checkout.Session;
        const cartId = session.metadata?.medusa_cart_id || null;
        const paymentStatus = session.payment_status || "unknown";
        let medusaOrderId = session.metadata?.medusa_order_id || null;
        let completionState: string | null = null;
        let completionError: string | null = null;

        if (paymentStatus === "paid" && cartId && !medusaOrderId) {
          const completion = await completeCartById(cartId);
          medusaOrderId = completion.orderId;
          completionState = completion.state;
          completionError = completion.error;
        }

        if (medusaOrderId && session.metadata?.medusa_order_id !== medusaOrderId) {
          try {
            await stripe.checkout.sessions.update(session.id, {
              metadata: {
                ...(session.metadata || {}),
                medusa_order_id: medusaOrderId,
              },
            });
          } catch {
            // Session metadata update is best-effort.
          }
        }

        console.log("[stripe webhook] checkout paid", {
          stripeEventId: event.id,
          stripeSessionId: session.id,
          medusaCartId: cartId,
          medusaOrderId,
          completionState,
          completionError,
          paymentStatus,
          amountTotal: session.amount_total,
          currency: session.currency,
        });
        break;
      }
      case "checkout.session.async_payment_failed":
      case "checkout.session.expired": {
        const session = event.data.object as Stripe.Checkout.Session;
        console.warn("[stripe webhook] checkout not completed", {
          stripeEventId: event.id,
          stripeSessionId: session.id,
          medusaCartId: session.metadata?.medusa_cart_id || null,
          status: session.status,
          paymentStatus: session.payment_status,
        });
        break;
      }
      default:
        break;
    }
  } catch (error) {
    const message =
      error instanceof Error ? error.message : "Webhook handler failed.";
    return json(500, { error: message });
  }

  return json(200, { received: true });
}
