/*
    Предрейсовые осмотры - мобильное приложение
    Хук режима работы приложения (ONLINE / OFFLINE / NOT_CONNECTED)
*/

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

const React = require('react');
const { useAppLocalDbContext } = require('../components/layout/AppLocalDbProvider'); //Контекст локальной БД

//---------
//Константы
//---------

const APP_MODE = {
    ONLINE: 'ONLINE',
    OFFLINE: 'OFFLINE',
    NOT_CONNECTED: 'NOT_CONNECTED'
};

const STORAGE_KEY = 'pretrip_app_mode';

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

//Хук режима работы приложения
function useAppMode() {
    const { getSetting, setSetting, isDbReady } = useAppLocalDbContext();
    const [mode, setMode] = React.useState(APP_MODE.NOT_CONNECTED);
    const [isInitialized, setIsInitialized] = React.useState(false);

    //Предотвращение повторной загрузки
    const loadingRef = React.useRef(false);

    //Загрузка режима из базы данных при готовности БД
    React.useEffect(() => {
        //Выходим, если БД не готова или уже загружаем/загрузили
        if (!isDbReady || loadingRef.current || isInitialized) {
            return;
        }

        loadingRef.current = true;

        const loadMode = async () => {
            try {
                const savedMode = await getSetting(STORAGE_KEY);
                if (savedMode && Object.values(APP_MODE).includes(savedMode)) {
                    setMode(savedMode);
                } else {
                    const serverUrl = await getSetting('app_server_url');
                    if (serverUrl) {
                        setMode(APP_MODE.ONLINE);
                    }
                }
            } catch (error) {
                console.error('Ошибка загрузки режима:', error);
            } finally {
                setIsInitialized(true);
                loadingRef.current = false;
            }
        };

        loadMode();
    }, [isDbReady, isInitialized, getSetting]);

    //Сохранение режима в базу данных при изменении
    React.useEffect(() => {
        if (!isInitialized || !isDbReady) {
            return;
        }

        const saveMode = async () => {
            try {
                await setSetting(STORAGE_KEY, mode);
            } catch (error) {
                console.error('Ошибка сохранения режима:', error);
            }
        };

        saveMode();
    }, [mode, isInitialized, isDbReady, setSetting]);

    //Установка режима ONLINE
    const setOnline = React.useCallback(() => setMode(APP_MODE.ONLINE), []);

    //Установка режима OFFLINE
    const setOffline = React.useCallback(() => setMode(APP_MODE.OFFLINE), []);

    //Установка режима NOT_CONNECTED
    const setNotConnected = React.useCallback(() => setMode(APP_MODE.NOT_CONNECTED), []);

    return {
        APP_MODE,
        mode,
        setMode,
        setOnline,
        setOffline,
        setNotConnected,
        isOnline: mode === APP_MODE.ONLINE,
        isOffline: mode === APP_MODE.OFFLINE,
        isNotConnected: mode === APP_MODE.NOT_CONNECTED
    };
}

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

module.exports = useAppMode;
