import { cookies } from "next/headers";
import { NextResponse } from "next/server";

import { reconcileCatalogPaymentWithProvider } from "@/lib/catalog-payment-reconcile";
import { nomeDoCookieDaCompra } from "@/lib/digitais/compra";
import { acessosDoPedido, conferirChave, pedidoInternoDaCompra } from "@/lib/digitais/servidor/acessos";
import { createAdminClient } from "@/lib/supabase-admin";

/*
 * Como está a compra digital: o pagamento (conferido no provedor, como na
 * finalização da loja) e, quando aprovado, o que o comprador já recebeu.
 * A tela pergunta a cada poucos segundos enquanto espera o Pix.
 */
export async function GET(request: Request) {
  const semCache = { headers: { "cache-control": "no-store" } };
  try {
    const url = new URL(request.url);
    const pedidoId = url.searchParams.get("pedido") ?? "";
    if (!/^[0-9a-f-]{36}$/i.test(pedidoId)) return NextResponse.json({ error: "Compra inválida." }, { status: 400, ...semCache });

    const chave = (await cookies()).get(nomeDoCookieDaCompra(pedidoId))?.value ?? "";
    const admin = createAdminClient();
    const conferida = await conferirChave(admin, chave, "compra");
    if (!conferida || conferida.catalogOrderId !== pedidoId) {
      return NextResponse.json({ error: "Esta compra não foi feita neste navegador." }, { status: 401, ...semCache });
    }

    const { data: pedido } = await admin
      .from("catalog_orders")
      .select("id,number,status,payment_status,approved_order_id,total")
      .eq("id", pedidoId)
      .eq("user_id", conferida.lojaId)
      .maybeSingle();
    const linha = pedido as { id: string; number: number | null; status: string; payment_status: string | null; approved_order_id: string | null; total: number | null } | null;
    if (!linha) return NextResponse.json({ error: "Compra não encontrada." }, { status: 404, ...semCache });

    /* O último pagamento tentado: conferido no provedor (no máximo a cada 8 s). */
    const { data: pagamentos } = await admin
      .from("catalog_order_payments")
      .select("id,user_id,catalog_order_id,amount,integration_id,provider_payment_id,status,updated_at,qr_code,qr_code_base64,ticket_url,expires_at,payment_method")
      .eq("catalog_order_id", pedidoId)
      .order("created_at", { ascending: false })
      .limit(1);
    let pagamento = ((pagamentos ?? []) as Array<Record<string, unknown>>)[0] ?? null;
    if (pagamento && linha.payment_status !== "approved") {
      const conciliado = await reconcileCatalogPaymentWithProvider(admin as never, pagamento as never).catch(() => null);
      if (conciliado?.atualizado) {
        const { data: relido } = await admin
          .from("catalog_order_payments")
          .select("id,status,qr_code,qr_code_base64,ticket_url,expires_at,payment_method")
          .eq("id", String(pagamento.id))
          .maybeSingle();
        pagamento = (relido as Record<string, unknown> | null) ?? pagamento;
      }
    }

    const pedidoInterno = linha.approved_order_id ?? (await pedidoInternoDaCompra(admin, pedidoId));
    const pago = linha.payment_status === "approved" || pagamento?.status === "approved" || Number(linha.total ?? 0) <= 0;
    const acessos = pedidoInterno ? await acessosDoPedido(admin, pedidoInterno) : [];

    return NextResponse.json(
      {
        pedidoId,
        numero: linha.number,
        cancelado: linha.status === "canceled",
        pago,
        pagamento: pagamento
          ? {
              status: pagamento.status,
              metodo: pagamento.payment_method,
              qrCode: pagamento.qr_code,
              qrCodeBase64: pagamento.qr_code_base64,
              ticketUrl: pagamento.ticket_url,
              expiraEm: pagamento.expires_at,
            }
          : null,
        /* Pago, mas o acesso ainda nascendo (o banco libera no fim da gravação). */
        entregando: pago && acessos.length === 0,
        acessos,
      },
      semCache
    );
  } catch (erro) {
    console.error("[digitais] situacao", erro);
    return NextResponse.json({ error: "Não foi possível conferir agora." }, { status: 500, ...semCache });
  }
}
