/*
    Парус 8 - Панели мониторинга - Редактор запросов
    Компонент инспектора - Сущности запроса
*/

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

import React, { useContext, useState } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { Icon, Button } from "@mui/material"; //Интерфейсные элементы
import { MessagingCtx } from "../../../../context/messaging"; //Контекст сообщений приложения
import { P8PEditorSubHeader } from "../../../../components/editors/p8p_editor_sub_header"; //Подзаголовок группы параметров редактора
import { BUTTONS } from "../../../../../app.text"; //Общие текстовые ресурсы
import { ENTITY_SHAPE } from "../entity/entity"; //Описание сущности
import { EntityAddDialog } from "./entity_add_dialog"; //Диалог добавления сущности
import { EntityAttrsDialog } from "./entity_attrs_dialog"; //Диалог настройки атрибутов сущности
import { useQueryEntities } from "./hooks"; //Хуки для работы с сущностями на сервере

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

//Компонент инспектора - Сущности запроса
const InspectorQueryEntities = ({ query, entity, onOptionsChanged }) => {
    //Отображение диалога добавления сущности
    const [openEntityAddDialog, setOpenEntityAddDialog] = useState(false);

    //Отображение диалога настройки атрибутов сущности
    const [openEntityAttrsDialog, setOpenEntityAttrsDialog] = useState(false);

    //Работа с сущностями на сервере
    const { addEnt, removeEnt } = useQueryEntities(query);

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

    //Уведомление родителя об изменении свойств
    const notifyOptionsChanged = () => onOptionsChanged && onOptionsChanged();

    //При нажатии на кнопку добавлении сущности в запрос
    const handleEntityAddClick = () => setOpenEntityAddDialog(true);

    //При нажатии на кнопку настройки атрибутов сущности
    const handleEntityAttrsClick = () => setOpenEntityAttrsDialog(true);

    //При нажатии на кнопку даления сущности из запроса
    const handleEntityRemoveClick = () =>
        showMsgWarn(`Удалить сущность "${entity.title}"?`, async () => {
            if (entity?.id) {
                await removeEnt(entity.id);
                notifyOptionsChanged();
            }
        });

    //Закрытие диалога добавления сущности по "Закрыть"
    const handleEntityAddDialogClose = () => setOpenEntityAddDialog(false);

    //Закрытие диалога добавления сущности по выбору сущности из списка
    const handleEntityAddDialogSelect = async ent => {
        await addEnt(ent.name, ent.type);
        setOpenEntityAddDialog(false);
        notifyOptionsChanged();
    };

    //Закрытие диалога настройки атрибутов сущности по "Отмена"
    const handleEntityAttrsDialogCancel = () => setOpenEntityAttrsDialog(false);

    //Закрытие диалога настройки атрибутов сущности по "ОК"
    const handleEntityAttrsDialogOk = () => {
        notifyOptionsChanged();
        setOpenEntityAttrsDialog();
    };

    //Формирование представления
    return (
        <>
            {openEntityAddDialog && <EntityAddDialog onSelect={handleEntityAddDialogSelect} onClose={handleEntityAddDialogClose} />}
            {openEntityAttrsDialog && (
                <EntityAttrsDialog query={query} {...entity} onOk={handleEntityAttrsDialogOk} onCancel={handleEntityAttrsDialogCancel} />
            )}
            <Button startIcon={<Icon>add</Icon>} onClick={handleEntityAddClick}>
                {BUTTONS.INSERT}
            </Button>
            {entity && (
                <>
                    <P8PEditorSubHeader title={entity.title} maxWidth={"200px"} />
                    <Button startIcon={<Icon>edit_attributes</Icon>} onClick={handleEntityAttrsClick}>
                        Атрибуты
                    </Button>
                    <Button startIcon={<Icon>delete</Icon>} onClick={handleEntityRemoveClick}>
                        {BUTTONS.DELETE}
                    </Button>
                </>
            )}
        </>
    );
};

//Контроль свойств компонента - Компонент инспектора - Сущности запроса
InspectorQueryEntities.propTypes = {
    query: PropTypes.number.isRequired,
    entity: ENTITY_SHAPE,
    onOptionsChanged: PropTypes.func
};

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

export { InspectorQueryEntities };
