import { limpar, userDataDaIdentidade } from "./identidade";
import { NOME_META } from "./tipos";
import type { Conversao, ContextoNavegador, StatusEnvio } from "./tipos";

const VERSAO_API = "v21.0";

const PIXEL_ID = process.env.NEXT_PUBLIC_META_PIXEL_ID;

export function metaConfigurado() {
  return Boolean(PIXEL_ID && process.env.META_CAPI_TOKEN);
}

function valorDoLead(conversao: Conversao) {
  if (typeof conversao.valor === "number") return conversao.valor;
  if (conversao.evento !== "generate_lead") return undefined;
  const bruto = Number(process.env.META_LEAD_VALOR);
  return Number.isFinite(bruto) && bruto > 0 ? bruto : undefined;
}

export async function enviarParaMeta(
  conversao: Conversao,
  contexto: ContextoNavegador,
): Promise<StatusEnvio> {
  const token = process.env.META_CAPI_TOKEN;
  if (!PIXEL_ID || !token) return "desligado";

  const valor = valorDoLead(conversao);

  const evento = limpar({
    event_name: NOME_META[conversao.evento],
    event_time: Math.floor(Date.now() / 1000),
    event_id: conversao.eventoId,
    event_source_url: conversao.url ?? undefined,
    action_source: "website",
    user_data: limpar({
      ...userDataDaIdentidade(conversao.identidade),
      client_ip_address: contexto.ip,
      client_user_agent: contexto.userAgent,
      fbp: contexto.fbp,
      fbc: contexto.fbc,
    }),
    custom_data: limpar({
      content_name: conversao.parametros?.pagina,
      value: valor,
      currency: valor ? (conversao.moeda ?? "BRL") : undefined,
    }),
  });

  try {
    const resposta = await fetch(
      `https://graph.facebook.com/${VERSAO_API}/${PIXEL_ID}/events`,
      {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify(
          limpar({
            data: [evento],
            access_token: token,
            test_event_code: process.env.META_TEST_EVENT_CODE || undefined,
          }),
        ),
      },
    );

    if (!resposta.ok) {
      console.error("[capi] meta recusou:", resposta.status, await resposta.text());
      return "erro";
    }

    return "enviado";
  } catch (erro) {
    console.error("[capi] erro ao falar com a meta:", erro);
    return "erro";
  }
}
