/*
    Парус 8 - Панели мониторинга - Редактор настройки регламентированного отчёта
    Пользовательские хуки
*/

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

import { useState, useContext, useEffect } from "react"; //Классы React
import { xml2JSON } from "../../core/utils"; //Вспомогательные функции
import { ApplicationCtx } from "../../context/application"; //Контекст приложения
import { BackEndCtx } from "../../context/backend"; //Контекст взаимодействия с сервером

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

//Получение данных о разделах настройки РО
const useConfSections = conf => {
    //Собственное состояние - флаг инициализированности
    const [isInit, setInit] = useState(false);

    //Собственное состояние - флаг загрузки
    const [isLoading, setLoading] = useState(false);

    //Собственное состояние - флаг необходимости обновления
    const [refresh, setRefresh] = useState(true);

    //Собственное состояние - данные настройки
    const [dataConf, setDataConf] = useState(null);

    //Собственное состояние - данные разделов
    const [dataSections, setDataSections] = useState([]);

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

    //Обновление данных
    const doRefresh = () => setRefresh(true);

    //При необходимости получить/обновить данные
    useEffect(() => {
        //Загрузка данных с сервера
        const loadData = async () => {
            try {
                setLoading(true);
                const data = await executeStored({
                    stored: "PKG_P8PANELS_RRPCONFED.RRPCONF_GET",
                    args: { NRRPCONF: conf },
                    respArg: "COUT",
                    isArray: name => name === "XSECTIONS",
                    attributeValueProcessor: (name, val) => (name.startsWith("S") ? undefined : val),
                    loader: false
                });
                setDataConf(data?.XCONF || null);
                setDataSections(data?.XSECTIONS || []);
                setInit(true);
            } finally {
                setRefresh(false);
                setLoading(false);
            }
        };
        //Если надо обновить
        if (refresh)
            if (conf)
                //Если есть для чего получать данные
                loadData();
            //Нет идентификатора настройки - нет данных
            else {
                setDataConf(null);
                setDataSections([]);
            }
    }, [refresh, conf, executeStored]);

    //При изменении входных свойств - поднимаем флаг обновления
    useEffect(() => setRefresh(true), [conf]);

    //Возвращаем интерфейс хука
    return [dataConf, dataSections, doRefresh, isLoading, isInit];
};

//Получение данных о показателях раздела настройки РО
const useConfSectionMarks = (section, rowOrder = 0, columnOrder = 0) => {
    //Собственное состояние - флаг инициализированности
    const [isInit, setInit] = useState(false);

    //Собственное состояние - флаг загрузки
    const [isLoading, setLoading] = useState(false);

    //Собственное состояние - флаг необходимости обновления
    const [refresh, setRefresh] = useState(true);

    //Собственное состояние - данные
    const [data, setData] = useState(null);

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

    //Обновление данных
    const doRefresh = () => setRefresh(true);

    //При необходимости получить/обновить данные
    useEffect(() => {
        //Загрузка данных с сервера
        const loadData = async () => {
            try {
                setLoading(true);
                const data = await executeStored({
                    stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTN_GET",
                    args: { NRRPCONFSCTN: section, NROW_ORDER: rowOrder, NCOL_ORDER: columnOrder },
                    respArg: "COUT"
                });
                if (data) {
                    for (let i = 0; i < data?.XDATA_GRID?.rows?.length; i++)
                        for (const key of Object.keys(data.XDATA_GRID.rows[i]))
                            if (key.startsWith("SCOL_"))
                                data.XDATA_GRID.rows[i][key] = (
                                    await xml2JSON({
                                        xmlDoc: data.XDATA_GRID.rows[i][key],
                                        isArray: name => name === "CONSTITUTION",
                                        attributeValueProcessor: (name, val) => (name.startsWith("S") ? undefined : val)
                                    })
                                ).XMARK;
                    setData(data?.XDATA_GRID || null);
                } else setData(null);
                setInit(true);
            } finally {
                setRefresh(false);
                setLoading(false);
            }
        };
        //Если надо обновить
        if (refresh)
            if (section)
                //Если есть для чего получать данные
                loadData();
            //Нет идентификатора раздела настройки - нет данных
            else setData(null);
    }, [refresh, section, rowOrder, columnOrder, executeStored]);

    //При изменении входных свойств - поднимаем флаг обновления
    useEffect(() => setRefresh(true), [section, rowOrder, columnOrder]);

    //При изменении раздела - сбрасываем флаг инициализированности (так карточки показателей грузятся красивее - таблица исчезает и появляется уже загруженная)
    useEffect(() => setInit(false), [section]);

    //Возвращаем интерфейс хука
    return [data, doRefresh, isLoading, isInit];
};

//Работа со словарями
const useDictionary = () => {
    //Подключение к контексту приложения
    const { pOnlineShowDictionary } = useContext(ApplicationCtx);

    //Выбор строки
    const selectRRPRow = (code, version, callBack) => {
        pOnlineShowDictionary({
            unitCode: "RRPRow",
            inputParameters: [
                { name: "in_CODE", value: code },
                { name: "in_RRPVERSION_CODE", value: version }
            ],
            callBack: res =>
                callBack(res.success === true ? { code: res.outParameters.out_CODE, version: res.outParameters.out_RRPVERSION_CODE } : null)
        });
    };

    //Выбор графы
    const selectRRPColumn = (code, version, callBack) => {
        pOnlineShowDictionary({
            unitCode: "RRPColumn",
            inputParameters: [
                { name: "in_CODE", value: code },
                { name: "in_RRPVERSION_CODE", value: version }
            ],
            callBack: res =>
                callBack(res.success === true ? { code: res.outParameters.out_CODE, version: res.outParameters.out_RRPVERSION_CODE } : null)
        });
    };

    //Отображение показателя раздела
    const showMark = (mark, callBack) => showMarkCn(mark, null, callBack);

    //Отображение состава показателя раздела
    const showMarkCn = (mark, constitution, callBack) =>
        pOnlineShowDictionary({
            unitCode: "RRPConfigSectionMark",
            showMethod: "link_cn",
            inputParameters: [
                { name: "in_RN", value: mark },
                { name: "in_RRPCONFSCTNMRKCN", value: constitution }
            ],
            callBack
        });

    //Отображение состава показателя раздела с добавлением
    const showMarkCnAdd = (mark, callBack) =>
        pOnlineShowDictionary({
            unitCode: "RRPConfigSectionMarkConstitution",
            showMethod: "link_add",
            inputParameters: [{ name: "in_PRN", value: mark }],
            callBack
        });

    //Возвращаем интерфейс хука
    return { selectRRPRow, selectRRPColumn, showMark, showMarkCn, showMarkCnAdd };
};

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

export { useConfSections, useConfSectionMarks, useDictionary };
