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

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

const React = require('react'); //React и хуки
const { useAppLocalDbContext } = require('../components/layout/AppLocalDbProvider'); //Контекст локальной БД
const { useAppAuthContext } = require('../components/layout/AppAuthProvider'); //Контекст авторизации
const { useAppModeContext } = require('../components/layout/AppModeProvider'); //Контекст режима работы
const { useAppMessagingContext } = require('../components/layout/AppMessagingProvider'); //Контекст сообщений
const { CONNECTION_LOST_MESSAGE, OFFLINE_MODE_TITLE } = require('../config/messages'); //Сообщения

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

//Проверка сессии при входе в приложение
function useStartupSessionCheck() {
    const { isDbReady } = useAppLocalDbContext();
    const { isInitialized, isAuthenticated, checkSession, getAndClearSessionRestoredFromStorage, setStartupSessionCheckInProgress } =
        useAppAuthContext();
    const { setOnline, setOffline } = useAppModeContext();
    const { showInfo } = useAppMessagingContext();

    //Флаг: проверка соединения уже выполнена в этой сессии приложения
    const checkDoneRef = React.useRef(false);

    React.useEffect(() => {
        if (!isDbReady || !isInitialized || !isAuthenticated) {
            return;
        }

        if (checkDoneRef.current) {
            return;
        }

        const restored = getAndClearSessionRestoredFromStorage();
        if (!restored) {
            return;
        }

        checkDoneRef.current = true;
        setStartupSessionCheckInProgress(true);
        let cancelled = false;

        checkSession()
            .then(result => {
                if (cancelled || !result || !result.success) {
                    return;
                }
                if (result.isOffline) {
                    setOffline();
                    showInfo(CONNECTION_LOST_MESSAGE, { title: OFFLINE_MODE_TITLE });
                } else {
                    setOnline();
                }
            })
            .finally(() => {
                if (!cancelled) {
                    setStartupSessionCheckInProgress(false);
                }
            });

        return () => {
            cancelled = true;
            setStartupSessionCheckInProgress(false);
        };
    }, [
        isDbReady,
        isInitialized,
        isAuthenticated,
        checkSession,
        getAndClearSessionRestoredFromStorage,
        setStartupSessionCheckInProgress,
        setOnline,
        setOffline,
        showInfo
    ]);
}

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

module.exports = useStartupSessionCheck;
