import React, { useCallback } from 'react';

import { useSnackbar } from 'notistack';

import { ToastOptions } from '../types';
import { Toast } from '../components';
import { DEFAULT_HIDE_DURATION, ACTION_HIDE_DURATION } from '../constants';
import { THEME } from '../../../constants';

interface ManageToasts {
  openToast: (toast: ToastOptions) => void;
  closeToast: (key: string) => void;
}

export const useManageToasts = (theme: THEME): ManageToasts => {
  const { enqueueSnackbar, closeSnackbar } = useSnackbar();

  const onToastClose = useCallback(
    (key: string) => {
      closeSnackbar(key);
    },
    [closeSnackbar],
  );

  const openToast = useCallback(
    (toast: ToastOptions) => {
      enqueueSnackbar(toast.message, {
        key: toast.id,
        resumeHideDuration: DEFAULT_HIDE_DURATION,
        autoHideDuration: toast.actionButton ? ACTION_HIDE_DURATION : DEFAULT_HIDE_DURATION,
        preventDuplicate: toast.preventDuplicate,
        content: () => (
          <Toast
            theme={theme}
            toast={toast}
            onClose={onToastClose}
          />
        ),
      });
    },
    [enqueueSnackbar, theme, onToastClose],
  );

  const closeToast = useCallback(
    (key: string) => {
      closeSnackbar(key);
    },
    [closeSnackbar],
  );

  return { openToast, closeToast };
};
