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

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

const React = require('react'); //React и хуки
const { APP_MESSAGE_VARIANT, MSG_AT } = require('../config/messagingConfig'); //Типы сообщений и действий

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

//Начальное состояние сообщений
const INITIAL_STATE = {
    visible: false,
    variant: APP_MESSAGE_VARIANT.INFO,
    title: '',
    message: '',
    buttons: null,
    containerStyle: null,
    contentStyle: null,
    titleStyle: null,
    messageStyle: null,
    headerStyle: null
};

//Типы сообщений (алиасы для вариантов)
const MSG_TYPE = {
    INFO: APP_MESSAGE_VARIANT.INFO,
    WARN: APP_MESSAGE_VARIANT.WARN,
    ERR: APP_MESSAGE_VARIANT.ERR,
    SUCCESS: APP_MESSAGE_VARIANT.SUCCESS
};

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

//Редьюсер состояния сообщений
const messagingReducer = (state, action) => {
    switch (action.type) {
        case MSG_AT.SHOW_MSG:
            return {
                ...state,
                visible: true,
                variant: action.payload.variant || MSG_TYPE.INFO,
                title: action.payload.title || '',
                message: action.payload.message || '',
                buttons: action.payload.buttons || null,
                containerStyle: action.payload.containerStyle || null,
                contentStyle: action.payload.contentStyle || null,
                titleStyle: action.payload.titleStyle || null,
                messageStyle: action.payload.messageStyle || null,
                headerStyle: action.payload.headerStyle || null
            };
        case MSG_AT.HIDE_MSG:
            return {
                ...state,
                visible: false
            };
        default:
            return state;
    }
};

//Хук сообщений приложения
function useAppMessaging() {
    const [state, dispatch] = React.useReducer(messagingReducer, INITIAL_STATE);

    //Базовое отображение сообщения
    const showMessage = React.useCallback((payload = {}) => {
        dispatch({
            type: MSG_AT.SHOW_MSG,
            payload
        });
    }, []);

    //Сообщение - ошибка
    const showError = React.useCallback(
        (message, options = {}) =>
            showMessage({
                ...options,
                variant: MSG_TYPE.ERR,
                message
            }),
        [showMessage]
    );

    //Сообщение - информация
    const showInfo = React.useCallback(
        (message, options = {}) =>
            showMessage({
                ...options,
                variant: MSG_TYPE.INFO,
                message
            }),
        [showMessage]
    );

    //Сообщение - предупреждение
    const showWarn = React.useCallback(
        (message, options = {}) =>
            showMessage({
                ...options,
                variant: MSG_TYPE.WARN,
                message
            }),
        [showMessage]
    );

    //Сообщение - успех
    const showSuccess = React.useCallback(
        (message, options = {}) =>
            showMessage({
                ...options,
                variant: MSG_TYPE.SUCCESS,
                message
            }),
        [showMessage]
    );

    //Сокрытие сообщения
    const hideMessage = React.useCallback(() => {
        dispatch({ type: MSG_AT.HIDE_MSG });
    }, []);

    return {
        MSG_TYPE,
        state,
        showMessage,
        showError,
        showInfo,
        showWarn,
        showSuccess,
        hideMessage
    };
}

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

module.exports = useAppMessaging;
