import { randomUUID } from "crypto";
import { NextRequest, NextResponse } from "next/server";
import { prisma } from "@/lib/prisma";
import { getSolarCampaignRoute } from "@/lib/campaigns";
import { getClientIpFromHeaders } from "@/lib/attribution";

function chooseWeightedVariant<T extends { weight: number }>(variants: T[]): T {
  const totalWeight = variants.reduce((sum, variant) => sum + Math.max(variant.weight || 0, 0), 0);

  if (totalWeight <= 0) {
    return variants[0];
  }

  let cursor = Math.random() * totalWeight;
  for (const variant of variants) {
    cursor -= Math.max(variant.weight || 0, 0);
    if (cursor <= 0) {
      return variant;
    }
  }

  return variants[variants.length - 1];
}

export async function GET(request: NextRequest, { params }: { params: { slug: string } }) {
  const slug = String(params.slug || "").trim().toLowerCase();
  const route = getSolarCampaignRoute(slug);

  if (!route) {
    return NextResponse.redirect(new URL("/", request.url), 307);
  }

  const variant = chooseWeightedVariant(route.variants);
  const clickId = randomUUID();
  const destinationUrl = new URL(variant.destinationPath, request.nextUrl.origin);

  request.nextUrl.searchParams.forEach((value, key) => {
    destinationUrl.searchParams.append(key, value);
  });

  const source = request.nextUrl.searchParams.get("src")
    || request.nextUrl.searchParams.get("utm_source")
    || route.source;
  const campaign = request.nextUrl.searchParams.get("campaign")
    || request.nextUrl.searchParams.get("utm_campaign")
    || route.campaign;
  const creative = request.nextUrl.searchParams.get("creative")
    || request.nextUrl.searchParams.get("utm_content")
    || route.creative;
  const adType = request.nextUrl.searchParams.get("ad_type") || route.adType;

  destinationUrl.searchParams.set("src", source);
  destinationUrl.searchParams.set("campaign", campaign);
  destinationUrl.searchParams.set("creative", creative);
  destinationUrl.searchParams.set("variant", variant.key);
  destinationUrl.searchParams.set("click_id", clickId);
  destinationUrl.searchParams.set("slug", slug);
  destinationUrl.searchParams.set("exp", route.experimentName);
  destinationUrl.searchParams.set("ad_type", adType);

  if (!destinationUrl.searchParams.get("utm_source")) {
    destinationUrl.searchParams.set("utm_source", source);
  }
  if (!destinationUrl.searchParams.get("utm_medium")) {
    destinationUrl.searchParams.set("utm_medium", "paid");
  }
  if (!destinationUrl.searchParams.get("utm_campaign")) {
    destinationUrl.searchParams.set("utm_campaign", campaign);
  }
  if (!destinationUrl.searchParams.get("utm_content")) {
    destinationUrl.searchParams.set("utm_content", creative);
  }

  const referrer = request.headers.get("referer") || null;
  const userAgent = request.headers.get("user-agent")?.slice(0, 512) || null;
  const ipAddress = getClientIpFromHeaders(request.headers);

  await prisma.trafficClick.create({
    data: {
      clickId,
      slug,
      source,
      campaign,
      creative,
      adType,
      assignedVariant: variant.key,
      destinationPath: variant.destinationPath,
      destinationUrl: destinationUrl.toString(),
      referrer,
      ipAddress,
      userAgent,
      queryString: request.nextUrl.searchParams.toString() || null,
      queryParams: JSON.stringify(Object.fromEntries(request.nextUrl.searchParams.entries())),
    },
  });

  const response = NextResponse.redirect(destinationUrl, 307);
  const cookieOptions = {
    maxAge: 60 * 60 * 24 * 30,
    sameSite: "lax" as const,
    secure: request.nextUrl.protocol === "https:",
    path: "/",
  };

  response.cookies.set("solar_click_id", clickId, cookieOptions);
  response.cookies.set("solar_click_src", source, cookieOptions);
  response.cookies.set("solar_click_campaign", campaign, cookieOptions);
  response.cookies.set("solar_click_creative", creative, cookieOptions);
  response.cookies.set("solar_click_variant", variant.key, cookieOptions);
  response.cookies.set("solar_click_slug", slug, cookieOptions);
  response.cookies.set("solar_click_exp", route.experimentName, cookieOptions);
  response.cookies.set("solar_click_ad_type", adType, cookieOptions);

  return response;
}
