"use client";

export type MarketingFunnelClientEventType =
  | "signup_form_viewed"
  | "signup_recovery_sent"
  | "signup_recovery_verified"
  | "signup_submitted"
  | "signup_failed"
  | "dns_setup_viewed"
  | "dns_wizard_step_viewed"
  | "dns_record_confirmed"
  | "dns_verification_attempted"
  | "dns_verification_failed";

const SESSION_DEDUPED_EVENTS = new Set<MarketingFunnelClientEventType>([
  "signup_form_viewed",
  "dns_setup_viewed",
  "dns_wizard_step_viewed",
]);

function normalizeEventDetail(value: string | null | undefined) {
  const detail = value?.trim().toLowerCase().slice(0, 96) ?? "";
  return /^[a-z0-9][a-z0-9:_-]{0,95}$/.test(detail) ? detail : null;
}

function readSessionFlag(key: string) {
  try {
    return window.sessionStorage.getItem(key) === "1";
  } catch {
    return false;
  }
}

function writeSessionFlag(key: string, active: boolean) {
  try {
    if (active) window.sessionStorage.setItem(key, "1");
    else window.sessionStorage.removeItem(key);
  } catch {
    // Analytics must never interrupt the product flow when storage is blocked.
  }
}

export async function trackMarketingFunnelEvent(
  eventType: MarketingFunnelClientEventType,
  eventDetail?: string | null,
) {
  if (typeof window === "undefined") return false;

  const normalizedDetail = normalizeEventDetail(eventDetail);
  const dedupeKey = `officialmail:funnel:${eventType}:${normalizedDetail ?? "none"}`;

  if (
    SESSION_DEDUPED_EVENTS.has(eventType) &&
    readSessionFlag(dedupeKey)
  ) {
    return true;
  }

  if (SESSION_DEDUPED_EVENTS.has(eventType)) {
    writeSessionFlag(dedupeKey, true);
  }

  try {
    const response = await fetch("/api/marketing/funnel-event", {
      body: JSON.stringify({
        eventDetail: normalizedDetail,
        eventType,
      }),
      credentials: "include",
      headers: { "Content-Type": "application/json" },
      keepalive: true,
      method: "POST",
    });

    if (!response.ok && SESSION_DEDUPED_EVENTS.has(eventType)) {
      writeSessionFlag(dedupeKey, false);
    }

    return response.ok;
  } catch {
    if (SESSION_DEDUPED_EVENTS.has(eventType)) {
      writeSessionFlag(dedupeKey, false);
    }
    return false;
  }
}
