"use client";

const CAMPAIGN_KEYS = ["utm_source", "utm_medium", "utm_campaign", "utm_content", "utm_term"] as const;

function clean(value: string | null | undefined, max = 180) {
  return String(value || "").replace(/[\u0000-\u001F\u007F]/g, " ").replace(/\s+/g, " ").trim().slice(0, max);
}

export function analyticsPrivacyAllowed() {
  if (typeof window === "undefined" || typeof navigator === "undefined") return false;
  try {
    const nav = navigator as Navigator & { globalPrivacyControl?: boolean; msDoNotTrack?: string };
    const dnt = nav.doNotTrack || nav.msDoNotTrack || (window as Window & { doNotTrack?: string }).doNotTrack;
    if (nav.globalPrivacyControl === true || dnt === "1" || dnt === "yes") return false;
    if (window.localStorage.getItem("mpcAnalyticsOptOut") === "1") return false;
  } catch {
    // Storage may be unavailable in privacy-restricted contexts. DNT/GPC checks above still apply.
  }
  return true;
}

export function analyticsCampaignParams(search = typeof window !== "undefined" ? window.location.search : "") {
  const source = new URLSearchParams(search || "");
  const output: Record<string, string | null> = {};
  for (const key of CAMPAIGN_KEYS) output[key] = clean(source.get(key), 160) || null;
  return {
    utmSource: output.utm_source,
    utmMedium: output.utm_medium,
    utmCampaign: output.utm_campaign,
    utmContent: output.utm_content,
    utmTerm: output.utm_term,
  };
}

export function analyticsSafePath(pathname?: string | null, search?: string | null) {
  const rawPath = clean(pathname || (typeof window !== "undefined" ? window.location.pathname : "/"), 320);
  const path = rawPath.startsWith("/") && !rawPath.startsWith("//") ? rawPath.split(/[?#]/, 1)[0] || "/" : "/";
  const input = new URLSearchParams(search ?? (typeof window !== "undefined" ? window.location.search : ""));
  const safe = new URLSearchParams();
  for (const key of CAMPAIGN_KEYS) {
    const value = clean(input.get(key), 160);
    if (value) safe.set(key, value);
  }
  const query = safe.toString();
  return query ? `${path}?${query}` : path;
}

export function analyticsSafeReferrer(value?: string | null) {
  const raw = value ?? (typeof document !== "undefined" ? document.referrer : "");
  if (!raw) return null;
  try {
    const parsed = new URL(raw);
    if (parsed.protocol !== "https:" && parsed.protocol !== "http:") return null;
    return `${parsed.origin}${parsed.pathname}`.slice(0, 420);
  } catch {
    return null;
  }
}

export function validGa4Id(value: string) {
  return /^G-[A-Z0-9]{4,20}$/i.test(value.trim());
}

export function validGoogleAdsId(value: string) {
  return /^AW-\d{5,20}$/i.test(value.trim());
}

export function validMetaPixelId(value: string) {
  return /^\d{5,30}$/.test(value.trim());
}
