import { useEffect, useMemo, useState } from "react";
import { usePopupContext } from "../PopupContext";
// Хук для подключения анимации
const usePopupAnimation = ()=>{
    const [endAnimation, setEndAnimation] = useState(false);
    const [endTransition, setEndTransition] = useState(false);
    return useMemo(()=>({
            endAnimation,
            endTransition,
            setEndTransition,
            setEndAnimation
        }), [
        endAnimation,
        endTransition
    ]);
};
// Хук для внутреннего состояния, необходимого для правильного отображения вложенных окон, а также для анимации
export const usePopup = ({ isOpen, id, popupInfo, withAnimation })=>{
    const [isVisible, setVisible] = useState(false);
    const popupController = usePopupContext();
    const animationInfo = usePopupAnimation();
    // для использования transition в качестве анимации
    useEffect(()=>{
        if (withAnimation && animationInfo) {
            animationInfo.setEndTransition(!isVisible || animationInfo?.endAnimation);
        }
    }, [
        animationInfo,
        withAnimation,
        isVisible
    ]);
    // сначала добавление/удаление из контекста, и только после этого отображение/скрытие
    useEffect(()=>{
        // при первом открытии
        if (isOpen && !isVisible) {
            popupController.register({
                id,
                ...popupInfo
            });
            setVisible(true);
            animationInfo.setEndAnimation(false);
            return;
        }
        if (isOpen || !isVisible) {
            return;
        }
        // если есть анимация - закрытие по окончании анимации
        if (withAnimation) {
            animationInfo.setEndAnimation(true);
            return;
        }
        // иначе обычное закрытие
        popupController.unregister(id);
        setVisible(false);
    }, [
        isOpen,
        isVisible,
        animationInfo
    ]);
    useEffect(()=>{
        return ()=>{
            popupController.unregister(id);
        };
    }, [
        id
    ]);
    return {
        isVisible,
        setVisible,
        animationInfo,
        withAnimation,
        rootId: popupController.rootId
    };
};
