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

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

import React, { useState } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { Card, CardActionArea, CardContent, Stack, Chip, Icon, Button } from "@mui/material"; //Интерфейсные элементы
import { BUTTONS } from "../../../../../app.text"; //Общие текстовые ресурсы
import { STYLES as COMMON_STYLES } from "../../../../components/editors/p8p_editors_common"; //Общие ресурсы редаторов
import { useQueryConditions } from "./hooks"; //Хуки для работы с условиями отбора
import { QueryCondDialog } from "./query_cond_dialog"; //Диалог настройки условий отбора
import { ENTITY_SHAPE } from "../entity/entity"; //Описание сущности
import { ARGUMENT_SHAPE } from "../argument/argument"; //Описание аргумента запроса

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

//Общий стиль многострочного компонента "Chip"
const COMMON_MULTILINE_CHIP = COMMON_STYLES.CHIP(true, true);

//Стили
const STYLES = {
    COND_CHIP: {
        ...COMMON_MULTILINE_CHIP,
        "& .MuiChip-label": {
            ...COMMON_MULTILINE_CHIP["& .MuiChip-label"],
            paddingTop: "5px",
            paddingBottom: "5px"
        }
    }
};

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

//Компонент инспектора - Условия отбора запроса
const InspectorQueryConditions = ({ query, cond, entities = [], args = [], onOptionsChanged }) => {
    //Собственное состояние - отображение диалога настройки условий отбора
    const [openQueryCondDialog, setOpenQueryCondDialog] = useState(false);

    //Работа со связями на сервере
    const { setCond } = useQueryConditions(query);

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

    //При нажатии на кнопку настройки условий отбора
    const handleSetup = () => setOpenQueryCondDialog(true);

    //При закрытии диалога изменений условий отбора по "ОК"
    const handleQueryCondDialogOk = async cond => {
        await setCond(cond);
        notifyOptionsChanged();
        setOpenQueryCondDialog(false);
    };

    //При закрытии диалога изменений условий отбора по "Отмена"
    const handleQueryCondDialogCancel = () => setOpenQueryCondDialog(false);

    //Расчет флага сконфигурированности
    const configured = cond ? true : false;

    //Формирование представления
    return (
        <>
            {openQueryCondDialog && (
                <QueryCondDialog cond={cond} entities={entities} args={args} onOk={handleQueryCondDialogOk} onCancel={handleQueryCondDialogCancel} />
            )}
            {configured && (
                <Card variant={"outlined"}>
                    <CardActionArea onClick={handleSetup}>
                        <CardContent>
                            <Stack direction={"column"} spacing={1}>
                                <Chip sx={STYLES.COND_CHIP} label={cond} />
                            </Stack>
                        </CardContent>
                    </CardActionArea>
                </Card>
            )}
            {!configured && (
                <Button startIcon={<Icon>build</Icon>} onClick={handleSetup}>
                    {BUTTONS.CONFIG}
                </Button>
            )}
        </>
    );
};

//Контроль свойств компонента - Компонент инспектора - Условия отбора запроса
InspectorQueryConditions.propTypes = {
    query: PropTypes.number.isRequired,
    cond: PropTypes.string,
    entities: PropTypes.arrayOf(ENTITY_SHAPE),
    args: PropTypes.arrayOf(ARGUMENT_SHAPE),
    onOptionsChanged: PropTypes.func
};

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

export { InspectorQueryConditions };
