"use client";

import { analyticsPrivacyAllowed, analyticsSafePath, validGoogleAdsId } from "./analytics-client";

type LeadKind =
  | "free_guide"
  | "gated_email_delivery"
  | "gated_email_delivery_verified"
  | "gated_email_delivery_downloaded"
  | "gated_email_delivery_featured"
  | "guide_request"
  | "route_pack_request"
  | "stay_enquiry"
  | "accommodation_enquiry"
  | "contact"
  | "business_signup"
  | "listing_signup"
  | "trip_finder";

type LeadParams = {
  value?: number;
  currency?: string;
  itemName?: string;
  method?: string;
  leadCode?: string;
};

declare global {
  interface Window {
    dataLayer?: unknown[];
    gtag?: (...args: unknown[]) => void;
    fbq?: (...args: unknown[]) => void;
  }
}

const googleAdsCandidate = process.env.NEXT_PUBLIC_GOOGLE_ADS_ID || process.env.NEXT_PUBLIC_GOOGLE_ADS_CONVERSION_ID || "";
const googleAdsId = validGoogleAdsId(googleAdsCandidate) ? googleAdsCandidate.trim() : "";

const conversionLabels: Record<LeadKind, string> = {
  free_guide: process.env.NEXT_PUBLIC_GOOGLE_ADS_FREE_GUIDE_CONVERSION_LABEL || "",
  gated_email_delivery: process.env.NEXT_PUBLIC_GOOGLE_ADS_FREE_GUIDE_CONVERSION_LABEL || process.env.NEXT_PUBLIC_GOOGLE_ADS_LEAD_CONVERSION_LABEL || "",
  gated_email_delivery_verified: process.env.NEXT_PUBLIC_GOOGLE_ADS_FREE_GUIDE_CONVERSION_LABEL || process.env.NEXT_PUBLIC_GOOGLE_ADS_LEAD_CONVERSION_LABEL || "",
  gated_email_delivery_downloaded: process.env.NEXT_PUBLIC_GOOGLE_ADS_FREE_GUIDE_CONVERSION_LABEL || process.env.NEXT_PUBLIC_GOOGLE_ADS_LEAD_CONVERSION_LABEL || "",
  gated_email_delivery_featured: process.env.NEXT_PUBLIC_GOOGLE_ADS_FREE_GUIDE_CONVERSION_LABEL || process.env.NEXT_PUBLIC_GOOGLE_ADS_LEAD_CONVERSION_LABEL || "",
  guide_request: process.env.NEXT_PUBLIC_GOOGLE_ADS_GUIDE_CONVERSION_LABEL || process.env.NEXT_PUBLIC_GOOGLE_ADS_LEAD_CONVERSION_LABEL || "",
  route_pack_request: process.env.NEXT_PUBLIC_GOOGLE_ADS_ROUTE_PACK_CONVERSION_LABEL || process.env.NEXT_PUBLIC_GOOGLE_ADS_GUIDE_CONVERSION_LABEL || process.env.NEXT_PUBLIC_GOOGLE_ADS_LEAD_CONVERSION_LABEL || "",
  stay_enquiry: process.env.NEXT_PUBLIC_GOOGLE_ADS_STAY_CONVERSION_LABEL || process.env.NEXT_PUBLIC_GOOGLE_ADS_LEAD_CONVERSION_LABEL || "",
  accommodation_enquiry: process.env.NEXT_PUBLIC_GOOGLE_ADS_ACCOMMODATION_CONVERSION_LABEL || process.env.NEXT_PUBLIC_GOOGLE_ADS_STAY_CONVERSION_LABEL || process.env.NEXT_PUBLIC_GOOGLE_ADS_LEAD_CONVERSION_LABEL || "",
  contact: process.env.NEXT_PUBLIC_GOOGLE_ADS_CONTACT_CONVERSION_LABEL || process.env.NEXT_PUBLIC_GOOGLE_ADS_LEAD_CONVERSION_LABEL || "",
  business_signup: process.env.NEXT_PUBLIC_GOOGLE_ADS_BUSINESS_CONVERSION_LABEL || process.env.NEXT_PUBLIC_GOOGLE_ADS_LEAD_CONVERSION_LABEL || "",
  listing_signup: process.env.NEXT_PUBLIC_GOOGLE_ADS_OWNER_CONVERSION_LABEL || process.env.NEXT_PUBLIC_GOOGLE_ADS_ACCOMMODATION_CONVERSION_LABEL || process.env.NEXT_PUBLIC_GOOGLE_ADS_LEAD_CONVERSION_LABEL || "",
  trip_finder: process.env.NEXT_PUBLIC_GOOGLE_ADS_TRIP_FINDER_CONVERSION_LABEL || process.env.NEXT_PUBLIC_GOOGLE_ADS_LEAD_CONVERSION_LABEL || "",
};

function postMpcFirstPartyEvent(eventType: string, label: string, params: LeadParams = {}) {
  if (typeof window === "undefined" || !analyticsPrivacyAllowed()) return;
  try {
    const tracker = (window as any).mpcTrack;
    if (typeof tracker === "function") {
      tracker({
        eventType,
        label,
        target: params.method || "website_form",
        source: "client-lead",
        metadata: { value: params.value || 0, currency: params.currency || "ZAR", leadCode: params.leadCode || "" },
      });
      return;
    }
    fetch("/api/mpc/analytics-event", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      keepalive: true,
      body: JSON.stringify({
        eventType,
        page: window.location.pathname || "/",
        path: analyticsSafePath(),
        label,
        target: params.method || "website_form",
        source: "client-lead",
        metadata: { value: params.value || 0, currency: params.currency || "ZAR", leadCode: params.leadCode || "" },
      }),
    }).catch(() => {});
  } catch {}
}

export function trackMpcEvent(payload: {
  eventType: string;
  label?: string;
  target?: string;
  source?: string | null;
  productId?: string | null;
  supplierId?: string | null;
  accommodationId?: string | null;
  metadata?: Record<string, unknown> | null;
}) {
  if (typeof window === "undefined" || !analyticsPrivacyAllowed()) return;
  try {
    const tracker = (window as any).mpcTrack;
    if (typeof tracker === "function") {
      tracker(payload);
      return;
    }
    fetch("/api/mpc/analytics-event", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      keepalive: true,
      body: JSON.stringify({
        ...payload,
        page: window.location.pathname || "/",
        path: analyticsSafePath(),
      }),
    }).catch(() => {});
  } catch {}
}

export function trackMpcLead(kind: LeadKind, params: LeadParams = {}) {
  if (typeof window === "undefined" || !analyticsPrivacyAllowed()) return;

  const payload = {
    event: "mpc_lead",
    lead_type: kind,
    item_name: params.itemName || kind,
    method: params.method || "website_form",
    value: typeof params.value === "number" ? params.value : undefined,
    currency: params.currency || "ZAR",
  };

  window.dataLayer = window.dataLayer || [];
  window.dataLayer.push(payload);

  if (typeof window.gtag === "function") {
    window.gtag("event", "generate_lead", {
      lead_type: kind,
      item_name: payload.item_name,
      method: payload.method,
      value: payload.value,
      currency: payload.currency,
    });

    const label = conversionLabels[kind];
    if (googleAdsId && label) {
      window.gtag("event", "conversion", {
        send_to: `${googleAdsId}/${label}`,
        value: payload.value,
        currency: payload.currency,
      });
    }
  }

  if (typeof window.fbq === "function") {
    window.fbq("track", "Lead", {
      content_name: payload.item_name,
      content_category: kind,
      value: payload.value,
      currency: payload.currency,
    });
  }

  postMpcFirstPartyEvent("form_submit", payload.item_name, params);
}
