import { createFileRoute } from "@tanstack/react-router";

// M-Pesa Daraja STK Push callback endpoint.
// Public URL — no auth, but the CheckoutRequestID acts as the correlation key.
export const Route = createFileRoute("/api/public/mpesa/callback")({
  server: {
    handlers: {
      POST: async ({ request }) => {
        const raw = await request.text();
        let body: any = {};
        try {
          body = JSON.parse(raw);
        } catch {
          return new Response("Invalid JSON", { status: 400 });
        }

        const cb = body?.Body?.stkCallback;
        if (!cb) return new Response(JSON.stringify({ ok: true }), { status: 200 });

        const checkoutId: string | undefined = cb.CheckoutRequestID;
        const resultCode: number = cb.ResultCode ?? -1;
        const resultDesc: string = cb.ResultDesc ?? "";

        if (!checkoutId) return new Response(JSON.stringify({ ok: true }), { status: 200 });

        const { supabaseAdmin } = await import("@/integrations/supabase/client.server");

        const { data: payment } = await supabaseAdmin
          .from("payments")
          .select("id, subscription_id")
          .eq("checkout_request_id", checkoutId)
          .maybeSingle();

        if (!payment) {
          return new Response(JSON.stringify({ ok: true }), { status: 200 });
        }

        if (resultCode === 0) {
          // Extract receipt from CallbackMetadata
          let receipt: string | null = null;
          const items = cb.CallbackMetadata?.Item ?? [];
          for (const it of items) {
            if (it?.Name === "MpesaReceiptNumber") receipt = String(it.Value);
          }

          await supabaseAdmin
            .from("payments")
            .update({
              status: "success",
              mpesa_receipt: receipt,
              raw_callback: body,
            })
            .eq("id", payment.id);

          const { activateSubscriptionForPayment } = await import("@/lib/subscription.server");
          await activateSubscriptionForPayment(supabaseAdmin, payment.id);
        } else {
          const status: "cancelled" | "failed" = resultCode === 1032 ? "cancelled" : "failed";
          await supabaseAdmin
            .from("payments")
            .update({
              status,
              raw_callback: body,
            })
            .eq("id", payment.id);
        }

        return new Response(JSON.stringify({ ok: true }), {
          status: 200,
          headers: { "content-type": "application/json" },
        });
      },
    },
  },
});
