/**
 * Хук ленты ремонтов с stale-while-revalidate (У38).
 *
 * Использует `useInfiniteQuery` для бесконечной пагинации по 20 (У38).
 * На `visibilitychange` (когда вкладка/приложение получают фокус) —
 * автоматический рефреш первой страницы. Pull-to-refresh вызывается
 * напрямую из компонента через `refetch()`.
 *
 * SWR-кэш живёт в react-query (память + localStorage persist уже
 * сконфигурирован в QueryClient на уровне приложения, если такого нет —
 * первая отрисовка идёт без кэша, но дальше работает).
 */
import { useEffect } from "react";
import { useInfiniteQuery, type QueryKey } from "@tanstack/react-query";
import { getRepairsFeed, type FeedItem, type FeedResponse } from "@/api/repairsFeed";

export const FEED_QUERY_KEY: QueryKey = ["repairs-feed"];
export const FEED_PAGE_SIZE = 20;

export function useRepairsFeed() {
  const query = useInfiniteQuery<FeedResponse>({
    queryKey: FEED_QUERY_KEY,
    queryFn: ({ pageParam }) =>
      getRepairsFeed({ limit: FEED_PAGE_SIZE, cursor: (pageParam as string | null) ?? null }),
    initialPageParam: null as string | null,
    getNextPageParam: (last) => last.next_cursor ?? undefined,
    staleTime: 30_000, // 30 секунд считаем «свежим» — потом фон обновляет
    refetchOnWindowFocus: false, // делаем свой visibilitychange-листенер ниже
  });

  // У38: обновление при возврате в приложение/вкладку.
  useEffect(() => {
    const onVisible = () => {
      if (document.visibilityState === "visible") {
        // Рефрешим только первую страницу, бесконечный скролл сбрасывается.
        void query.refetch();
      }
    };
    document.addEventListener("visibilitychange", onVisible);
    return () => document.removeEventListener("visibilitychange", onVisible);
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);

  // Удобный flatten для рендера в одну ленту.
  const items: FeedItem[] = query.data?.pages.flatMap((p) => p.items) ?? [];

  return {
    items,
    isLoading: query.isLoading,
    isFetching: query.isFetching,
    isError: query.isError,
    error: query.error,
    fetchNextPage: query.fetchNextPage,
    hasNextPage: !!query.hasNextPage,
    isFetchingNextPage: query.isFetchingNextPage,
    refetch: query.refetch,
  };
}
