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

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

import React from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { Paper } from "@mui/material"; //Интерфейсные элементы
import { P8PIndicator } from "../../../../components/p8p_indicator"; //Компонент индикатора
import { useDataSource, useConditions, useComponentHandlers } from "../../../../components/editors/p8p_data_source_hooks"; //Хуки для данных
import { P8P_DATA_SOURCE_SHAPE } from "../../../../components/editors/p8p_data_source_common"; //Общие ресурсы источника данных
import {
    P8P_COMPONENT_INLINE_MESSAGE_TYPE,
    P8P_COMPONENT_INLINE_MESSAGE,
    P8PComponentInlineMessage
} from "../../../../components/editors/p8p_component_inline_message"; //Информационное сообщение внутри компонента
import { P8P_CC_SHAPE } from "../../../../components/editors/p8p_component_condition/common"; //Общие ресурсы условий
import { P8P_CA_SHAPE } from "../../../../components/editors/p8p_component_action/common"; //Общие ресурсы действий
import { P8P_COMPONENT_SETTINGS_RESP_ARGS } from "../../../../components/editors/p8p_component_settings"; //Дополнительный функционал источников данных
import { getIndicatorHandlers } from "./action"; //Общие ресурсы действий индикатора

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

//Иконка компонента
const COMPONENT_ICON = "speed";

//Наименование компонента
const COMPONENT_NAME = "Индикатор";

//Стили
const STYLES = {
    CONTAINER: clickable => ({
        height: "100%",
        ...(clickable
            ? {
                  cursor: "pointer"
              }
            : {})
    })
};

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

//Индикатор (представление)
const Indicator = ({ dataSource = null, values = {}, conditions = [], actions = [], onValuesChange = null }) => {
    //Собственное состояние - данные
    const [indicator, error, haveConfing, haveData] = useDataSource({
        dataSource,
        values,
        componentRespArg: P8P_COMPONENT_SETTINGS_RESP_ARGS.INDICATOR
    });

    //Собственное состояние - данные с учетом условий
    const [indicatorOrigin] = useConditions({ componentData: indicator, conditions });

    //Собственное состояние - обработчики компонента
    const [handlers] = useComponentHandlers({ actions, onValuesChange });

    //Обработчики областей
    const { onComponentClick, onCaptionClick, onValueClick } = getIndicatorHandlers(handlers);

    //Формирование представления
    return (
        <Paper
            {...(haveConfing && haveData
                ? { sx: { ...STYLES.CONTAINER(onComponentClick) } }
                : { className: "component-view__container component-view__container__empty" })}
            elevation={6}
            onClick={event => onComponentClick && onComponentClick({ event, values })}
        >
            {haveConfing && haveData ? (
                <P8PIndicator
                    {...indicatorOrigin}
                    onValueClick={onValueClick ? event => onValueClick({ event, values }) : null}
                    onCaptionClick={onCaptionClick ? event => onCaptionClick({ event, values }) : null}
                    elevation={0}
                />
            ) : (
                <P8PComponentInlineMessage
                    icon={COMPONENT_ICON}
                    name={COMPONENT_NAME}
                    message={!haveConfing ? P8P_COMPONENT_INLINE_MESSAGE.NO_SETTINGS : error ? error : P8P_COMPONENT_INLINE_MESSAGE.NO_DATA_FOUND}
                    type={error ? P8P_COMPONENT_INLINE_MESSAGE_TYPE.ERROR : P8P_COMPONENT_INLINE_MESSAGE_TYPE.COMMON}
                />
            )}
        </Paper>
    );
};

//Контроль свойств компонента - Индикатор (представление)
Indicator.propTypes = {
    dataSource: P8P_DATA_SOURCE_SHAPE,
    values: PropTypes.object,
    conditions: PropTypes.arrayOf(P8P_CC_SHAPE),
    actions: PropTypes.arrayOf(P8P_CA_SHAPE),
    onValuesChange: PropTypes.func
};

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

export default Indicator;
