import { useMutation } from 'react-query';

import { type AxiosResponse } from 'axios';
import { useModal } from '@material-hu/hooks/useModal';

import { type GetReportParams } from 'src/types/acknowledgements';
import { download } from 'src/utils/filesUtils';

import {
  ReportFilter,
  type ReportFilterProps,
} from 'src/components/ReportFilter';

type UseReportModalProps = {
  fetchFn: (params: GetReportParams) => Promise<AxiosResponse>;
  fileName: string;
  filterProps: Omit<ReportFilterProps, 'onSave' | 'onClose'>;
};

export const useReportModal = ({
  fetchFn,
  fileName,
  filterProps,
}: UseReportModalProps) => {
  const reportMutation = useMutation(
    async (params: GetReportParams) => {
      const reportResponse = await fetchFn(params);
      download(reportResponse.data, fileName);
    },
    { onSettled: () => reportModal.closeModal() },
  );

  const reportModal = useModal(
    ReportFilter,
    { fullWidth: true, maxWidth: 'xs' },
    {
      onSave: (
        from?: string,
        to?: string,
        includedGroups?: number[],
        includedUserFields?: string[],
      ) =>
        reportMutation.mutateAsync({
          minDate: from,
          maxDate: to,
          includedGroups,
          userFields: includedUserFields,
        }),
      ...filterProps,
    },
  );

  return reportModal;
};

export default useReportModal;
