import { getSupabaseClient } from "@/lib/supabase";
import { visitaQueNaoConta } from "@/lib/no-editor-da-loja";

export type CatalogEventName =
  | "page_view"
  | "product_view"
  | "product_click"
  | "search"
  | "add_to_cart"
  | "checkout_started"
  | "order_created"
  | "view_more_click"
  | "category_click";

type CatalogTrackEventInput = {
  slug: string;
  eventName: CatalogEventName | string;
  sessionId?: string;
  productId?: string | null;
  categoryId?: string | null;
  sectionId?: string | null;
  searchTerm?: string;
  sourcePath?: string;
  meta?: Record<string, unknown>;
};

const EVENT_THROTTLE_MS = 350;
const lastEventByKey = new Map<string, number>();

function toTrimmed(value: unknown) {
  return String(value || "").trim();
}

export function getCatalogSessionId(slug: string) {
  if (typeof window === "undefined") return "server";
  const safeSlug = encodeURIComponent(toTrimmed(slug) || "global");
  const storageKey = `ktalogu_catalog_session:${safeSlug}`;
  const existing = window.localStorage.getItem(storageKey);
  if (existing && existing.trim()) return existing;
  const generated = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
  window.localStorage.setItem(storageKey, generated);
  return generated;
}

export async function trackCatalogEvent(input: CatalogTrackEventInput): Promise<boolean> {
  if (typeof window === "undefined") return false;
  /* O lojista montando a página no editor (ou vendo a prévia dos temas) não é visita. */
  if (visitaQueNaoConta()) return false;

  const slug = toTrimmed(input.slug);
  const eventName = toTrimmed(input.eventName).toLowerCase();
  if (!slug || !eventName) return false;

  const sourcePath =
    toTrimmed(input.sourcePath) ||
    (typeof window !== "undefined" ? window.location.pathname : "");
  const sessionId = toTrimmed(input.sessionId) || getCatalogSessionId(slug);

  const throttleKey = [
    slug,
    eventName,
    toTrimmed(input.productId),
    toTrimmed(input.categoryId),
    toTrimmed(input.searchTerm).toLowerCase(),
    sourcePath,
  ].join("::");

  const now = Date.now();
  const lastAt = lastEventByKey.get(throttleKey) || 0;
  if (now - lastAt < EVENT_THROTTLE_MS) return false;
  lastEventByKey.set(throttleKey, now);

  const payload = {
    session_id: sessionId,
    source_path: sourcePath || null,
    product_id: toTrimmed(input.productId) || null,
    category_id: toTrimmed(input.categoryId) || null,
    section_id: toTrimmed(input.sectionId) || null,
    search_term: toTrimmed(input.searchTerm) || null,
    meta: input.meta && typeof input.meta === "object" ? input.meta : {},
  };

  try {
    const supabase = getSupabaseClient();
    const { data, error } = await supabase.rpc("track_public_catalog_event", {
      p_slug: slug,
      p_event_name: eventName,
      p_payload: payload,
    });
    if (error) {
      const fallbackResponse = await fetch("/api/catalog/events", {
        method: "POST",
        headers: {
          "content-type": "application/json",
        },
        body: JSON.stringify({
          slug,
          eventName,
          sessionId,
          productId: payload.product_id,
          categoryId: payload.category_id,
          sectionId: payload.section_id,
          searchTerm: payload.search_term,
          sourcePath: payload.source_path,
          meta: payload.meta,
        }),
      }).catch(() => null);

      if (fallbackResponse?.ok) {
        return true;
      }

      if (process.env.NODE_ENV !== "production") {
        console.warn("[catalog-analytics] erro ao registrar evento", { slug, eventName, error: error.message });
      }
      return false;
    }
    if (data && typeof data === "object" && "ok" in (data as Record<string, unknown>)) {
      return (data as { ok?: unknown }).ok !== false;
    }
    return true;
  } catch {
    const fallbackResponse = await fetch("/api/catalog/events", {
      method: "POST",
      headers: {
        "content-type": "application/json",
      },
      body: JSON.stringify({
        slug,
        eventName,
        sessionId,
        productId: payload.product_id,
        categoryId: payload.category_id,
        sectionId: payload.section_id,
        searchTerm: payload.search_term,
        sourcePath: payload.source_path,
        meta: payload.meta,
      }),
    }).catch(() => null);

    if (fallbackResponse?.ok) {
      return true;
    }

    if (process.env.NODE_ENV !== "production") {
      console.warn("[catalog-analytics] falha inesperada ao registrar evento", { slug, eventName });
    }
    return false;
  }
}
