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

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

import React from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { Stack, ListItem, IconButton, Icon, ListItemButton, ListItemText, Typography, ListItemIcon, Chip } from "@mui/material"; //Компоненты UI
import { STYLES as COMMON_STYLES } from "../../../../components/editors/p8p_editors_common"; //Общие ресурсы редаторов
import { DATA_TYPE, DATA_TYPE_ICON } from "../../common"; //Общие ресурсы и константы редактора запросов

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

//Варианты представления
const ARGUMENT_VARIANT = {
    LIST_ITEM: "LIST_ITEM",
    CHIP: "CHIP"
};

//Структура аргумента
const ARGUMENT_SHAPE = PropTypes.shape({
    name: PropTypes.string.isRequired,
    title: PropTypes.string.isRequired,
    dataType: PropTypes.oneOf(Object.values(DATA_TYPE)),
    mandatory: PropTypes.oneOf([0, 1]).isRequired
});

//Иконки
const ICONS = { ...DATA_TYPE_ICON, DEFAULT: "category" };

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

//Аргумент запроса
const Argument = ({ arg, variant, onClick = null, onDelete = null }) => {
    //Заголовок аргумента
    const title = `${arg.mandatory == 1 ? "*" : ""}${arg.title}`;

    //Иконка аргумента
    const icon = ICONS[arg.dataType] || ICONS.DEFAULT;

    //Формирование представления
    return variant == ARGUMENT_VARIANT.LIST_ITEM ? (
        <ListItem disablePadding>
            <ListItemButton onClick={() => onClick && onClick(arg)} dense>
                <ListItemIcon>
                    <Icon>{icon}</Icon>
                </ListItemIcon>
                <ListItemText
                    primary={title}
                    secondaryTypographyProps={{ component: "div" }}
                    secondary={
                        <Stack direction={"column"}>
                            <Typography variant={"caption"}>{arg.name}</Typography>
                        </Stack>
                    }
                />
                <Stack direction={"row"}>
                    <IconButton onClick={e => onDelete && onDelete(e, arg)} title={"Удалить"}>
                        <Icon>delete</Icon>
                    </IconButton>
                </Stack>
            </ListItemButton>
        </ListItem>
    ) : variant == ARGUMENT_VARIANT.CHIP ? (
        <Chip icon={<Icon>{icon}</Icon>} label={title} variant={"outlined"} sx={COMMON_STYLES.CHIP(true)} />
    ) : null;
};

//Контроль свойств компонента - Аргумент запроса
Argument.propTypes = {
    arg: ARGUMENT_SHAPE,
    variant: PropTypes.oneOf(Object.values(ARGUMENT_VARIANT)).isRequired,
    onClick: PropTypes.func,
    onDelete: PropTypes.func
};

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

export { Argument, ARGUMENT_VARIANT, ARGUMENT_SHAPE };
