import { useInfiniteQuery } from 'react-query';

import { type PaginationParams } from 'src/utils/tableUtils';

import { MIN_SEARCH_LENGTH } from '../constants';
import { librariesKeys } from '../queries';
import { searchArticles } from '../services';

export const useGetArticlesSearch = (search: string) => {
  const pagination: PaginationParams = {
    page: 1,
    limit: 10,
    search,
  };

  const { data, hasNextPage, isFetchingNextPage, fetchNextPage, ...query } =
    useInfiniteQuery({
      queryKey: librariesKeys.search.list(pagination),
      queryFn: ({ pageParam = 1 }) =>
        searchArticles({ ...pagination, page: pageParam }),
      getNextPageParam: lastPage => {
        const { page, totalPages } = lastPage.data;
        return page < totalPages ? page + 1 : undefined;
      },
      enabled: !!search && search.length >= MIN_SEARCH_LENGTH,
      keepPreviousData: true,
    });

  const articles = data?.pages.flatMap(page => page.data.items) || [];
  const firstPage = data?.pages[0]?.data;

  const handleFetchNextPage = () => {
    hasNextPage && !isFetchingNextPage && fetchNextPage();
  };

  return {
    articles,
    handleFetchNextPage,
    isFetchingNextPage,
    hasNextPage,
    totalCount: firstPage?.count ?? 0,
    ...query,
  };
};
