/*
    Парус 8 - Панели мониторинга - ТОиР - Прогнозирование технического состояния
    Закладка администрирования: кастомные хуки
*/

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

import { useState, useEffect, useContext } from "react"; //Классы React
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
import { DS_RN_DEFAULT } from "./eqs_tech_cond_forecast_hooks"; //Общие вспомогательные хуки

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

//Загрузка классов оборудования выбороки данных
const useEquipDataSelectionClassMachineList = (dataSelection, refresh) => {
    //Собственное состояние - флаг загрузки
    const [isLoading, setLoading] = useState(false);

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

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

    //Загрузка данных при изменении зависимостей
    useEffect(() => {
        const loadData = async () => {
            try {
                setLoading(true);
                const data = await executeStored({
                    stored: "UDO_PKG_EQUIPDS.CM_LIST",
                    args: { NEQUIPDS: dataSelection },
                    respArg: "COUT",
                    isArray: name => ["XDSCM"].includes(name),
                    attributeValueProcessor: (name, val) => (["SCODE"].includes(name) ? undefined : val),
                    loader: false
                });
                setData(data?.XDSCM || []);
            } finally {
                setLoading(false);
            }
        };
        if (dataSelection && dataSelection != DS_RN_DEFAULT) loadData();
    }, [dataSelection, refresh, executeStored]);

    //Вернём данные
    return { equipDataSelectionClassMachineList: data, equipDataSelectionClassMachineListIsLoading: isLoading };
};

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

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

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

    //Загрузка данных при изменении зависимостей
    useEffect(() => {
        const loadData = async () => {
            try {
                setLoading(true);
                const data = await executeStored({
                    stored: "UDO_PKG_EQUIPDS.CM_CARD",
                    args: { NEQUIPDSCM: classMachine },
                    respArg: "COUT",
                    loader: false
                });
                setData(data.XEQUIPDSCM);
            } finally {
                setLoading(false);
            }
        };
        if (classMachine) loadData();
    }, [classMachine, refresh, executeStored]);

    //Вернём данные
    return { equipDataSelectionClassMachineCard: data, equipDataSelectionClassMachineCardIsLoading: isLoading };
};

//Загрузка списка файлов класса оборудования
const useEquipDataSelectionClassMachineFilesList = (classMachine, refresh) => {
    //Собственное состояние - флаг загрузки
    const [isLoading, setLoading] = useState(false);

    //Собственное состояние - таблица данных
    const [data, setData] = useState({
        init: false,
        columnsDef: [],
        rows: []
    });

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

    //Загрузка данных при изменении зависимостей
    useEffect(() => {
        const loadData = async () => {
            try {
                setLoading(true);
                const data = await executeStored({
                    stored: "UDO_PKG_EQUIPDS.CMFL_LIST",
                    args: { NEQUIPDSCM: classMachine },
                    respArg: "COUT",
                    loader: false
                });
                setData(pv => ({
                    ...pv,
                    columnsDef: [...data.XDATA_GRID.columnsDef],
                    rows: [...(data.XDATA_GRID.rows || [])],
                    init: true
                }));
            } finally {
                setLoading(false);
            }
        };
        if (classMachine) loadData();
    }, [classMachine, refresh, executeStored]);

    //Вернём данные
    return { equipDataSelectionClassMachineFilesList: data, equipDataSelectionClassMachineFilesListIsLoading: isLoading };
};

//Загрузка списка моделей класса оборудования
const useEquipDataSelectionClassMachineModelsList = (classMachine, refresh) => {
    //Собственное состояние - флаг загрузки
    const [isLoading, setLoading] = useState(false);

    //Собственное состояние - таблица данных
    const [data, setData] = useState({
        init: false,
        columnsDef: [],
        rows: []
    });

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

    //Загрузка данных при изменении зависимостей
    useEffect(() => {
        const loadData = async () => {
            try {
                setLoading(true);
                const data = await executeStored({
                    stored: "UDO_PKG_EQUIPDS.CMML_LIST",
                    args: { NEQUIPDSCM: classMachine },
                    respArg: "COUT",
                    loader: false
                });
                setData(pv => ({
                    ...pv,
                    columnsDef: [...data.XDATA_GRID.columnsDef],
                    rows: [...(data.XDATA_GRID.rows || [])],
                    init: true
                }));
            } finally {
                setLoading(false);
            }
        };
        if (classMachine) loadData();
    }, [classMachine, refresh, executeStored]);

    //Вернём данные
    return { equipDataSelectionClassMachineModelsList: data, equipDataSelectionClassMachineModelsListIsLoading: isLoading };
};

//Загрузка выборок данных класса оборудования
const useEquipDataSelectionClassMachineDataSetsList = (classMachine, status = null) => {
    //Собственное состояние - флаг загрузки
    const [isLoading, setLoading] = useState(false);

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

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

    //Загрузка данных при изменении зависимостей
    useEffect(() => {
        const loadData = async () => {
            try {
                setLoading(true);
                const data = await executeStored({
                    stored: "UDO_PKG_EQUIPDS.CM_DATASET_LIST",
                    args: { NRN: classMachine, NSTATUS: status },
                    respArg: "COUT",
                    isArray: name => ["XDSCM_DATASET"].includes(name),
                    loader: false
                });
                setData(data?.XDSCM_DATASET || []);
            } finally {
                setLoading(false);
            }
        };
        if (classMachine) loadData();
    }, [classMachine, status, executeStored]);

    //Вернём данные
    return { equipDataSelectionClassMachineDataSetsList: data, equipDataSelectionClassMachineDataSetsListIsLoading: isLoading };
};

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

export {
    useEquipDataSelectionClassMachineList,
    useEquipDataSelectionClassMachineCard,
    useEquipDataSelectionClassMachineFilesList,
    useEquipDataSelectionClassMachineModelsList,
    useEquipDataSelectionClassMachineDataSetsList
};
