import { useMutation, useQueryClient } from 'react-query';
import { useNavigate } from 'react-router-dom';

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

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

import { useLokaliseTranslation } from 'src/utils/i18n';

import { applicantsKeys, jobKeys } from '../../../queries';
import { recruitingRoutes } from '../../../routes';
import { deleteJob } from '../../../services';
import { type JobDetailApplicantsPaginationParams } from '../../../types';

type UseDeleteJobOfferModalProps = {
  jobId?: number | null;
  params: JobDetailApplicantsPaginationParams;
};

export const useDeleteJobOfferModal = ({
  jobId,
  params,
}: UseDeleteJobOfferModalProps) => {
  const { t } = useLokaliseTranslation('ats');
  const queryClient = useQueryClient();
  const navigate = useNavigate();
  const { enqueueSnackbar } = useHuSnackbar();

  const { isLoading, mutate } = useMutation(
    () => {
      if (!jobId) {
        throw new Error('Job ID is required');
      }
      return deleteJob(jobId);
    },
    {
      onSuccess: () => {
        queryClient.invalidateQueries(jobKeys.detail(jobId));
        queryClient.invalidateQueries([
          applicantsKeys.jobDetailAll(jobId),
          params,
        ]);
        closeModal();
        enqueueSnackbar({
          title: t('job_offers.alerts.job_delete.success'),
          variant: 'success',
        });
        navigate(recruitingRoutes.offers(), { replace: true });
      },
    },
  );

  const { closeModal, ...modalProps } = useModal(
    Dialog,
    {
      fullWidth: true,
    },
    {
      title: t('job_offers.alerts.job_delete.title'),
      textBody: t('job_offers.alerts.job_delete.description'),
      primaryButtonProps: {
        children: t('general:delete'),
        loading: isLoading,
        disabled: isLoading,
        onClick: () => {
          mutate();
        },
      },
      secondaryButtonProps: {
        children: t('general:cancel'),
        onClick: () => {
          closeModal();
        },
      },
    },
  );

  return { ...modalProps, closeModal };
};
