import { NextResponse } from "next/server";

import { segredoDoWebhookDoMercadoPagoDaKtalogu } from "@/lib/fiscal/ambiente";
import { avisoDoMercadoPagoValido } from "@/lib/fiscal/mercado-pago-ktalogu";
import { aplicarAvisoDePagamento } from "@/lib/fiscal/servidor/compras";
import { createAdminClient } from "@/lib/supabase-server";

export const runtime = "nodejs";

/**
 * Aviso do Mercado Pago da Ktalogu (pacotes de notas). O aviso só diz "o
 * pagamento X mudou": o valor e o status vêm da consulta ao Mercado Pago, nunca
 * do corpo. Com a chave secreta configurada, a assinatura é conferida antes.
 */
export async function POST(req: Request) {
  const url = new URL(req.url);
  const corpoCru = await req.text();
  let corpo: Record<string, unknown> = {};
  try {
    corpo = corpoCru ? (JSON.parse(corpoCru) as Record<string, unknown>) : {};
  } catch {
    corpo = {};
  }

  const dados = corpo.data && typeof corpo.data === "object" ? (corpo.data as Record<string, unknown>) : {};
  const tipo = String(url.searchParams.get("type") || corpo.type || url.searchParams.get("topic") || "");
  const idDoDado = String(url.searchParams.get("data.id") || dados.id || url.searchParams.get("id") || "");

  const segredo = segredoDoWebhookDoMercadoPagoDaKtalogu();
  if (segredo) {
    const valido = avisoDoMercadoPagoValido({
      segredo,
      assinatura: req.headers.get("x-signature"),
      idDaRequisicao: req.headers.get("x-request-id"),
      idDoDado: url.searchParams.get("data.id") || (dados.id ? String(dados.id) : null),
    });
    if (!valido) return NextResponse.json({ error: "Assinatura inválida." }, { status: 401 });
  }

  if (tipo !== "payment" || !/^\d+$/.test(idDoDado)) return NextResponse.json({ ok: true, ignorado: true });

  const admin = createAdminClient();
  const avisoId = `mp:${String(corpo.id || req.headers.get("x-request-id") || `${idDoDado}:${Date.now()}`)}`;
  await admin
    .from("fiscal_webhooks")
    .upsert({ id: avisoId, origem: "mercado_pago", evento: String(corpo.action || tipo), payload: corpo }, { onConflict: "id", ignoreDuplicates: true });

  try {
    const resultado = await aplicarAvisoDePagamento(admin, idDoDado);
    await admin.from("fiscal_webhooks").update({ processado_em: new Date().toISOString(), erro: null }).eq("id", avisoId);
    return NextResponse.json({ ok: true, resultado: resultado.resultado });
  } catch (erro) {
    const mensagem = erro instanceof Error ? erro.message : "falha";
    await admin.from("fiscal_webhooks").update({ erro: mensagem }).eq("id", avisoId);
    console.error("[fiscal] aviso do Mercado Pago não processado", idDoDado, mensagem);
    return NextResponse.json({ error: "Falha ao processar." }, { status: 500 });
  }
}
