import { type UseInfiniteQueryOptions, useInfiniteQuery } from 'react-query';

import { type AxiosResponse } from 'axios';

import { documentsKeys } from 'src/pages/dashboard/Documents/queries';
import {
  getDocumentsFiles,
  getDocumentsFilesBulk,
} from 'src/services/documentsService';
import { type DocumentFile, type FilterOptions } from 'src/types/documents';
import { type PaginatedResponse } from 'src/utils/tableUtils';

type Options = Omit<
  UseInfiniteQueryOptions<
    TQueryFnData,
    null,
    AxiosResponse<PaginatedResponse<DocumentFile>>
  >,
  'queryKey' | 'queryFn'
>;

type TQueryFnData = AxiosResponse<PaginatedResponse<DocumentFile>>;

export const useInfiniteDocumentFiles = (
  filterOptions: FilterOptions,
  options?: Options,
  isBulk?: boolean,
) => {
  const { data, ...rest } = useInfiniteQuery<
    TQueryFnData,
    null,
    AxiosResponse<PaginatedResponse<DocumentFile>>
  >(
    documentsKeys.files(filterOptions),
    ({ pageParam = 1 }) => {
      const params = {
        ...filterOptions,
        page: pageParam,
      };
      return isBulk ? getDocumentsFilesBulk(params) : getDocumentsFiles(params);
    },
    {
      getNextPageParam: lastPage =>
        lastPage.data.page < lastPage.data.totalPages
          ? lastPage.data.page + 1
          : null,
      ...options,
    },
  );

  return {
    ...rest,
    data: data?.pages.flatMap(page => page.data.items) || [],
    count: data?.pages[0].data.count || 0,
    page: data?.pages[0].data.page || 1,
    totalPages: data?.pages[0].data.totalPages || 1,
  };
};
