import { cssTransition, toast } from 'react-toastify-next';
import { NotificationVariantTypes, notifyClassnames } from './constants';
import { NOTIFICATION_VARIANT } from './NotificationTemplate/constants';
import { getClassNameModifierByVariant, getNotifyOptions } from './utils';
const leave = cssTransition({
    enter: notifyClassnames.animationIn,
    exit: notifyClassnames.animationOut,
    collapse: false,
});
export const notify = {
    success: (title, { icon, ...options } = {}) => toast(({ toastProps }) => NOTIFICATION_VARIANT.success({ ...options, icon, title }, toastProps), {
        className: getClassNameModifierByVariant(NotificationVariantTypes.Success, options.hideProgressBar),
        transition: leave,
        ...getNotifyOptions({ ...options }),
    }),
    info: (title, { icon, ...options } = {}) => toast(({ toastProps }) => NOTIFICATION_VARIANT.info({ ...options, icon, title }, toastProps), {
        className: getClassNameModifierByVariant(NotificationVariantTypes.Info, options.hideProgressBar),
        transition: leave,
        ...getNotifyOptions({ ...options }),
    }),
    warning: (title, { icon, ...options } = {}) => toast(({ toastProps }) => NOTIFICATION_VARIANT.warning({ ...options, icon, title }, toastProps), {
        className: getClassNameModifierByVariant(NotificationVariantTypes.Warning, options.hideProgressBar),
        transition: leave,
        ...getNotifyOptions({ ...options }),
    }),
    error: (title, { icon, ...options } = {}) => toast(({ toastProps }) => NOTIFICATION_VARIANT.error({ ...options, icon, title }, toastProps), {
        className: getClassNameModifierByVariant(NotificationVariantTypes.Error, options.hideProgressBar),
        transition: leave,
        ...getNotifyOptions({ ...options }),
    }),
    initProgress: (initialOptions = {}) => {
        let toastId;
        return {
            start: (title, options) => {
                if (toastId) {
                    // biome-ignore lint/suspicious/noConsole: Ошибка для интеграторов
                    return console.warn(`Уведомление с идентификатором ${toastId} уже запущено. Для инициализации нового уведомления используйте initProgress`);
                }
                toastId = toast(({ toastProps }) => NOTIFICATION_VARIANT.progress({ ...initialOptions, ...options, title, showCloseButton: false }, toastProps), {
                    className: getClassNameModifierByVariant(NotificationVariantTypes.Progress, true),
                    transition: leave,
                    icon: false,
                    closeButton: false,
                    ...getNotifyOptions({ ...initialOptions, isStatic: true }),
                });
            },
            update: (title, options) => {
                if (!toastId) {
                    // biome-ignore lint/suspicious/noConsole: Ошибка для интеграторов
                    return console.warn('Перед вызовом обновления уведомления, нужно его запустить использую метод start');
                }
                notify.update(toastId, {
                    render: ({ toastProps }) => NOTIFICATION_VARIANT.progress({
                        ...options,
                        title,
                        showCloseButton: false,
                    }, toastProps),
                    ...getNotifyOptions({ ...initialOptions, isStatic: true }),
                });
            },
            success: (title, options) => {
                if (!toastId) {
                    // biome-ignore lint/suspicious/noConsole: Ошибка для интеграторов
                    return console.warn('Перед вызовом обновления уведомления, нужно его запустить использую метод start');
                }
                notify.update(toastId, {
                    render: ({ toastProps }) => NOTIFICATION_VARIANT.success({ ...options, title }, toastProps),
                    className: getClassNameModifierByVariant(NotificationVariantTypes.Success, true),
                    type: NotificationVariantTypes.Success,
                    ...getNotifyOptions({ ...initialOptions, isStatic: true }),
                });
            },
            error: (title, options) => {
                if (!toastId) {
                    // biome-ignore lint/suspicious/noConsole: Ошибка для интеграторов
                    return console.warn('Перед вызовом обновления уведомления, нужно его запустить использую метод start');
                }
                notify.update(toastId, {
                    render: ({ toastProps }) => NOTIFICATION_VARIANT.error({ ...options, title }, toastProps),
                    className: getClassNameModifierByVariant(NotificationVariantTypes.Error, true),
                    type: NotificationVariantTypes.Error,
                    ...getNotifyOptions({ ...initialOptions, isStatic: true }),
                });
            },
            stop: () => {
                if (initialOptions?.containerId) {
                    toast.dismiss({
                        id: toastId,
                        containerId: initialOptions.containerId,
                    });
                    toastId = undefined;
                    return;
                }
                toast.dismiss(toastId);
                toastId = undefined;
            },
        };
    },
    custom: toast,
    dismiss: toast.dismiss,
    update: toast.update,
    done: toast.done,
};
