/*
  Сервис интеграции ПП Парус 8 с WEB API
  Дополнительный модуль: Интеграция с Фреймворка оценки и прогнозирования состояния оборудования
*/

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

const xml2js = require("xml2js"); //Конвертация XML в JSON и JSON в XML
const _ = require("lodash"); //Работа с коллекциями и объектами

//---------------------
// Глобальные константы
//---------------------

// Список тегов которые должны содержать массив
const tag = [
    "ftp_filepath",
    "data_config"    
];

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

//Обернуть содержимое тега в массив
const toArray = (obj, tags) => {
    for (const prop in obj) {
        const value = obj[prop];
        if (tags.indexOf(prop) != -1 && !_.isArray(obj[prop])) {
            obj[prop] = JSON.parse("[" + JSON.stringify(value) + "]");
        }
        if (typeof value === "object") {
            toArray(value, tag);
        }
    }
    return obj;
};

//Конвертация в XML
const toXML = obj => {
    const builder = new xml2js.Builder();
    return builder.buildObject(obj);
};

//Конвертация в JSON
const parseXML = xmlDoc => {
    return new Promise((resolve, reject) => {
        xml2js.parseString(xmlDoc, { explicitArray: false, mergeAttrs: true }, (err, result) => {
            if (err) reject(err);
            else resolve(result);
        });
    });
};

//Конвертация в JSON
const toJSON = async obj => {
    let result = await parseXML(obj);
    result = result.root;
    toArray(result, tag);
    return result;
};

//Обработчик "До" отправки запроса к сервису "СБИС"
const beforeDocParse = async prms => {
    try {
        //Конвертируем XML из "Парус 8" в понятный "СБИСу" JSON
        let obj = await toJSON(prms.queue.blMsg.toString());
        //Собираем и отдаём общий результат работы
        return {
            options: {
                      simple: false,
            },
            blMsg: Buffer.from(JSON.stringify(obj))
        };
    } catch (e) {
        throw Error(e);
    }
};

//Обработчик "После" запроса к сервису "СБИС"
const afterDocParseResp = async prms => {
    //Преобразуем JSON ответ сервиса "СБИС" в XML, понятный "Парус 8"
    let resu = null;
    if (prms.queue.blResp) {
        try {
            resu = toXML(JSON.parse(prms.queue.blResp.toString()));
        } catch (e) {
            throw new Error(`Неожиданный ответ сервера. Ошибка интерпретации: ${e.message}`);
        }
    } else {
        throw new Error('Сервер не вернул ответ');
    }
    //Возврат результата
    return {
        blResp: Buffer.from(resu)
    };
};

//Обработчик "После" запроса к сервису 
const beforeDocParseMsg = async prms => {
    //Преобразуем JSON ответ сервиса в XML, понятный "Парус 8"
    let resu = null;
    if (prms.queue.blMsg) {
        try {
            resu = toXML(JSON.parse(prms.queue.blMsg.toString()));
        } catch (e) {
            throw new Error(`Неожиданный ответ сервера. Ошибка интерпретации: ${e.message}`);
        }
    } else {
        throw new Error('Сервер не вернул ответ');
    }
    //Возврат результата
    return {
        blMsg: Buffer.from(resu)
    };
};
exports.beforeDocParse    = beforeDocParse;
exports.afterDocParseResp = afterDocParseResp;
exports.beforeDocParseMsg  = beforeDocParseMsg;