import { NextResponse } from "next/server";
import { createAdminClient } from "@/lib/supabase-admin";
import { mapPaymentLinkRecord, normalizeText, type PaymentLinkRecord } from "@/lib/payment-links";
import { applyApprovedPaymentLinkPayment } from "@/lib/payment-link-processing";

export async function GET(request: Request) {
  try {
    const { searchParams } = new URL(request.url);
    const code = normalizeText(searchParams.get("code")).toUpperCase();
    const paymentId = normalizeText(searchParams.get("paymentId"));
    if (!code || !paymentId) {
      return NextResponse.json({ error: "Recebimento invalido." }, { status: 400 });
    }

    const admin = createAdminClient();
    const [{ data: rawLink, error: linkError }, { data: payment, error: paymentError }] = await Promise.all([
      admin.from("payment_links").select("*").eq("code", code).maybeSingle(),
      admin
        .from("payment_link_payments")
        .select(
          "id,payment_link_id,status,provider_status,provider_status_detail,payment_method,provider_payment_id,qr_code,qr_code_base64,ticket_url,approved_at,updated_at"
        )
        .eq("id", paymentId)
        .maybeSingle(),
    ]);

    if (linkError || !rawLink) {
      return NextResponse.json({ error: "Link nao encontrado." }, { status: 404 });
    }
    if (paymentError || !payment?.id) {
      return NextResponse.json({ error: "Recebimento nao encontrado." }, { status: 404 });
    }

    const link = mapPaymentLinkRecord(rawLink as PaymentLinkRecord);
    if (payment.payment_link_id !== link.id) {
      return NextResponse.json({ error: "Recebimento invalido para este link." }, { status: 400 });
    }

    if (payment.status === "approved") {
      await applyApprovedPaymentLinkPayment(admin as never, String(payment.id));
    }

    return NextResponse.json({
      ok: true,
      payment: {
        id: payment.id,
        status: payment.status,
        provider_status: payment.provider_status,
        provider_status_detail: payment.provider_status_detail,
        payment_method: payment.payment_method,
        provider_payment_id: payment.provider_payment_id,
        qr_code: payment.qr_code,
        qr_code_base64: payment.qr_code_base64,
        ticket_url: payment.ticket_url,
        approved_at: payment.approved_at,
        updated_at: payment.updated_at,
      },
    });
  } catch (error) {
    const message = error instanceof Error ? error.message : "Nao foi possivel consultar o pagamento.";
    return NextResponse.json({ error: message }, { status: 500 });
  }
}
