/*
    Предрейсовые осмотры - мобильное приложение
    Провайдер контекста навигации приложения
*/

//---------------------
//Подключение библиотек
//---------------------

const React = require('react'); //React и хуки
const useAppNavigation = require('../../hooks/useAppNavigation'); //Хук навигации
const useHardwareBackPress = require('../../hooks/useHardwareBackPress'); //Хук кнопки "Назад"

//-----------
//Тело модуля
//-----------

//Контекст навигации приложения
const AppNavigationContext = React.createContext(null);

//Провайдер навигации приложения
function AppNavigationProvider({ children }) {
    const navigationApi = useAppNavigation();

    //Деструктурируем для использования в useCallback
    const { canGoBack, goBack } = navigationApi;

    //Обработчик аппаратной кнопки "Назад" (Android)
    const handleHardwareBackPress = React.useCallback(() => {
        //Если можно вернуться назад - возвращаемся
        if (canGoBack) {
            goBack();
            return true; //Предотвращаем закрытие приложения
        }

        //Если нельзя - позволяем системе обработать (закрыть приложение)
        return false;
    }, [canGoBack, goBack]);

    //Подключаем обработчик кнопки "Назад"
    useHardwareBackPress(handleHardwareBackPress);

    //Мемоизация значения контекста с перечислением отдельных свойств
    const value = React.useMemo(
        () => ({
            SCREENS: navigationApi.SCREENS,
            currentScreen: navigationApi.currentScreen,
            screenParams: navigationApi.screenParams,
            navigate: navigationApi.navigate,
            goBack: navigationApi.goBack,
            reset: navigationApi.reset,
            setInitialScreen: navigationApi.setInitialScreen,
            canGoBack: navigationApi.canGoBack
        }),
        [
            navigationApi.SCREENS,
            navigationApi.currentScreen,
            navigationApi.screenParams,
            navigationApi.navigate,
            navigationApi.goBack,
            navigationApi.reset,
            navigationApi.setInitialScreen,
            navigationApi.canGoBack
        ]
    );

    return <AppNavigationContext.Provider value={value}>{children}</AppNavigationContext.Provider>;
}

//Хук доступа к контексту навигации приложения
function useAppNavigationContext() {
    const ctx = React.useContext(AppNavigationContext);
    if (!ctx) {
        throw new Error('useAppNavigationContext должен использоваться внутри AppNavigationProvider');
    }
    return ctx;
}

//----------------
//Интерфейс модуля
//----------------

module.exports = {
    AppNavigationProvider,
    useAppNavigationContext
};
