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

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

import React, { useState, useContext, useEffect } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { Box } from "@mui/material"; //Интерфейсные элементы
import { BackEndCtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
import { useConfSectionMarks } from "../hooks"; //Кастомные хуки
import { ActionMessage } from "./action_message"; //Сообщение с действиями
import { Marks } from "./marks"; //Показатели раздела

//---------
//Константы
//---------

//Стили
const STYLES = {
    CONTAINER: { width: "100%", height: "100%" },
    BOX_MARKS: { position: "relative", display: "flex", height: "100%", width: "100%" }
};

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

//Раздел настройки
const Section = ({ section = null }) => {
    //Состояние сортировки строк и граф
    const [order, setOrder] = useState({ rowOrder: 0, columnOrder: 0 });

    //Состояние - флаг "сокрытия" (на самом деле - отмонтирования) компонента с показателями
    const [hideMarksThenLoading, setHideMarksThenLoading] = useState(false);

    //Данные раздела (показатели)
    const [marks, refreshMarks, marksLoading, marksInit] = useConfSectionMarks(section, order.rowOrder, order.columnOrder);

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

    //Добавление показателя
    const insertMark = async ({ code, name, row, rowCode, rowVersion, column, columnCode, columnVersion }, cb) => {
        try {
            await executeStored({
                stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTNMRK_INSERT",
                args: {
                    NPRN: section,
                    SCODE: code,
                    SNAME: name,
                    NRRPROW: row,
                    SRRPROW: rowCode,
                    SRRPVERSION_ROW: rowVersion,
                    NRRPCOLUMN: column,
                    SRRPCOLUMN: columnCode,
                    SRRPVERSION_COLUMN: columnVersion
                },
                loader: false
            });
            cb && cb(true);
            refreshMarks();
        } catch {
            cb && cb(false);
        }
    };

    //Исправление показателя
    const updateMark = async ({ rn, code, name, rowCode, rowVersion, columnCode, columnVersion }, cb) => {
        try {
            await executeStored({
                stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTNMRK_UPDATE",
                args: {
                    NRN: rn,
                    SCODE: code,
                    SNAME: name,
                    SRRPROW: rowCode,
                    SRRPVERSION_ROW: rowVersion,
                    SRRPCOLUMN: columnCode,
                    SRRPVERSION_COLUMN: columnVersion
                },
                loader: false
            });
            cb && cb(true);
            refreshMarks();
        } catch {
            cb && cb(false);
        }
    };

    //Удаление показателя
    const deleteMark = async mark => {
        await executeStored({
            stored: "PKG_P8PANELS_RRPCONFED.RRPCONFSCTNMRK_DELETE",
            args: { NRN: mark },
            loader: false
        });
        refreshMarks();
    };

    //Изменение сортировки
    const changeOrder = order => setOrder(order);

    //Сброс ранее выставленного флага "сокрытия" (отмонтирования) компонента с показателями (так он не "мигает", когда происходит не смена раздела, в работа внутри него с показателями)
    useEffect(() => {
        if (hideMarksThenLoading) setHideMarksThenLoading(false);
    }, [hideMarksThenLoading]);

    //При смене раздела - выставим флаг "спрятать" (отмонтировать) компонент с показателями (так он корректно полностью обновляется)
    useEffect(() => {
        if (section) setHideMarksThenLoading(true);
    }, [section]);

    //Формирование представления
    return (
        <Box sx={STYLES.CONTAINER}>
            {section ? (
                <Box sx={STYLES.BOX_MARKS}>
                    {((hideMarksThenLoading && !marksLoading) || !hideMarksThenLoading) && (
                        <Marks
                            marks={marks}
                            order={order}
                            marksLoading={marksLoading}
                            marksInit={marksInit}
                            onRefresh={refreshMarks}
                            onMarkInsert={insertMark}
                            onMarkUpdate={updateMark}
                            onMarkDelete={deleteMark}
                            onOrderChange={changeOrder}
                        />
                    )}
                </Box>
            ) : (
                <ActionMessage icon={"info"} title={"Раздел настройки не выбран"} desc={"Укажите его, выбрав закладку сверху"} />
            )}
        </Box>
    );
};

//Контроль свойств - Раздел настройки
Section.propTypes = {
    section: PropTypes.number
};

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

export { Section };
