/**
 * useFeedQuery — react-query wrapper over POST /api/feed.
 *
 * Uses keepPreviousData so filter changes don't blank the UI.
 * staleTime=60s matches server edge-cache TTL.
 */

import { useQuery, keepPreviousData } from '@tanstack/react-query';
import type { FeedFilter } from '@/server/schemas/feed.js';
import type { FeedResult } from '@/server/db/queries/feed.js';

export interface UseFeedQueryOpts {
  /**
   * SSR-prefetched data to seed the cache on first render.
   * Caller should also pass `initialDataUpdatedAt: Date.now()` (via useState lazy init)
   * so react-query treats the data as fresh and staleTime suppresses the mount fetch.
   */
  initialData?: FeedResult;
  /**
   * Timestamp (ms) when initialData was fetched — use `useState(() => Date.now())`
   * in the calling component to capture mount time without impure render calls.
   */
  initialDataUpdatedAt?: number;
  /**
   * When false, the query never fires (no background refetch, no mount fetch).
   * Use to keep SSR initialData frozen until an explicit user preference is set.
   * Defaults to true.
   */
  enabled?: boolean;
}

export function useFeedQuery(filter: FeedFilter, opts?: UseFeedQueryOpts) {
  return useQuery<FeedResult>({
    // react-query v5 stable serialization handles deep equality on the filter object
    queryKey: ['feed', filter],
    queryFn: async () => {
      const res = await fetch('/api/feed', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(filter),
        credentials: 'include',
      });
      if (!res.ok) throw new Error(`feed_${res.status}`);
      return res.json() as Promise<FeedResult>;
    },
    placeholderData: keepPreviousData,
    staleTime: 60_000,
    initialData: opts?.initialData,
    initialDataUpdatedAt: opts?.initialDataUpdatedAt,
    enabled: opts?.enabled ?? true,
  });
}
