/*
    Парус 8 - Панели мониторинга - УДП - Доски задач
    Пользовательские хуки: Хуки диалога события
*/

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

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

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

//Хук для события
const useClientEvent = (taskRn, taskType = "") => {
    //Собственное состояние
    const [task, setTask] = useState({
        init: true,
        nRn: taskRn,
        sCrn: "",
        sPrefix: "",
        sNumber: "",
        sType: taskType,
        sStatus: "",
        sDescription: "",
        sClntClients: "",
        sClntClnperson: "",
        dStartDate: "",
        sInitClnperson: "",
        sInitUser: "",
        sInitReason: "",
        sToCompany: "",
        sToDepartment: "",
        sToClnpost: "",
        sToClnpsdep: "",
        sToClnperson: "",
        sToFcstaffgrp: "",
        sToUser: "",
        sToUsergrp: "",
        sCurrentUser: "",
        isUpdate: false,
        insertDisabled: true,
        updateDisabled: true,
        docProps: {}
    });

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

    //При инициализации события
    useEffect(() => {
        //Если это инициализация
        if (task.init) {
            //Если указан рег. номер события
            if (taskRn) {
                //Считывание параметров события
                const readEvent = async () => {
                    //Считываем информацию о событии по рег. номеру
                    const data = await executeStored({
                        stored: "PKG_P8PANELS_CLNTTSKBRD.CLNEVENTS_GET",
                        args: {
                            NCLNEVENTS: task.nRn
                        },
                        respArg: "COUT"
                    });
                    //Фильтруем доп. свойства
                    let docProps = Object.keys(data.XEVENT)
                        .filter(key => key.includes("DP_"))
                        .reduce((prev, key) => ({ ...prev, [key]: data.XEVENT[key] }), {});
                    //Устанавливаем информацию о событии
                    setTask(pv => ({
                        ...pv,
                        sCrn: data.XEVENT.SCRN,
                        nClosed: data.XEVENT.NCLOSED,
                        sPrefix: data.XEVENT.SPREF,
                        sNumber: data.XEVENT.SNUMB,
                        sType: data.XEVENT.STYPE,
                        sStatus: data.XEVENT.SSTATUS,
                        sDescription: data.XEVENT.SDESCRIPTION,
                        sClntClients: data.XEVENT.SCLIENT_CLIENT,
                        sClntClnperson: data.XEVENT.SCLIENT_PERSON,
                        dPlanDate: data.XEVENT.SPLAN_DATE,
                        sInitClnperson: data.XEVENT.SINIT_PERSON,
                        sInitUser: data.XEVENT.SINIT_AUTHID,
                        sInitReason: data.XEVENT.SREASON,
                        sToCompany: data.XEVENT.SSEND_CLIENT,
                        sToDepartment: data.XEVENT.SSEND_DIVISION,
                        sToClnpost: data.XEVENT.SSEND_POST,
                        sToClnpsdep: data.XEVENT.SSEND_PERFORM,
                        sToClnperson: data.XEVENT.SSEND_PERSON,
                        sToFcstaffgrp: data.XEVENT.SSEND_STAFFGRP,
                        sToUser: data.XEVENT.SSEND_USER_NAME,
                        sToUsergrp: data.XEVENT.SSEND_USER_GROUP,
                        sCurrentUser: data.XEVENT.SINIT_AUTHID,
                        isUpdate: true,
                        init: false,
                        docProps: docProps
                    }));
                };
                //Инициализация параметров события
                readEvent();
            } else {
                //Считывание изначальных параметров события
                const initEvent = async () => {
                    //Инициализируем параметры события
                    const data = await executeStored({
                        stored: "PKG_P8PANELS_CLNTTSKBRD.CLNEVENTS_INIT",
                        args: {
                            SEVENT_TYPE: task.sType
                        }
                    });
                    //Если есть данные
                    if (data) {
                        //Устанавливаем данные по событию
                        setTask(pv => ({
                            ...pv,
                            sPrefix: data.SPREF,
                            sNumber: data.SNUMB,
                            sStatus: data.SSTATUS,
                            sCurrentUser: data.SINIT_AUTHNAME,
                            sInitClnperson: data.SINIT_PERSON,
                            sInitUser: !data.SINIT_PERSON ? data.SINIT_AUTHNAME : "",
                            init: false
                        }));
                    }
                };
                //Инициализация изначальных параметров события
                initEvent();
            }
        }
        if (!task.init) {
            setTask(pv => ({ ...pv, sInitUser: !task.sInitClnperson ? task.sCurrentUser : "" }));
        }
    }, [executeStored, task.init, task.nRn, task.sType, task.sCurrentUser, task.sInitClnperson, taskRn]);

    //Проверка доступности действия
    useEffect(() => {
        setTask(pv => ({
            ...pv,
            insertDisabled:
                !task.sCrn ||
                !task.sPrefix ||
                !task.sNumber ||
                !task.sType ||
                !task.sStatus ||
                !task.sDescription ||
                (!task.sInitClnperson && !task.sInitUser),
            updateDisabled: !task.sDescription
        }));
    }, [task.sCrn, task.sDescription, task.sInitClnperson, task.sInitUser, task.sNumber, task.sPrefix, task.sStatus, task.sType]);

    return [task, setTask];
};

//Хук для получения свойств раздела "События"
const useDocsProps = taskType => {
    //Собственное состояние
    const [docProps, setDocsProps] = useState({ loaded: false, props: [] });

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

    useEffect(() => {
        //Загрузка доп. свойств
        let getDocsProps = async () => {
            //Считываема доп. свойства по типу события
            const data = await executeStored({
                stored: "PKG_P8PANELS_CLNTTSKBRD.CLNEVENTS_PROPS_GET",
                args: { SEVNTYPE_CODE: taskType },
                isArray: name => name === "XPROPS",
                respArg: "COUT"
            });
            //Устанавливаем доп. свойства
            setDocsProps({ loaded: true, props: [...(data?.XPROPS || [])] });
        };
        //Если доп. свойства не загружены
        if (!docProps.loaded) {
            //Загружаем доп. свойства
            getDocsProps();
        }
    }, [docProps.loaded, executeStored, taskType]);

    return [docProps];
};

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

export { useClientEvent, useDocsProps };
