import { useInfiniteQuery } from 'react-query';

import { knowledgeBaseKeys } from '../../queries';
import { getKnowledgeBaseFiles } from '../../services';
import { KnowledgeBaseItemType } from '../../types';
import { transformGetKnowledgeBaseResponse } from './utils';
import { KNOWLEDGE_BASE_PAGE_SIZE } from '../../constants';

type Params = {
  folderPath: string;
  search?: string;
};

export const useGetKnowledgeBaseFiles = ({ folderPath, search }: Params) => {
  const {
    data,
    isLoading,
    isSuccess,
    isError,
    fetchNextPage,
    isFetchingNextPage,
    refetch,
  } = useInfiniteQuery({
    queryKey: knowledgeBaseKeys.list({ folder: folderPath, search }),
    queryFn: ({ pageParam = 0 }) => {
      return getKnowledgeBaseFiles({
        folder: folderPath,
        search,
        limit: KNOWLEDGE_BASE_PAGE_SIZE,
        offset: pageParam as number,
      });
    },
    getNextPageParam: (lastPage, allPages) =>
      lastPage.data.hasMore
        ? allPages.length * KNOWLEDGE_BASE_PAGE_SIZE
        : undefined,
  });

  const allPages =
    data?.pages.map((page, index) =>
      transformGetKnowledgeBaseResponse(page.data, index === 0),
    ) ?? [];

  const items = allPages.flatMap(page => page.items);

  const total = allPages[0]?.total ?? 0;
  const hasMore = allPages[allPages.length - 1]?.hasMore ?? false;

  const filesCount = items.filter(
    i => i.type === KnowledgeBaseItemType.FILE,
  ).length;

  return {
    items,
    total,
    hasMore,
    isLoading,
    isSuccess,
    isError,
    filesCount,
    fetchNextPage,
    isFetchingNextPage,
    refetch,
  };
};
