/*
    Парус 8 - Панели мониторинга - Редактор запросов
    Пользовательские хуки для работы с запросами
*/

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

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

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

//Работа с запросами
const useQueries = () => {
    //Собственное состояние - флаг инициализированности
    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);

    //Добавление запроса
    const insertQuery = useCallback(
        async (code, name) => {
            await executeStored({ stored: "PKG_P8PANELS_QE.QUERY_INSERT", args: { SCODE: code, SNAME: name }, loader: false });
            setRefresh(true);
        },
        [executeStored]
    );

    //Изменение запроса
    const updateQuery = useCallback(
        async (query, code, name) => {
            await executeStored({ stored: "PKG_P8PANELS_QE.QUERY_UPDATE", args: { NRN: query, SCODE: code, SNAME: name }, loader: false });
            setRefresh(true);
        },
        [executeStored]
    );

    //Удаление запроса
    const deleteQuery = useCallback(
        async query => {
            await executeStored({ stored: "PKG_P8PANELS_QE.QUERY_DELETE", args: { NRN: query }, loader: false });
            setRefresh(true);
        },
        [executeStored]
    );

    //Установка флага готовности запроса
    const setQueryReady = useCallback(
        async (query, ready) => {
            await executeStored({ stored: "PKG_P8PANELS_QE.QUERY_READY_SET", args: { NRN: query, NREADY: ready }, loader: false });
            setRefresh(true);
        },
        [executeStored]
    );

    //Установка флага публичности запроса
    const setQueryPbl = useCallback(
        async (query, pbl) => {
            await executeStored({ stored: "PKG_P8PANELS_QE.QUERY_PBL_SET", args: { NRN: query, NPBL: pbl }, loader: false });
            setRefresh(true);
        },
        [executeStored]
    );

    //При необходимости получить/обновить данные
    useEffect(() => {
        //Загрузка данных с сервера
        const loadData = async () => {
            try {
                setLoading(true);
                const data = await executeStored({
                    stored: "PKG_P8PANELS_QE.QUERY_LIST",
                    respArg: "COUT",
                    isArray: name => ["XQUERY"].includes(name),
                    attributeValueProcessor: (name, val) => (["code", "name"].includes(name) ? undefined : val),
                    loader: true
                });
                setData(data?.XQUERIES?.XQUERY || []);
                setInit(true);
            } finally {
                setRefresh(false);
                setLoading(false);
            }
        };
        //Если надо обновить
        if (refresh)
            //Получим данные
            loadData();
    }, [refresh, executeStored]);

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

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

export { useQueries };
