import { NextRequest, NextResponse } from "next/server";

import { PrismaCampaignLogsRepository } from "@/modules/campaigns/repositories/prisma-campaign-logs-repository";
import { PrismaEmailEventsRepository } from "@/modules/ses-webhooks/repositories/prisma-email-events-repository";
import { RecordEmailOpenUseCase } from "@/modules/ses-webhooks/use-cases/record-email-open-use-case";

interface RouteParams {
  params: Promise<{ token: string }>;
}

// GIF transparente 1x1 (43 bytes) — o corpo de resposta é sempre este, nunca varia.
const TRANSPARENT_GIF = Buffer.from(
  "R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBTAA7",
  "base64"
);

const PIXEL_RESPONSE_HEADERS = {
  "Content-Type": "image/gif",
  "Cache-Control": "no-store, no-cache, must-revalidate",
};

/**
 * Rota pública (sem sessão) do pixel de rastreamento de abertura — ver o comentário em
 * `build-email-content.ts` para o racional completo (só usado em envios SMTP; envios SES já
 * têm tracking nativo da AWS).
 *
 * Contrato: SEMPRE responde 200 com um GIF transparente estático, nunca 404/redirect/erro,
 * independente do token ser válido, inexistente ou malformado. Isso evita: (1) vazar quais
 * `CampaignLog` existem através de uma resposta diferencial (200 vs 404); (2) quebrar a
 * renderização do e-mail no cliente; (3) gerar erro visível para os proxies/scanners de
 * imagem (Apple Mail Privacy Protection, Gmail) que batem nesse endpoint constantemente.
 */
export async function GET(request: NextRequest, { params }: RouteParams) {
  const { token } = await params;
  const logId = token.replace(/\.(gif|png)$/i, "");

  try {
    const userAgent = request.headers.get("user-agent");
    const ip = request.headers.get("x-forwarded-for") ?? request.headers.get("x-real-ip");

    const useCase = new RecordEmailOpenUseCase(
      new PrismaCampaignLogsRepository(),
      new PrismaEmailEventsRepository()
    );
    await useCase.execute({ logId, userAgent, ip });
  } catch (error) {
    console.error("Falha ao registrar abertura de e-mail via pixel:", error);
  }

  return new NextResponse(TRANSPARENT_GIF, { status: 200, headers: PIXEL_RESPONSE_HEADERS });
}
