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

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

const React = require('react'); //React
const useAuth = require('../../hooks/useAuth'); //Хук авторизации

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

//Контекст авторизации
const AppAuthContext = React.createContext(null);

//Провайдер авторизации
function AppAuthProvider({ children }) {
    const auth = useAuth();

    //Флаг: выполняется проверка соединения при старте (блокирует UI главного экрана)
    const [isStartupSessionCheckInProgress, setStartupSessionCheckInProgress] = React.useState(false);

    //Адрес сервера, сохранённый в настройках при текущем визите (для подстановки при возврате на экран логина)
    const lastSavedServerUrlFromSettingsRef = React.useRef(null);

    //Очистка данных формы авторизации (после успешного входа; актуальные данные хранятся в authFormStore и сбрасываются на экране)
    const clearAuthFormData = React.useCallback(() => {}, []);

    //Отметка о сохранении адреса сервера в настройках (вызывается с экрана настроек при успешном сохранении)
    const setLastSavedServerUrlFromSettings = React.useCallback(url => {
        lastSavedServerUrlFromSettingsRef.current = url != null ? String(url).trim() : null;
    }, []);

    //Получить и сбросить адрес сервера, сохранённый в настройках (для восстановления при возврате на экран логина)
    const getAndClearLastSavedServerUrlFromSettings = React.useCallback(() => {
        const url = lastSavedServerUrlFromSettingsRef.current;
        lastSavedServerUrlFromSettingsRef.current = null;
        return url;
    }, []);

    //Мемоизация значения контекста с перечислением отдельных свойств
    const value = React.useMemo(
        () => ({
            session: auth.session,
            isAuthenticated: auth.isAuthenticated,
            isLoading: auth.isLoading,
            isLogoutInProgress: auth.isLogoutInProgress,
            isInitialized: auth.isInitialized,
            error: auth.error,
            login: auth.login,
            logout: auth.logout,
            selectCompany: auth.selectCompany,
            checkSession: auth.checkSession,
            getDeviceId: auth.getDeviceId,
            getSavedCredentials: auth.getSavedCredentials,
            clearSavedCredentials: auth.clearSavedCredentials,
            getAuthSession: auth.getAuthSession,
            clearAuthSession: auth.clearAuthSession,
            getAndClearSessionRestoredFromStorage: auth.getAndClearSessionRestoredFromStorage,
            AUTH_SETTINGS_KEYS: auth.AUTH_SETTINGS_KEYS,
            isStartupSessionCheckInProgress,
            setStartupSessionCheckInProgress,
            clearAuthFormData,
            setLastSavedServerUrlFromSettings,
            getAndClearLastSavedServerUrlFromSettings
        }),
        [
            auth.session,
            auth.isAuthenticated,
            auth.isLoading,
            auth.isLogoutInProgress,
            auth.isInitialized,
            auth.error,
            auth.login,
            auth.logout,
            auth.selectCompany,
            auth.checkSession,
            auth.getDeviceId,
            auth.getSavedCredentials,
            auth.clearSavedCredentials,
            auth.getAuthSession,
            auth.clearAuthSession,
            auth.getAndClearSessionRestoredFromStorage,
            auth.AUTH_SETTINGS_KEYS,
            isStartupSessionCheckInProgress,
            setStartupSessionCheckInProgress,
            clearAuthFormData,
            setLastSavedServerUrlFromSettings,
            getAndClearLastSavedServerUrlFromSettings
        ]
    );

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

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

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

module.exports = {
    AppAuthProvider,
    useAppAuthContext
};
