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

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

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

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

//Стили
const STYLES = {
    CONTAINER_UNIT: { display: "flex", flexDirection: "column", gap: "10px" }
};

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

//Редактор действия "Открыть раздел"
const P8PCAUnitOpenOptions = ({ unit, valueTypes, isValues, onStateChange, onValueSourceMenuClick }) => {
    //Подключение к контексту приложения
    const { pOnlineShowDictionary } = useContext(ApplicationCtx);

    //При изменении параметра открытия
    const handleModalChange = () => onStateChange({ modal: !unit.modal });

    //При нажатии на очистку раздела
    const handleClearUnitClick = () =>
        onStateChange({
            unitCode: "",
            unitName: "",
            showMethod: ""
        });

    //При нажатии на выбор раздела
    const handleSelectUnitClick = () => {
        pOnlineShowDictionary({
            unitCode: "Units",
            showMethod: "methods",
            inputParameters: [
                { name: "pos_unit_name", value: unit.unitName },
                { name: "pos_method_name", value: unit.showMethodName }
            ],
            callBack: res =>
                res.success &&
                onStateChange({
                    unitCode: res.outParameters.unit_code,
                    unitName: res.outParameters.unit_name,
                    showMethod: res.outParameters.method_code,
                    showMethodName: res.outParameters.method_name
                })
        });
    };

    //При добавлении связи входного параметра
    const handleInputParameAdd = () => {
        onStateChange({
            inputParams: [...unit.inputParams, { ...P8P_CA_INPUT_PARAM_INITIAL }]
        });
    };

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

    //При очистке входного параметра
    const handleClearInputParameterClick = index => {
        //Копируем связываемые переменные
        let newInputParams = [...unit.inputParams];
        //Очищаем значение по индексу
        newInputParams[index]["parameter"] = "";
        newInputParams[index]["inputParameter"] = "";
        //Устанавливаем новый массив
        onStateChange({ inputParams: [...newInputParams] });
    };

    //При нажатии на выбор параметра метода вызова
    const handleSelectUnitParameterClick = index => {
        unit.unitCode &&
            unit.showMethod &&
            pOnlineShowDictionary({
                unitCode: "UnitParams",
                showMethod: "main",
                inputParameters: [
                    { name: "in_UNITCODE", value: unit.unitCode },
                    { name: "in_PARENT_METHOD_CODE", value: unit.showMethod },
                    { name: "in_PARAMNAME", value: unit.inputParams[index].parameter }
                ],
                callBack: res => {
                    if (res.success) {
                        //Копируем связываемые переменные
                        let newInputParams = [...unit.inputParams];
                        //Очищаем значение по индексу
                        newInputParams[index]["parameter"] = res.outParameters.out_PARAMNAME;
                        newInputParams[index]["inputParameter"] = res.outParameters.out_IN_CODE;
                        //Устанавливаем новый массив
                        onStateChange({ inputParams: [...newInputParams] });
                    }
                }
            });
    };

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

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

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

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

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

    //Рендер отображения колонки свойства
    const handlePropertyCellRender = (item, index) => {
        //Значение первой колонки
        return (
            <TextField
                id={`parameter_${index}`}
                InputLabelProps={{ shrink: true }}
                type={"text"}
                variant={"standard"}
                value={item.parameter}
                name={"parameter"}
                fullWidth
                InputProps={{
                    readOnly: true,
                    endAdornment: (
                        <InputAdornment position="end">
                            <IconButton onClick={() => handleClearInputParameterClick(index)}>
                                <Icon>clear</Icon>
                            </IconButton>
                            <IconButton onClick={() => handleSelectUnitParameterClick(index)} disabled={!unit.showMethodName}>
                                <Icon>list</Icon>
                            </IconButton>
                        </InputAdornment>
                    )
                }}
            />
        );
    };

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

    //Формирование представления
    return (
        <Box sx={STYLES.CONTAINER_UNIT}>
            <TextField
                type={"text"}
                variant={"standard"}
                value={unit.unitName}
                label={"Раздел"}
                InputLabelProps={{ shrink: unit.unitName ? true : false }}
                InputProps={{
                    readOnly: true,
                    endAdornment: (
                        <InputAdornment position="end">
                            <IconButton onClick={handleClearUnitClick}>
                                <Icon>clear</Icon>
                            </IconButton>
                            <IconButton onClick={handleSelectUnitClick}>
                                <Icon>list</Icon>
                            </IconButton>
                        </InputAdornment>
                    )
                }}
                required={true}
            />
            <TextField
                type={"text"}
                variant={"standard"}
                value={unit.showMethodName}
                label={"Метод вызова"}
                InputLabelProps={{ shrink: unit.showMethodName ? true : false }}
                InputProps={{
                    readOnly: true
                }}
                required={true}
            />
            <P8PCATablePropValues
                name={"Входные параметры"}
                items={unit.inputParams}
                propertyCellName={"Входной параметр"}
                valueCellName={"Значение"}
                onPropertyCellRender={(item, index) => handlePropertyCellRender(item, index)}
                onValueCellRender={(item, index) => handleValueCellRender(item, index)}
                onAddRow={handleInputParameAdd}
                onRowDelete={index => handleInputParamDelete(index)}
            />
            <FormControlLabel control={<Checkbox checked={unit.modal} onChange={handleModalChange} />} label="Открывать модально" />
        </Box>
    );
};

//Контроль свойств - редактор действия "Открыть раздел"
P8PCAUnitOpenOptions.propTypes = {
    unit: P8P_CA_OPEN_UNIT_PARAMS_SHAPE,
    valueTypes: PropTypes.array,
    isValues: PropTypes.bool.isRequired,
    onStateChange: PropTypes.func.isRequired,
    onValueSourceMenuClick: PropTypes.func.isRequired
};

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

export { P8PCAUnitOpenOptions };
