import { useMemo } from 'react';
import { useQuery } from 'react-query';

import useHuSnackbar from '@material-hu/components/design-system/Snackbar';

import * as documentsService from 'src/services/documentsService';
import { type FilterOptions } from 'src/types/documents';
import { useLokaliseTranslation } from 'src/utils/i18n';
import { type Pagination } from 'src/utils/tableUtils';

import { documentsKeys } from '../queries';
import { getOrderParams } from '../utils';

import { useInfiniteDocumentFiles } from './useInfiniteDocumentFiles';
import { useInfiniteFolders } from './useInfiniteFolders';

type Props = {
  params: Pagination;
  currentFolderId: number;
  formattedFilterParams: FilterOptions;
};

export const useDocuments = ({
  params,
  currentFolderId,
  formattedFilterParams,
}: Props) => {
  const { t } = useLokaliseTranslation('documents');
  const { enqueueSnackbar } = useHuSnackbar();
  const {
    data: foldersList,
    count: totalFoldersCount,
    isLoading: loadingFolders,
    fetchNextPage: fetchNextFolderPage,
    isFetchingNextPage: isFetchingNextFolderPage,
  } = useInfiniteFolders(
    {
      ...params,
      ...getOrderParams(params.orderBy || ''),
    },
    {
      enabled: !currentFolderId,
      onError: () => {
        enqueueSnackbar({
          title: t('error_loading_folder_list'),
          variant: 'error',
        });
      },
    },
  );

  const { data: currentFolder, isLoading: loadingCurrentFolder } = useQuery(
    documentsKeys.folder(Number(currentFolderId)),
    () => documentsService.getDocumentsFolder(Number(currentFolderId)),
    {
      enabled: !!currentFolderId,
      select: r => r.data,
      onError: () => {
        enqueueSnackbar({
          title: t('error_loading_folder_list'),
          variant: 'error',
        });
      },
    },
  );

  const {
    data: documentsList,
    count: totalDocumentsCount,
    isLoading: loadingDocuments,
    fetchNextPage: fetchNextDocumentPage,
    isFetchingNextPage: isFetchingNextDocumentPage,
  } = useInfiniteDocumentFiles(formattedFilterParams, {
    enabled: !!currentFolderId,
    onError: () => {
      enqueueSnackbar({
        title: t('error_loading_folder_document_list'),
        variant: 'error',
      });
    },
  });

  const totalCount = useMemo(() => {
    return currentFolder ? totalDocumentsCount : totalFoldersCount;
  }, [currentFolder, totalDocumentsCount, totalFoldersCount]);

  return {
    documentsList,
    foldersList,
    totalCount,
    loadingFolders,
    currentFolder,
    loadingCurrentFolder,
    loadingDocuments,
    fetchNextFolderPage,
    fetchNextDocumentPage,
    isFetchingNextPage: isFetchingNextFolderPage || isFetchingNextDocumentPage,
  };
};
