/*
    Парус 8 - Панели мониторинга - ТОиР - Аналитика по ремонтам АТС
    Пользовательские хуки: Хуки основных компонентов
*/

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

import { useState, useContext, useCallback, useEffect } from "react"; //Классы React
import { BackEndСtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
import { object2Base64XML, formatDateRF } from "../../../core/utils";

//--------------------------
//Вспомогательные компоненты
//--------------------------

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

//Хук графика статусов
const useChartStatuses = ({ storedArgs = {} }) => {
    //Собственное состояние - график
    const [chartStatuses, setChartStatuses] = useState({ loaded: false, reload: false });

    //Подключение к контексту взаимодействия с сервером
    const { executeStored } = useContext(BackEndСtx);

    //При необходимости перезагрузки графика
    const handleReload = useCallback(() => setChartStatuses(pv => ({ ...pv, reload: true })), []);

    //При подключении к странице
    useEffect(() => {
        //Загрузка данных графика с сервера
        const loadChart = async () => {
            try {
                const chart = await executeStored({
                    stored: "UDO_PKG_P8PANELS_RPR_ANL.CHART_STATUSES",
                    args: {
                        DDATE_FROM: storedArgs.dDateBegin ? new Date(storedArgs.dDateBegin) : null,
                        DDATE_TO: storedArgs.dDateEnd ? new Date(storedArgs.dDateEnd) : null,
                        SINS_DEPARTMENT: storedArgs.sCustomerDept,
                        SEQTYPEWRK: storedArgs.sWorkType,
                        SEQWRKKIND: storedArgs.sWorkKind,
                        SEQCONFIG: storedArgs.sEqconfig.toString(),
                        NSTATE: storedArgs.nState,
                        NTYPESPEND: storedArgs.nType
                    },
                    respArg: "COUT"
                });
                setChartStatuses(pv => ({ ...pv, loaded: true, reload: false, ...chart.XCHART }));
            } catch (e) {
                setChartStatuses(pv => ({ ...pv, loaded: false, reload: false }));
            }
        };
        //При необходимости перезагрузить
        if (chartStatuses.reload) loadChart();
        // eslint-disable-next-line react-hooks/exhaustive-deps
    }, [chartStatuses.reload, executeStored]);

    //Возвращаем график
    return { chartStatuses, handleReload };
};

//Хук графика трудовых затрат
const useChartSpendings = ({ storedArgs = {} }) => {
    //Собственное состояние - график
    const [chartSpendings, setChartSpendings] = useState({ loaded: false, reload: false });

    //Подключение к контексту взаимодействия с сервером
    const { executeStored } = useContext(BackEndСtx);

    //При необходимости перезагрузки графика
    const handleReload = useCallback(() => setChartSpendings(pv => ({ ...pv, reload: true })), []);

    //При подключении к странице
    useEffect(() => {
        //Загрузка данных графика с сервера
        const loadChart = async () => {
            try {
                const chart = await executeStored({
                    stored: "UDO_PKG_P8PANELS_RPR_ANL.CHART_SPENDINGS",
                    args: {
                        DDATE_FROM: storedArgs.dDateBegin ? new Date(storedArgs.dDateBegin) : null,
                        DDATE_TO: storedArgs.dDateEnd ? new Date(storedArgs.dDateEnd) : null,
                        SINS_DEPARTMENT: storedArgs.sCustomerDept,
                        SEQTYPEWRK: storedArgs.sWorkType,
                        SEQWRKKIND: storedArgs.sWorkKind,
                        SEQCONFIG: storedArgs.sEqconfig.toString(),
                        NSTATE: storedArgs.nState,
                        NTYPESPEND: storedArgs.nType
                    },
                    respArg: "COUT"
                });
                setChartSpendings(pv => ({ ...pv, loaded: true, reload: false, ...chart.XCHART }));
            } catch (e) {
                setChartSpendings(pv => ({ ...pv, loaded: false, reload: false }));
            }
        };
        //При необходимости перезагрузить
        if (chartSpendings.reload) loadChart();
        // eslint-disable-next-line react-hooks/exhaustive-deps
    }, [chartSpendings.reload, executeStored]);

    //Возвращаем график
    return { chartSpendings, handleReload };
};

//Хук таблицы ремотных ведомостей
const useTableRepairs = ({ storedArgs = [] }) => {
    //Собственное состояние - таблица
    const [dataGrid, setDataGrid] = useState({
        dataLoaded: false,
        filters: [],
        orders: null,
        pageNumber: 1,
        morePages: true,
        reloading: false
    });

    //Подключение к контексту взаимодействия с сервером
    const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);

    //При изменении состояния фильтра
    const handleFilterChanged = ({ filters }) => setDataGrid(pv => ({ ...pv, filters: [...filters], pageNumber: 1, reloading: true }));

    //При изменении состояния сортировки
    const handleOrderChanged = ({ orders }) => setDataGrid(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reloading: true }));

    //При изменении количества отображаемых страниц
    const handlePagesCountChanged = () => setDataGrid(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reloading: true }));

    //При необходимости перезагрузки таблицы
    const handleReload = () => setDataGrid(pv => ({ ...pv, pageNumber: 1, reloading: true }));

    //При подключении к странице
    useEffect(() => {
        //Загрузка данных графика с сервера
        const loadDataGrid = async () => {
            try {
                const data = await executeStored({
                    stored: "UDO_PKG_P8PANELS_RPR_ANL.DATA_GRID",
                    args: {
                        CFILTERS: {
                            VALUE: object2Base64XML([...dataGrid.filters, ...storedArgs], { arrayNodeName: "filters" }),
                            SDATA_TYPE: SERV_DATA_TYPE_CLOB
                        },
                        CORDERS: { VALUE: object2Base64XML(dataGrid.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
                        NPAGE_NUMBER: dataGrid.pageNumber,
                        NPAGE_SIZE: 10,
                        NINCLUDE_DEF: dataGrid.dataLoaded ? 0 : 1
                    },
                    attributeValueProcessor: (name, val) => (["DDOCDATE", "DDATEFACT_BEG", "DDATEFACT_END"].includes(name) ? formatDateRF(val) : val),
                    respArg: "COUT"
                });
                setDataGrid(pv => ({
                    ...pv,
                    ...data.XDATA_GRID,
                    columnsDef: data.XDATA_GRID.columnsDef ? [...data.XDATA_GRID.columnsDef] : pv.columnsDef || [],
                    rows: pv.pageNumber == 1 ? [...(data.XDATA_GRID.rows || [])] : [...(pv.rows || []), ...(data.XDATA_GRID.rows || [])],
                    dataLoaded: true,
                    reloading: false,
                    morePages: (data.XDATA_GRID.rows || []).length >= 10
                }));
            } catch (e) {
                setDataGrid(pv => ({ ...pv, loaded: false, reload: false }));
            }
        };
        //При необходимости перезагрузить
        if (dataGrid.reloading) loadDataGrid();
        // eslint-disable-next-line react-hooks/exhaustive-deps
    }, [dataGrid.reloading, executeStored]);

    //Возвращаем график
    return { dataGrid, handleReload, handleFilterChanged, handleOrderChanged, handlePagesCountChanged };
};

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

export { useChartStatuses, useChartSpendings, useTableRepairs };
