/*
    Парус 8 - Панели мониторинга
    Таблица данных - редьюсер состояния
*/

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

//Типы действий
const DG_AT = {
    SET_DATA_GRID: "SET_DATA_GRID", //Установка даных таблицы
    SET_DATA_GRID_FILTER: "SET_DATA_GRID_FILTER", //Установка фильтра таблицы
    SET_DATA_GRID_ORDER: "SET_DATA_GRID_ORDER", //Установка сортировок таблицы
    SET_DATA_GRID_PAGE_NUMBER: "SET_DATA_GRID_PAGE_NUMBER", //Установка страницы таблицы
    SET_IS_DATA_LOADED: "SET_IS_DATA_LOADED", //Установка флага загруженности данных
    SET_IS_LOADING: "SET_IS_LOADING", //Установка флага активности процесса загрузки данных
    SET_RELOAD: "SET_RELOAD" //Установка флага необходимости обновления данных
};

//Состояние приложения по умолчанию
const INITIAL_STATE = ({ initFilters, initOrders }) => ({
    dataGrid: {
        columnsDef: [],
        groups: [],
        rows: [],
        filters: Array.isArray(initFilters) ? [...initFilters] : [],
        orders: Array.isArray(initOrders) ? [...initOrders] : [],
        pageNumber: 1,
        pagesAlign: null,
        pagesPosition: null,
        pagesCount: 0,
        fixedColumns: 0,
        fixedHeader: false,
        morePages: false
    },
    isDataLoaded: false,
    isDataFound: false,
    isLoading: false,
    reload: true
});

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

//Обработчики действий
const handlers = {
    //Установка даных таблицы
    [DG_AT.SET_DATA_GRID]: (state, { payload }) => {
        const { dataGridData, pageSize, isError } = payload;
        return {
            ...state,
            dataGrid: {
                ...state.dataGrid,
                ...dataGridData,
                columnsDef: dataGridData.columnsDef ? [...dataGridData.columnsDef] : state.dataGrid.columnsDef || [],
                rows:
                    dataGridData.pagesCount > 0 || state.dataGrid.pageNumber == 1
                        ? [...(dataGridData.rows || [])]
                        : [...(state.dataGrid.rows || []), ...(dataGridData.rows || [])],
                groups: dataGridData.groups
                    ? dataGridData.pagesCount > 0 || state.dataGrid.pageNumber == 1
                        ? [...(dataGridData.groups || [])]
                        : [...(state.dataGrid.groups || []), ...dataGridData.groups.filter(g => !state.dataGrid.groups.find(pg => pg.name == g.name))]
                    : [...(state.dataGrid.groups || [])],
                morePages: dataGridData.morePages && (dataGridData.rows || []).length >= pageSize
            },
            isDataLoaded: isError === true ? false : true,
            isDataFound:
                (state.dataGrid.pageNumber == 1 && dataGridData?.rows?.length > 0) ||
                (state.dataGrid.pageNumber != 1 && state.dataGrid.rows.length > 0)
        };
    },
    //Установка фильтра таблицы
    [DG_AT.SET_DATA_GRID_FILTER]: (state, { payload }) => ({
        ...state,
        dataGrid: { ...state.dataGrid, filters: [...payload], pageNumber: 1 },
        reload: true
    }),
    //Установка сортировок таблицы
    [DG_AT.SET_DATA_GRID_ORDER]: (state, { payload }) => ({
        ...state,
        dataGrid: { ...state.dataGrid, orders: [...payload], pageNumber: 1 },
        reload: true
    }),
    //Установка страницы таблицы
    [DG_AT.SET_DATA_GRID_PAGE_NUMBER]: (state, { payload }) => ({ ...state, dataGrid: { ...state.dataGrid, pageNumber: payload }, reload: true }),
    //Установка флага загруженности данных
    [DG_AT.SET_IS_DATA_LOADED]: (state, { payload }) => ({ ...state, isDataLoaded: payload }),
    //Установка флага активности процесса загрузки данных
    [DG_AT.SET_IS_LOADING]: (state, { payload }) => ({ ...state, isLoading: payload, reload: payload === false ? false : state.reload }),
    //Установка флага необходимости обновления данных
    [DG_AT.SET_RELOAD]: (state, { payload }) => ({
        ...state,
        reload: payload.reload,
        ...(payload.resetPageNumber ? { dataGrid: { ...state.dataGrid, pageNumber: 1 } } : {})
    }),
    //Обработчик по умолчанию
    DEFAULT: state => state
};

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

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

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