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

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

import React, { useState } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { Stack, IconButton, Icon, Typography, Button, Card, CardContent, CardActions, CardActionArea } from "@mui/material"; //Интерфейсные элементы
import { BUTTONS, TEXTS } from "../../../app.text"; //Общие текстовые ресурсы
import { P8P_DATA_SOURCE_SHAPE, P8P_DATA_SOURCE_TYPE, P8P_DATA_SOURCE_TYPE_NAME, P8P_DATA_SOURCE_INITIAL } from "./p8p_data_source_common"; //Общие ресурсы компонента "Источник данных"
import { P8PDataSourceConfigDialog } from "./p8p_data_source_config_dialog"; //Диалог настройки источника данных
import { P8PChipList } from "./p8p_chip_list"; //Дополнительные настройки редактора

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

//Источник данных
const P8PDataSource = ({ dataSource = null, valueProviders = {}, onChange = null } = {}) => {
    //Собственное состояние - отображение диалога настройки
    const [configDlg, setConfigDlg] = useState(false);

    //Уведомление родителя о смене настроек источника данных
    const notifyChange = settings => onChange && onChange(settings);

    //При нажатии на настройку источника данных
    const handleSetup = () => setConfigDlg(true);

    //При нажатии на настройку источника данных
    const handleSetupOk = dataSource => {
        setConfigDlg(false);
        notifyChange(dataSource);
    };

    //При нажатии на настройку источника данных
    const handleSetupCancel = () => setConfigDlg(false);

    //При удалении настроек источника данных
    const handleDelete = () => notifyChange({ ...P8P_DATA_SOURCE_INITIAL });

    //Расчет флага "настроенности"
    const configured = dataSource?.type ? true : false;

    //Структура параметров для отображения
    const argChips =
        configured && dataSource.arguments.map(argument => ({ text: `:${argument.name} = ${argument.valueSource || argument.value || "NULL"}` }));

    //Формирование представления
    return (
        <>
            {configDlg && (
                <P8PDataSourceConfigDialog
                    dataSource={dataSource}
                    valueProviders={valueProviders}
                    onOk={handleSetupOk}
                    onCancel={handleSetupCancel}
                />
            )}
            {configured && (
                <Card variant={"outlined"}>
                    <CardActionArea onClick={handleSetup}>
                        <CardContent>
                            <Typography variant={"subtitle1"} noWrap={true}>
                                {dataSource.type === P8P_DATA_SOURCE_TYPE.USER_PROC ? dataSource.userProc : TEXTS.UNNAMED_SOURCE}
                            </Typography>
                            <Typography variant={"caption"} color={"text.secondary"} noWrap={true}>
                                {P8P_DATA_SOURCE_TYPE_NAME[dataSource.type] || TEXTS.UNKNOWN_SOURCE_TYPE}
                            </Typography>
                            <Stack direction={"column"} spacing={1} pt={2}>
                                <P8PChipList items={argChips} />
                            </Stack>
                        </CardContent>
                    </CardActionArea>
                    <CardActions>
                        <IconButton onClick={handleDelete}>
                            <Icon>delete</Icon>
                        </IconButton>
                    </CardActions>
                </Card>
            )}
            {!configured && (
                <Button startIcon={<Icon>build</Icon>} onClick={handleSetup}>
                    {BUTTONS.CONFIG}
                </Button>
            )}
        </>
    );
};

//Контроль свойств компонента - Источник данных
P8PDataSource.propTypes = {
    dataSource: P8P_DATA_SOURCE_SHAPE,
    valueProviders: PropTypes.object,
    onChange: PropTypes.func
};

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

export { P8PDataSource };
