import { NextRequest, NextResponse } from 'next/server';
import { incrementVariantOpen } from '@/lib/db/campaign-repo';
import { readOpenPixelContext } from '@/modules/stats/lib/mpp-detect';

export const runtime = 'nodejs';
export const dynamic = 'force-dynamic';

/**
 * Tracking-Pixel für Open-Events.
 *
 * URL-Form: `/api/track/open?c=CAMPAIGN_ID&v=VARIANT_ID&r=RECIPIENT_ID`
 *
 * Response: 1×1-transparent-PNG mit `Cache-Control: no-store`. Wichtig damit Email-Clients
 * (Gmail-Image-Proxy etc.) das Bild nicht aus dem CDN-Cache servieren statt unserer URL — sonst
 * würden Opens nicht zu uns durchschlagen.
 *
 * Fehlerverhalten: bei missing/invalid params trotzdem PNG zurückgeben (keine 4xx Errors), damit
 * im Mailclient kein „kaputtes Bild"-Icon erscheint. Tracking-Failure ist silent.
 */
const TRANSPARENT_PNG = Buffer.from(
  'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=',
  'base64',
);

function pngResponse(): NextResponse {
  return new NextResponse(new Uint8Array(TRANSPARENT_PNG) as unknown as BodyInit, {
    status: 200,
    headers: {
      'Content-Type': 'image/png',
      'Content-Length': TRANSPARENT_PNG.byteLength.toString(),
      // Aggressive No-Cache damit Image-Proxies (Gmail) jedes Open zu uns weiterleiten
      'Cache-Control': 'no-store, no-cache, must-revalidate, max-age=0, private',
      Pragma: 'no-cache',
      Expires: '0',
    },
  });
}

export async function GET(req: NextRequest) {
  try {
    const { searchParams } = req.nextUrl;
    const campaignId = searchParams.get('c');
    const variantId = searchParams.get('v');
    const recipientId = searchParams.get('r') ?? undefined;
    if (campaignId && variantId) {
      const pixelCtx = readOpenPixelContext(req.headers);
      incrementVariantOpen(variantId, campaignId, recipientId, pixelCtx);
    }
  } catch (e) {
    // Niemals an den Mailclient errorrn — silent log + Pixel zurück
    console.error('[/api/track/open] error:', e instanceof Error ? e.message : e);
  }
  return pngResponse();
}
