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

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

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

//Функции операторов условий
const P8P_CC_OPERATOR_FUNC = {
    equal: (objValue, value) => objValue == value,
    notEqual: (objValue, value) => objValue != value,
    lessEqual: (objValue, value) => objValue <= value,
    less: (objValue, value) => objValue < value,
    greaterEqual: (objValue, value) => objValue >= value,
    greater: (objValue, value) => objValue > value,
    in: (objValue, value) =>
        value
            .split(",")
            .map(item => item.trim())
            .includes(objValue + "")
};

//------------------------------------
//Вспомогательные функции и компоненты
//------------------------------------

//Загрузка условий в объект
const loadConditionsToObject = (obj, conditions) => {
    //Инициализируем новый объект
    let newObj = { ...obj };
    //Инициализируем функцию оператора
    let operatorFunc;
    //Если изначальный индикатор загружен
    if (Object.keys(newObj).length !== 0) {
        //Обходим условия
        conditions.map(item => {
            //Функция оператора
            operatorFunc = P8P_CC_OPERATOR_FUNC[item.condOperator.value];
            //Проверяем условие
            if (operatorFunc && operatorFunc(newObj[item.condField.value], item.condValue)) {
                //Устанавливаем поле в новое значение
                newObj[item.resField.value] = item.resValue;
            }
        });
    }
    //Возвращаем новый объект
    return newObj;
};

//Считывание результатов условия
const getConditionsValues = (obj, conditions, element = "") => {
    //Инициализируем функцию оператора
    let operatorFunc;
    //Инициализируем значение поля
    let condFieldValue = "";
    //Инициализируем результат
    let resObject = {};
    //Обходим условия
    conditions.map(item => {
        //Определяем значение поля условия
        condFieldValue = item.condElement ? obj[item.condElement] : obj[item.condField.value];
        //Функция оператора
        operatorFunc = P8P_CC_OPERATOR_FUNC[item.condOperator.value];
        //Проверяем условие
        if (operatorFunc && operatorFunc(condFieldValue, item.condValue)) {
            //Если в условии нет элемента результата или он равен текущему элементу
            if (!item.resElement || (element && item.resElement === element)) {
                resObject[item.resField.value] = item.resValue;
            }
        }
    });
    //Возвращаем новый объект
    return resObject;
};

//Доступность сохранения настроек условия
const isConditionOkDisabled = condition => (!condition.condField.value || !condition.condOperator.value || !condition.resField.value ? true : false);

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

export { loadConditionsToObject, getConditionsValues, isConditionOkDisabled };
