/*
    Парус 8 - Панели мониторинга
    Компонент: Индикатор
*/
//---------------------
//Подключение библиотек
//---------------------
import React, { useState } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { IconButton, Icon, Typography, Paper, Stack } from "@mui/material"; //Интерфейсные компоненты MUI
import { P8PHintDialog } from "./p8p_app_message"; //Диалог подсказки
import { TEXTS, STATE } from "../../app.text"; //Типовые текстовые ресурсы и константы
import { APP_COLORS } from "../../app.styles"; //Типовые стили
//---------
//Константы
//---------
//Варианты исполнения
const P8P_INDICATOR_VARIANT = {
    ELEVATION: "elevation",
    OUTLINED: "outlined"
};
//Состояния
const P8P_INDICATOR_STATE = {
    UNDEFINED: STATE.UNDEFINED,
    OK: STATE.OK,
    WARN: STATE.WARN,
    ERR: STATE.ERR
};
//Цвета заливки
const BG_COLOR = {
    [STATE.OK]: APP_COLORS[STATE.OK].color,
    [STATE.ERR]: APP_COLORS[STATE.ERR].color,
    [STATE.WARN]: APP_COLORS[STATE.WARN].color
};
//Цвета текста и иконок
const COLOR = {
    [STATE.OK]: APP_COLORS[STATE.OK].contrColor,
    [STATE.ERR]: APP_COLORS[STATE.ERR].contrColor,
    [STATE.WARN]: APP_COLORS[STATE.WARN].contrColor
};
//Стили
const STYLES = {
    CONTAINER: (state, clickable, userColor, userBackgroundColor) => ({
        padding: "10px",
        width: "100%",
        height: "100%",
        overflow: "hidden",
        ...getBackgroundColor(state, userBackgroundColor),
        ...getColor(state, userColor),
        display: "flex",
        flexDirection: "column",
        justifyContent: "center",
        ...(clickable
            ? {
                  cursor: "pointer",
                  "&:hover": { backgroundColor: APP_COLORS.HOVER.color },
                  "&:active": { backgroundColor: APP_COLORS.ACTIVE.color }
              }
            : {})
    }),
    ICON: (state, userColor) => ({ fontSize: "50px", ...getColor(state, userColor) }),
    HINT_ICON: (state, userColor) => ({ fontSize: "1rem", ...getColor(state, userColor) }),
    VALUE_CAPTION_STACK: { containerType: "inline-size", width: "100%", overflow: "hidden" },
    CAPTION_TYPOGRAPHY: { width: "99cqw" }
};
//-----------------------
//Вспомогательные функции
//-----------------------
//Подбор цвета заливки
const getBackgroundColor = (state, userColor) =>
    userColor ? { backgroundColor: userColor } : BG_COLOR[state] ? { backgroundColor: BG_COLOR[state] } : {};
//Подбор цвета текста
const getColor = (state, userColor) => (userColor ? { color: userColor } : COLOR[state] ? { color: COLOR[state] } : {});
//-----------
//Тело модуля
//-----------
//Индикатор
const P8PIndicator = ({
    caption,
    value,
    icon = null,
    state = STATE.UNDEFINED,
    square = false,
    elevation = 3,
    variant = P8P_INDICATOR_VARIANT.ELEVATION,
    hint = null,
    onClick = null,
    backgroundColor = null,
    color = null
} = {}) => {
    //Собственное состояние - отображение окна подсказки
    const [showHint, setShowHint] = useState(false);
    //При нажатии на индикатор
    const handleClick = () => (onClick && !showHint ? onClick() : null);
    //При нажатии на кнопку получения подсказки
    const handleHintClick = e => {
        setShowHint(true);
        e.stopPropagation();
    };
    //При нажатии на кнопку закрытия подсказки
    const handleHintClose = () => setShowHint(false);
    //Представление текста значения индикатора
    const valueTextView = {[undefined, null, ""].includes(value) ? TEXTS.NO_DATA_FOUND_SHORT : value};
    //Представление текста подписи индикатора
    const captionView = (
        
            {caption}
        
    );
    //Представление подписи индикатора
    const valueView = hint ? (
        <>
            {showHint && }
            
                {valueTextView}
                
                    help_outline
                
            
        >
    ) : (
        valueTextView
    );
    //Флаг активности индикатора
    const clickable = onClick ? true : false;
    //Представление
    return (
        
            
                
                    {valueView}
                    {captionView}
                
                {icon ? {icon} : null}
            
        
    );
};
//Контроль свойств - Индикатор
P8PIndicator.propTypes = {
    caption: PropTypes.string.isRequired,
    value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
    icon: PropTypes.string,
    state: PropTypes.oneOf(Object.values(P8P_INDICATOR_STATE)),
    square: PropTypes.bool,
    elevation: PropTypes.number,
    variant: PropTypes.oneOf(Object.values(P8P_INDICATOR_VARIANT)),
    hint: PropTypes.string,
    onClick: PropTypes.func,
    backgroundColor: PropTypes.string,
    color: PropTypes.string
};
//----------------
//Интерфейс модуля
//----------------
export { P8P_INDICATOR_VARIANT, P8P_INDICATOR_STATE, P8PIndicator };