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

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

const React = require('react'); //React и хуки
const { AppMessage } = require('../common/AppMessage'); //Компонент сообщения
const useAppMessaging = require('../../hooks/useAppMessaging'); //Хук сообщений

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

//Контекст сообщений приложения
const AppMessagingContext = React.createContext(null);

//Провайдер сообщений приложения
function AppMessagingProvider({ children }) {
    const messagingApi = useAppMessaging();

    //Деструктурируем необходимые методы и состояние
    const { hideMessage, state } = messagingApi;

    //Обработчик закрытия окна "крестиком" / Back
    const handleRequestClose = React.useCallback(() => {
        hideMessage();
    }, [hideMessage]);

    //Мемоизация значения контекста с перечислением отдельных свойств
    const value = React.useMemo(
        () => ({
            MSG_TYPE: messagingApi.MSG_TYPE,
            state: messagingApi.state,
            showMessage: messagingApi.showMessage,
            showError: messagingApi.showError,
            showInfo: messagingApi.showInfo,
            showWarn: messagingApi.showWarn,
            showSuccess: messagingApi.showSuccess,
            hideMessage: messagingApi.hideMessage
        }),
        [
            messagingApi.MSG_TYPE,
            messagingApi.state,
            messagingApi.showMessage,
            messagingApi.showError,
            messagingApi.showInfo,
            messagingApi.showWarn,
            messagingApi.showSuccess,
            messagingApi.hideMessage
        ]
    );

    return (
        <AppMessagingContext.Provider value={value}>
            {children}
            <AppMessage
                visible={state.visible}
                variant={state.variant}
                title={state.title}
                message={state.message}
                buttons={state.buttons}
                onRequestClose={handleRequestClose}
                containerStyle={state.containerStyle}
                contentStyle={state.contentStyle}
                titleStyle={state.titleStyle}
                messageStyle={state.messageStyle}
                headerStyle={state.headerStyle}
            />
        </AppMessagingContext.Provider>
    );
}

//Хук доступа к контексту сообщений приложения
function useAppMessagingContext() {
    const ctx = React.useContext(AppMessagingContext);
    if (!ctx) {
        throw new Error('useAppMessagingContext должен использоваться внутри AppMessagingProvider');
    }
    return ctx;
}

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

module.exports = {
    AppMessagingProvider,
    useAppMessagingContext
};
