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

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

import React, { useState, useContext } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { 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 { useQueries } from "./hooks"; //Хуки для работы с запросами
import { QueriesList } from "./queries_list"; //Список запросов
import { QueryIUDialog } from "./query_iu_dialog"; //Диалог добавления/исправления запроса

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

//Менеджер запросов
const QueriesManager = ({ current = null, onQuerySelect = null, onCancel = null } = {}) => {
    //Собственное состояние - изменяемый запрос
    const [modQuery, setModQuery] = useState(null);

    //Работа со списком запросов
    const [queries, insertQuery, updateQuery, deleteQuery, setQueryReady, setQueryPbl] = useQueries();

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

    //При добавлении запроса
    const handleQueryAdd = () => setModQuery(true);

    //При выборе запроса
    const handleQuerySelect = query => onQuerySelect && onQuerySelect({ ...query });

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

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

    //При исправлении запроса
    const handleQueryEdit = query => setModQuery({ ...query });

    //При удалении запроса
    const handleQueryDelete = query => showMsgWarn("Удалить запрос?", () => deleteQuery(query.rn));

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

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

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

    //Формирование представления
    return (
        <P8PConfigDialog title={"Запросы"} onCancel={handleCancel}>
            {modQuery && (
                <QueryIUDialog
                    code={modQuery?.code}
                    name={modQuery?.name}
                    insert={modQuery === true}
                    onOk={handleIUDialogOk}
                    onCancel={handleIUDialogCancel}
                />
            )}
            <Button startIcon={<Icon>add</Icon>} onClick={handleQueryAdd}>
                {BUTTONS.INSERT}
            </Button>
            <QueriesList
                queries={queries || []}
                current={current}
                onSelect={handleQuerySelect}
                onPbl={handleQueryPblSet}
                onReady={handleQueryReadySet}
                onEdit={handleQueryEdit}
                onDelete={handleQueryDelete}
            />
        </P8PConfigDialog>
    );
};

//Контроль свойств компонента - Менеджер запросов
QueriesManager.propTypes = {
    current: PropTypes.number,
    onQuerySelect: PropTypes.func,
    onCancel: PropTypes.func
};

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

export { QueriesManager };
