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

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

const React = require('react');
const useAuth = require('../../hooks/useAuth');

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

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

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

    //Состояние для хранения данных формы авторизации
    const [authFormData, setAuthFormData] = React.useState({
        serverUrl: '',
        username: '',
        password: '',
        savePassword: false
    });

    //Флаг проверки сессии
    const [sessionChecked, setSessionChecked] = React.useState(false);

    //Обновление данных формы авторизации
    const updateAuthFormData = React.useCallback(data => {
        setAuthFormData(prev => ({ ...prev, ...data }));
    }, []);

    //Очистка данных формы авторизации
    const clearAuthFormData = React.useCallback(() => {
        setAuthFormData({
            serverUrl: '',
            username: '',
            password: '',
            savePassword: false
        });
    }, []);

    //Отметка что сессия была проверена
    const markSessionChecked = React.useCallback(() => {
        setSessionChecked(true);
    }, []);

    //Мемоизация значения контекста с перечислением отдельных свойств
    const value = React.useMemo(
        () => ({
            session: auth.session,
            isAuthenticated: auth.isAuthenticated,
            isLoading: auth.isLoading,
            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,
            authFormData,
            updateAuthFormData,
            clearAuthFormData,
            sessionChecked,
            markSessionChecked
        }),
        [
            auth.session,
            auth.isAuthenticated,
            auth.isLoading,
            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,
            authFormData,
            updateAuthFormData,
            clearAuthFormData,
            sessionChecked,
            markSessionChecked
        ]
    );

    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
};
