/*
    Парус 8 - Панели мониторинга - Редакторы панелей
    Компонент: Редактор действия "Установить переменную"
*/

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

import React from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import { TextField, InputAdornment, IconButton, Icon } from "@mui/material"; //Интерфейсные элементы
import { P8P_CA_VARIABLE_LINK_INITIAL, P8P_CA_VARIABLE_LINK_SHAPE, P8P_CA_DEF_TYPE_VALUE } from "./common"; //Общие ресурсы действий
import { P8PCAFieldWithType } from "./field_with_type"; //Поле с выбором типа значения
import { P8PCATablePropValues } from "./table_prop_values"; //Таблица значений свойств действия

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

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

//Редактор действия "Установить переменную"
const P8PCAVarSetOptions = ({ variables, valueTypes, isValues, onStateChange, onValueSourceMenuClick }) => {
    //При добавлении связи переменной
    const handleVariableAdd = () => {
        onStateChange([...variables, { ...P8P_CA_VARIABLE_LINK_INITIAL }]);
    };

    //При удалении связи переменной
    const handleVariableDelete = index => {
        //Копируем связываемые переменные
        let newVariables = [...variables];
        //Удаляем по индексу
        newVariables.splice(index, 1);
        //Устанавливаем новый массив
        onStateChange([...newVariables]);
    };

    //При очистке значения переменной
    const handleClearVariableClick = index => {
        //Копируем текущее состояние связываемых переменных
        let newParams = [...variables];
        //Очищаем значения у элемента по индексу
        newParams[index].variableSource = "";
        //Устанавливаем новый массив
        onStateChange([...newParams]);
    };

    //При связывании переменной
    const handleVariablesSourceChange = (valueSource, index) => {
        //Копируем связываемые переменные
        let newVariables = [...variables];
        //Очищаем значение по индексу
        newVariables[index].variableSource = valueSource;
        //Устанавливаем новый массив
        onStateChange([...newVariables]);
    };

    //При изменении типа значения
    const handleResultValueTypeChange = (value, index) => {
        //Копируем связываемые переменные
        let newVariables = [...variables];
        //Очищаем значение по индексу
        newVariables[index].resultValue = { ...newVariables[index].resultValue, type: value, value: "" };
        //Устанавливаем новый массив
        onStateChange([...newVariables]);
    };

    //При очистке значения
    const handleClearResultValueClick = index => {
        //Копируем текущее состояние связываемых переменных
        let newVariables = [...variables];
        //Очищаем значения у элемента по индексу
        newVariables[index].resultValue = { ...newVariables[index].resultValue, value: "" };
        //Устанавливаем новый массив
        onStateChange([...newVariables]);
    };

    //При ручном изменении значения
    const handleResultValueChange = (value, index) => {
        //Копируем связываемые переменные
        let newVariables = [...variables];
        //Очищаем значение по индексу
        newVariables[index].resultValue = { ...newVariables[index].resultValue, value: value };
        //Устанавливаем новый массив
        onStateChange([...newVariables]);
    };

    //При связывании значения
    const handleResultValueSourceChange = (valueSource, index) => {
        //Копируем связываемые переменные
        let newVariables = [...variables];
        //Очищаем значение по индексу
        newVariables[index].resultValue = { ...newVariables[index].resultValue, value: valueSource };
        //Устанавливаем новый массив
        onStateChange([...newVariables]);
    };

    //При нажатии на выбор переменной (значение)
    const handleValueSourceSelect = (e, index) =>
        isValues
            ? onValueSourceMenuClick &&
              onValueSourceMenuClick(e, valueSource => {
                  handleResultValueSourceChange(valueSource, index);
              })
            : null;

    //При нажатии на выбор переменной (переменная)
    const handleVariableSourceSelect = (e, index) =>
        isValues
            ? onValueSourceMenuClick &&
              onValueSourceMenuClick(e, valueSource => {
                  handleVariablesSourceChange(valueSource, index);
              })
            : null;

    //Рендер отображения колонки свойства
    const handlePropertyCellRender = (item, index) => {
        //Формирование представления колонки свойства
        return (
            <TextField
                id={`variableSource_${index}`}
                InputLabelProps={{ shrink: true }}
                type={"text"}
                variant={"standard"}
                value={item.variableSource}
                name={"variableSource"}
                fullWidth
                InputProps={{
                    readOnly: true,
                    endAdornment: (
                        <InputAdornment position="end">
                            <IconButton onClick={() => handleClearVariableClick(index)}>
                                <Icon>clear</Icon>
                            </IconButton>
                            {isValues && (
                                <IconButton onClick={e => handleVariableSourceSelect(e, index)}>
                                    <Icon>settings_ethernet</Icon>
                                </IconButton>
                            )}
                        </InputAdornment>
                    )
                }}
            />
        );
    };

    //Рендер отображения колонки значения
    const handleValueCellRender = (item, index) => {
        //Формирование представления колонки значения
        return (
            <P8PCAFieldWithType
                valueTypes={valueTypes}
                name={`resultValue_${index}`}
                item={item.resultValue}
                isValueReadOnly={item.resultValue.type === P8P_CA_DEF_TYPE_VALUE.VARIABLE}
                onTypeChange={e => handleResultValueTypeChange(e.target.value, index)}
                onValueChange={e => handleResultValueChange(e.target.value, index)}
                endAdornments={[
                    { icon: "clear", onClick: () => handleClearResultValueClick(index), isDisabled: false },
                    {
                        icon: "settings_ethernet",
                        onClick: e => handleValueSourceSelect(e, index),
                        isDisabled: item.resultValue.type !== P8P_CA_DEF_TYPE_VALUE.VARIABLE
                    }
                ]}
            />
        );
    };

    //Формирование представления
    return (
        <P8PCATablePropValues
            name={"Список параметров"}
            items={variables}
            propertyCellName={"Переменная"}
            valueCellName={"Значение"}
            onPropertyCellRender={(item, index) => handlePropertyCellRender(item, index)}
            onValueCellRender={(item, index) => handleValueCellRender(item, index)}
            onAddRow={handleVariableAdd}
            onRowDelete={index => handleVariableDelete(index)}
        />
    );
};

//Контроль свойств - редактор действия "Установить переменную"
P8PCAVarSetOptions.propTypes = {
    variables: PropTypes.arrayOf(P8P_CA_VARIABLE_LINK_SHAPE),
    valueTypes: PropTypes.array,
    isValues: PropTypes.bool.isRequired,
    onStateChange: PropTypes.func.isRequired,
    onValueSourceMenuClick: PropTypes.func.isRequired
};

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

export { P8PCAVarSetOptions };
