/*
    Парус 8 - Панели мониторинга - Редактор панелей
    Компонент: Менеджер панелей
*/

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

import React, { useState, useContext } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { Box, Button, Icon } from "@mui/material"; //Интерфейсные компоненты MUI
import { MessagingCtx } from "../../../../context/messaging"; //Контекст сообщений
import { BUTTONS } from "../../../../../app.text"; //Общие текстовые ресурсы приложения
import { P8PConfigDialog } from "../../../../components/editors/p8p_config_dialog"; //Типовой диалог настройки
import { usePanelManager } from "../components_hooks"; //Пользовательские хуки
import { PanelsList } from "./panels_list"; //Список панелей
import { PanelIUDialog } from "./panel_iu_dialog"; //Диалог добавления/исправления панели
import { ImportPanelButton } from "../../layouts"; //Дополнительная разметка и вёрстка клиентских элементов

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

//Менеджер панелей
const PanelsManager = ({ current = null, isEditable = true, onPanelSelect = null, onCancel = null } = {}) => {
    //Собственное состояние - изменяемая панель
    const [modPanel, setModPanel] = useState(null);

    //Работа со списком панелей
    const [panels, insertPanel, updatePanel, deletePanel, setPanelReady, setPanelPbl, importPanel] = usePanelManager();

    //Подключение к контексту сообщений
    const { showMsgWarn } = useContext(MessagingCtx);

    //При добавлении панели
    const handlePanelAdd = () => setModPanel(true);

    //При загрузке панели из файла
    const handlePanelImport = fileData => {
        importPanel(fileData);
    };

    //При выборе панели
    const handlePanelSelect = panel => onPanelSelect && onPanelSelect(panel);

    //При установке признака публичности
    const handlePanelPblSet = panel => setPanelPbl(panel.rn, panel.pbl === 1 ? 0 : 1);

    //При установке признака готовности
    const handlePanelReadySet = panel => setPanelReady(panel.rn, panel.ready === 1 ? 0 : 1);

    //При исправлении панели
    const handlePanelEdit = panel => setModPanel({ ...panel });

    //При удалении панели
    const handlePanelDelete = panel => showMsgWarn("Удалить панель?", () => deletePanel(panel.rn));

    //При закрытии диалога добавления/исправления по "ОК"
    const handleIUDialogOk = async values => {
        if (modPanel === true) await insertPanel(values.code, values.name);
        else await updatePanel(modPanel.rn, values.code, values.name);
        setModPanel(null);
    };

    //При закрытии диалога добавления/исправления по "Отмена"
    const handleIUDialogCancel = () => setModPanel(null);

    //При закрытии менеджера отменой
    const handleCancel = () => onCancel && onCancel();

    //Формирование представления
    return (
        <P8PConfigDialog title={"Панели"} onCancel={handleCancel}>
            {modPanel && (
                <PanelIUDialog
                    code={modPanel?.code}
                    name={modPanel?.name}
                    insert={modPanel === true}
                    onOk={handleIUDialogOk}
                    onCancel={handleIUDialogCancel}
                />
            )}
            {isEditable ? (
                <Box sx={{ display: "flex", justifyContent: "space-between" }}>
                    <Button startIcon={<Icon>add</Icon>} onClick={handlePanelAdd}>
                        {BUTTONS.INSERT}
                    </Button>
                    <ImportPanelButton id={"input-file-loader-manager"} startIcon={"file_upload"} title={"Загрузить"} onClick={handlePanelImport} />
                </Box>
            ) : null}
            <PanelsList
                panels={panels || []}
                current={current}
                isEditable={isEditable}
                onSelect={handlePanelSelect}
                onPbl={handlePanelPblSet}
                onReady={handlePanelReadySet}
                onEdit={handlePanelEdit}
                onDelete={handlePanelDelete}
            />
        </P8PConfigDialog>
    );
};

//Контроль свойств компонента - Менеджер панелей
PanelsManager.propTypes = {
    current: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
    isEditable: PropTypes.bool,
    onPanelSelect: PropTypes.func,
    onCancel: PropTypes.func
};

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

export { PanelsManager };
