"use client";

import { useEffect, useRef } from "react";
import { useAuthStore, getAuthHeaders } from "@/lib/auth-store";
import { useWishlistStore } from "@/lib/wishlist-store";
import { fetchJsonWithAuth } from "@/lib/api-client";

export default function AuthHydrator() {
  const {
    token,
    customer,
    _persistRehydrated,
    setCustomer,
    setHydrated,
    setToken,
  } = useAuthStore();
  /** Tokens we've already successfully loaded customer for (skip refetch). */
  const validatedTokens = useRef(new Set<string>());
  /** Tokens we've already attempted to fetch for (avoid infinite retry loop; account/checkout pages can still refetch). */
  const attemptedTokens = useRef(new Set<string>());
  const fetchingRef = useRef(false);

  useEffect(() => {
    if (!token) {
      setHydrated(true);
      return;
    }
    // Wait for persist rehydration when on client so token from localStorage is available (avoids 401 on full load)
    if (typeof window !== "undefined" && !_persistRehydrated) {
      return;
    }

    // If we already have customer data, skip
    if (token && customer) {
      validatedTokens.current.add(token);
      setHydrated(true);
      return;
    }

    // Already attempted this token and still no customer — don't retry here (account/checkout will refetch when needed)
    if (attemptedTokens.current.has(token)) {
      setHydrated(true);
      return;
    }

    if (validatedTokens.current.has(token)) {
      setHydrated(true);
      return;
    }

    if (fetchingRef.current) return;
    fetchingRef.current = true;
    attemptedTokens.current.add(token);

    let settled = false;
    const settle = () => {
      if (settled) return;
      settled = true;
      fetchingRef.current = false;
      setHydrated(true);
    };

    const timeoutId = window.setTimeout(settle, 10000);

    fetchJsonWithAuth<{ customer: any }>("/api/storefront-proxy/auth/me")
      .then((data) => {
        if (!data) {
          attemptedTokens.current.delete(token);
          setToken(null);
          setCustomer(null);
          settle();
          return;
        }
        if (data.customer) {
          setCustomer(data.customer);
          validatedTokens.current.add(token);
          fetch("/api/storefront-proxy/auth/wishlist", { headers: getAuthHeaders() })
            .then((r) => r.json())
            .then((w) => {
              if (w?.items?.length) useWishlistStore.getState().setItems(w.items);
            })
            .catch(() => {});
        }
        settle();
      })
      .catch(() => {
        settle();
      })
      .finally(() => {
        window.clearTimeout(timeoutId);
      });
  }, [token, customer, _persistRehydrated, setCustomer, setHydrated, setToken]);

  return null;
}
