import { NextRequest, NextResponse, after } from "next/server";
import { randomUUID } from "crypto";
import { isIP } from "net";
import { supabaseAdmin as db } from "@/lib/supabase-admin";
import { newRefCode } from "@/lib/ref";
import { sendMetaEvent } from "@/lib/capi";

// Butuh Next.js 15.1+ (after dipakai agar pengiriman CAPI tidak menahan redirect)
export const runtime = "nodejs";
export const dynamic = "force-dynamic";

const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
const clip = (v: string | null, max = 512) => (v ? v.slice(0, max) : null);
const NO_STORE = { "Cache-Control": "no-store" };

export async function GET(req: NextRequest, { params }: { params: Promise<{ slug: string }> }) {
  const { slug } = await params;
  const q = req.nextUrl.searchParams;

  const { data: rotator } = await db
    .from("rotators")
    .select("id, org_id, prefilled_template")
    .eq("slug", slug)
    .eq("is_active", true)
    .maybeSingle();
  if (!rotator) return new NextResponse("Rotator tidak ditemukan", { status: 404, headers: NO_STORE });

  const { data: picked } = await db.rpc("pick_cs_number", { p_rotator: rotator.id });
  const cs = picked?.[0];
  if (!cs) return new NextResponse("Tidak ada nomor CS aktif", { status: 503, headers: NO_STORE });

  let ref = newRefCode();

  // Pencatatan boleh gagal, tapi customer tetap harus sampai ke WA.
  try {
    const cid = q.get("cid") ?? "";
    const clickId = UUID_RE.test(cid) ? cid : randomUUID();
    const eventId = clip(q.get("eid"), 100) ?? `lead_${clickId}`;
    const rawIp = req.headers.get("x-forwarded-for")?.split(",")[0]?.trim() ?? "";

    const row = {
      org_id: rotator.org_id,
      click_id: clickId,
      rotator_id: rotator.id,
      cs_number_id: cs.cs_number_id,
      fbclid: clip(q.get("fbclid"), 255),
      fbc: clip(q.get("fbc"), 255),
      fbp: clip(q.get("fbp"), 255),
      client_ip: isIP(rawIp) ? rawIp : null,
      user_agent: clip(req.headers.get("user-agent")),
      event_source_url: clip(q.get("src"), 1000),
      utm_source: clip(q.get("utm_source"), 255),
      utm_medium: clip(q.get("utm_medium"), 255),
      utm_campaign: clip(q.get("utm_campaign"), 255),
      utm_content: clip(q.get("utm_content"), 255),
      utm_term: clip(q.get("utm_term"), 255),
      lead_event_id: eventId,
    };

    let clickRowId: string | null = null;
    for (let i = 0; i < 4; i++) {
      const { data, error } = await db.from("clicks").insert({ ...row, ref_code: ref }).select("id").single();
      if (!error) {
        clickRowId = data.id;
        break;
      }
      if (error.code !== "23505") throw error;
      if (error.message.includes("ref_code")) {
        ref = newRefCode(); // tabrakan kode Ref, coba kode lain
        continue;
      }
      // click_id sudah tercatat (refresh atau klik ganda): pakai Ref lama, jangan buat event lagi
      const { data: existing } = await db.from("clicks").select("ref_code").eq("click_id", clickId).single();
      if (existing) ref = existing.ref_code;
      break;
    }

    if (clickRowId) {
      const { data: ev } = await db
        .from("meta_events")
        .insert({
          org_id: rotator.org_id,
          source_click_id: clickRowId,
          event_name: "Lead",
          event_id: eventId,
          event_time: new Date().toISOString(),
        })
        .select("id")
        .single();
      if (ev) after(() => sendMetaEvent(ev.id).catch((e) => console.error("CAPI Lead gagal", e)));
    }
  } catch (err) {
    console.error("rotator: gagal mencatat klik", err);
  }

  const template: string = rotator.prefilled_template;
  const text = template.includes("{ref}") ? template.replace("{ref}", ref) : `${template} Ref: ${ref}`;
  const target = `https://wa.me/${cs.wa}?text=${encodeURIComponent(text)}`;
  return NextResponse.redirect(target, { status: 302, headers: NO_STORE });
}
