import { NextRequest, NextResponse } from "next/server";
import { createAdminClient } from "@/lib/supabase/admin";
import { clientIp, isBot, recordImpression, sessionIdFromCookies } from "@/lib/ad-tracking";

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

interface Payload {
  campaign_id?: string;
  slug?: string;
  page_url?: string;
  page_path?: string;
  viewport?: boolean;
}

let slugCache: Map<string, string> = new Map();
let slugCacheLoadedAt = 0;
const SLUG_CACHE_TTL_MS = 5 * 60 * 1000;

async function resolveCampaignId(body: Payload): Promise<string | null> {
  if (body.campaign_id && /^[0-9a-f-]{36}$/i.test(body.campaign_id)) return body.campaign_id;
  if (!body.slug) return null;

  const now = Date.now();
  if (now - slugCacheLoadedAt > SLUG_CACHE_TTL_MS) {
    try {
      const admin = createAdminClient();
      const { data } = await admin.from("banner_creatives").select("id, slug, status");
      const m = new Map<string, string>();
      for (const r of (data || []) as any[]) {
        if (r.status === "active") m.set(r.slug, r.id);
      }
      slugCache = m;
      slugCacheLoadedAt = now;
    } catch {
      // keep stale cache on failure
    }
  }
  return slugCache.get(body.slug) || null;
}

export async function POST(req: NextRequest) {
  let body: Payload;
  try {
    body = (await req.json()) as Payload;
  } catch {
    return new NextResponse(null, { status: 204 });
  }

  const campaignId = await resolveCampaignId(body);
  if (!campaignId) return new NextResponse(null, { status: 204 });

  const ua = req.headers.get("user-agent");
  const referrer = req.headers.get("referer");
  const ip = clientIp(req.headers);
  const sid = sessionIdFromCookies(req.headers.get("cookie"));

  recordImpression({
    campaignId,
    pageUrl: body.page_url ?? referrer,
    pagePath: body.page_path ?? null,
    referrer,
    userAgent: ua,
    ipAddress: ip,
    isBot: isBot(ua),
    viewport: !!body.viewport,
    sessionId: sid,
  }).catch((err) => console.error("[impression] insert failed:", err?.message));

  return new NextResponse(null, { status: 204 });
}
