/*
    Парус 8 - Панели мониторинга
    Контекст: Приложение - редьюсер состояния
*/

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

//Типы действий
const APP_AT = {
    SET_URL_BASE: "SET_URL_BASE", //Установка базового URL приложения
    LOAD_PANELS: "LOAD_PANELS", //Загрузка списка панелей
    SET_INITIALIZED: "SET_INITIALIZED", //Установка флага инициализированности приложения
    SET_DISPLAY_SIZE: "SET_DISPLAY_SIZE", //Установка текущего типового размера экрана
    SET_APP_BAR_TITLE: "SET_APP_BAR_TITLE", //Установка заголовка в шапке приложения
    SET_APP_BAR_SHOW: "SET_APP_BAR_SHOW", //Установка флага отображения шапки приложения
    SET_APP_BAR_SETTINGS_SHOW: "SET_APP_BAR_SETTINGS_SHOW" //Установка флага отображения настройки параметров в шапке приложения
};

//Состояние приложения по умолчанию
const INITIAL_STATE = displaySizeGetter => ({
    displaySize: displaySizeGetter(),
    appBarTitle: "",
    appBarShow: true,
    appBarSettingsShow: true,
    urlBase: "",
    panels: [],
    panelsLoaded: false,
    initialized: false
});

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

//Обработчики действий
const handlers = {
    //Установка базового URL приложения
    [APP_AT.SET_URL_BASE]: (state, { payload }) => ({ ...state, urlBase: payload }),
    //Загрузка списка панелей
    [APP_AT.LOAD_PANELS]: (state, { payload }) => {
        let panels = [];
        if (payload && Array.isArray(payload.panels))
            for (let p of payload.panels) panels.push({ ...p, showUserSettings: payload?.panelsSettings?.[p.name]?.userSettings === 1 ? true : false });
        return {
            ...state,
            panels,
            panelsLoaded: true
        };
    },
    //Установка текущего типового размера экрана
    [APP_AT.SET_INITIALIZED]: state => ({ ...state, initialized: true }),
    //Установка текущего типового размера экрана
    [APP_AT.SET_DISPLAY_SIZE]: (state, { payload }) => ({ ...state, displaySize: payload }),
    //Установка заголовка в шапке приложения
    [APP_AT.SET_APP_BAR_TITLE]: (state, { payload }) => ({ ...state, appBarTitle: payload }),
    //Установка флага отображения шапки приложения
    [APP_AT.SET_APP_BAR_SHOW]: (state, { payload }) => ({ ...state, appBarShow: payload }),
    //Установка флага отображения настройки параметров в шапке приложения
    [APP_AT.SET_APP_BAR_SETTINGS_SHOW]: (state, { payload }) => ({ ...state, appBarSettingsShow: payload }),
    //Обработчик по умолчанию
    DEFAULT: state => state
};

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

//Константы
export { APP_AT, INITIAL_STATE };

//Редьюсер состояния
export const applicationReducer = (state, action) => {
    //Подберём обработчик
    const handle = handlers[action.type] || handlers.DEFAULT;
    //Исполним его
    return handle(state, action);
};
