'use client';

import {useEffect, useState} from 'react';
import type {Catalog} from '@/lib/catalog';

/** Keep an open market current without remounting its filters or replacing it on a network error. */
export function useMarketCatalog(initialCatalog: Catalog) {
  const [state, setState] = useState({source: initialCatalog, catalog: initialCatalog});

  useEffect(() => {
    // A design preview must never silently switch to the live marketplace.
    if (initialCatalog.mode === 'preview') return;
    let active = true, pending = false, lastAttempt = -Infinity;
    let controller: AbortController | null = null;

    const refresh = async () => {
      const now = Date.now();
      if (!active || document.visibilityState !== 'visible' || pending || now - lastAttempt < 2000) return;
      pending = true;
      lastAttempt = now;
      controller = new AbortController();
      const signal = AbortSignal.any([controller.signal, AbortSignal.timeout(25000)]);
      try {
        const response = await fetch('/api/catalog', {cache: 'no-store', credentials: 'omit', signal});
        const catalog = await response.json() as Catalog;
        if (!response.ok || catalog?.mode !== 'live' || !Array.isArray(catalog.projects) || !catalog.content ||
            catalog.projects.some(project => !project || project.status !== 'published')) return;
        if (active && !signal.aborted) setState({source: initialCatalog, catalog});
      } catch {
        // Retain the last successful catalog while the next focus/poll can retry.
      } finally {
        pending = false;
        controller = null;
      }
    };

    const onVisible = () => {void refresh();};
    // Server-rendered live content is already fresh; only retry immediately if that first read failed.
    if (initialCatalog.mode === 'unavailable') void refresh();
    const timer = window.setInterval(onVisible, 60000);
    window.addEventListener('focus', onVisible);
    document.addEventListener('visibilitychange', onVisible);
    return () => {
      active = false;
      controller?.abort();
      window.clearInterval(timer);
      window.removeEventListener('focus', onVisible);
      document.removeEventListener('visibilitychange', onVisible);
    };
  }, [initialCatalog]);

  return state.source === initialCatalog ? state.catalog : initialCatalog;
}
