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

function json(body: unknown, status = 200) {
  return new Response(JSON.stringify(body), { status, headers: { "Content-Type": "application/json" } });
}

function normalizePhone(raw: string) {
  const digits = raw.replace(/\D/g, "");
  if (/^254\d{9}$/.test(digits)) return digits;
  if (/^0\d{9}$/.test(digits)) return `254${digits.slice(1)}`;
  if (/^\d{9}$/.test(digits)) return `254${digits}`;
  return null;
}

export const Route = createFileRoute("/api/printpay/stk")({
  server: {
    handlers: {
      POST: async ({ request }) => {
        try {
          const auth = request.headers.get("authorization") ?? "";
          const token = auth.startsWith("Bearer ") ? auth.slice(7) : "";
          if (!token) return json({ error: "Unauthorized" }, 401);

          const body = (await request.json().catch(() => ({}))) as { amount?: number; phone?: string };
          const amount = Math.round(Number(body.amount));
          if (!amount || amount < 1 || amount > 500000) {
            return json({ error: "Enter an amount between KSh 1 and KSh 500,000" }, 400);
          }
          const phone = normalizePhone(String(body.phone ?? ""));
          if (!phone) return json({ error: "Enter a valid Safaricom number (e.g. 0712345678)" }, 400);

          const apiKey = process.env["PRINTPAY_API_KEY"];
          if (!apiKey) return json({ error: "Payment provider not configured" }, 500);

          const { supabaseAdmin } = await import("@/integrations/supabase/client.server");
          const { data: userRes, error: userErr } = await supabaseAdmin.auth.getUser(token);
          if (userErr || !userRes.user) return json({ error: "Unauthorized" }, 401);
          const user = userRes.user;

          const { data: deposit, error: depErr } = await supabaseAdmin
            .from("deposits")
            .insert({
              user_id: user.id,
              amount,
              mpesa_reference: `PENDING-${Date.now()}`,
              provider: "printpay",
              status: "pending",
              note: `M-PESA STK push to ${phone}`,
            })
            .select("id")
            .single();
          if (depErr || !deposit) return json({ error: depErr?.message ?? "Could not create deposit" }, 500);

          const res = await fetch("https://printpay.site/api/stk_push", {
            method: "POST",
            headers: { "Content-Type": "application/x-www-form-urlencoded" },
            body: new URLSearchParams({ x_api_key: apiKey, phone_number: phone, amount: String(amount) }),
          });
          const raw = await res.text();
          let payload: { status?: string; checkout_id?: string; message?: string; error?: string } = {};
          try {
            payload = JSON.parse(raw);
          } catch {
            payload = {};
          }

          if (!res.ok || payload.status !== "success" || !payload.checkout_id) {
            await supabaseAdmin.from("deposits").delete().eq("id", deposit.id);
            return json({ error: payload.message || payload.error || "Could not start the M-PESA prompt. Please try again." }, 502);
          }

          await supabaseAdmin.from("deposits").update({ paystack_reference: payload.checkout_id }).eq("id", deposit.id);

          return json({ deposit_id: deposit.id, checkout_id: payload.checkout_id });
        } catch (e) {
          return json({ error: e instanceof Error ? e.message : "Unexpected error" }, 500);
        }
      },
    },
  },
});
