import { recordMarketingLandingView } from "@/lib/marketing-analytics";
import { normalizeMarketingLandingPath } from "@/lib/marketing-attribution";
import { getRequestClientIp } from "@/lib/request-client-ip";

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

type MarketingTrackPayload = {
  gaClientId?: unknown;
  gaSessionId?: unknown;
  sourceApp?: unknown;
  landingPath?: unknown;
  referrerHost?: unknown;
  referrerPath?: unknown;
  screenHeight?: unknown;
  screenWidth?: unknown;
  timezone?: unknown;
  utmCampaign?: unknown;
  utmContent?: unknown;
  utmMedium?: unknown;
  utmSource?: unknown;
  utmTerm?: unknown;
  visitorId?: unknown;
  viewportHeight?: unknown;
  viewportWidth?: unknown;
};

function getCountryCode(request: Request) {
  return (
    request.headers.get("cf-ipcountry") ||
    request.headers.get("x-vercel-ip-country") ||
    request.headers.get("x-country-code")
  );
}

export async function POST(request: Request) {
  let payload: MarketingTrackPayload;

  try {
    payload = (await request.json()) as MarketingTrackPayload;
  } catch {
    return Response.json({ ok: false }, { status: 400 });
  }

  if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
    return Response.json({ ok: false }, { status: 400 });
  }
  const landingPath = normalizeMarketingLandingPath(payload.landingPath);
  if (!landingPath || typeof payload.visitorId !== "string" || !/^[a-z0-9_-]{16,96}$/i.test(payload.visitorId)) {
    return Response.json({ ok: false }, { status: 400 });
  }

  const recorded = await recordMarketingLandingView({
    sourceApp: typeof payload.sourceApp === "string" ? payload.sourceApp : "",
    acceptLanguage: request.headers.get("accept-language"),
    clientIp: getRequestClientIp(request.headers),
    countryCode: getCountryCode(request),
    gaClientId: payload.gaClientId,
    gaSessionId: payload.gaSessionId,
    landingPath,
    referrerHost: String(payload.referrerHost ?? ""),
    referrerPath: String(payload.referrerPath ?? ""),
    screenHeight: Number(payload.screenHeight ?? 0),
    screenWidth: Number(payload.screenWidth ?? 0),
    timezone: String(payload.timezone ?? ""),
    utmCampaign: String(payload.utmCampaign ?? ""),
    utmContent: String(payload.utmContent ?? ""),
    utmMedium: String(payload.utmMedium ?? ""),
    utmSource: String(payload.utmSource ?? ""),
    utmTerm: String(payload.utmTerm ?? ""),
    userAgent: request.headers.get("user-agent"),
    requestedWith: request.headers.get("x-requested-with"),
    visitorId: String(payload.visitorId ?? ""),
    viewportHeight: Number(payload.viewportHeight ?? 0),
    viewportWidth: Number(payload.viewportWidth ?? 0),
  });

  return Response.json({ ok: recorded }, { status: recorded ? 200 : 503 });
}
