/*
  Сервис интеграции ПП Парус 8 с WEB API
  Модели данных: описатели параметров вспомогательных функций  (модуль utils.js)
*/

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

const Schema = require("validate"); //Схемы валидации
const { mail } = require("./obj_config"); //Схемы валидации конфигурации сервера приложений
const { validateMailList } = require("./common"); //Общие объекты валидации моделей данных

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

//Валидация списка адресов E-Mail для отправки уведомления
const validateTo = val => {
    return validateMailList(val);
};

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

//Схема валидации параметров функции отправки E-Mail
exports.sendMail = new Schema({
    //Параметры отправки E-Mail уведомлений
    mail: {
        schema: mail,
        required: true,
        message: {
            required: path => `Не указаны параметры отправки E-Mail уведомлений (${path})`
        }
    },
    //Список адресов E-Mail для отправки уведомления
    sTo: {
        type: String,
        required: true,
        use: { validateTo },
        message: {
            type: path => `Список адресов E-Mail для отправки уведомления (${path}) имеет некорректный тип данных (ожидалось - String)`,
            required: path => `Не указан cписок адресов E-Mail для отправки уведомления (${path})`,
            validateTo: path =>
                `Неверный формат списка адресов E-Mail для отправки уведомления (${path}), для указания нескольких адресов следует использовать запятую в качестве разделителя (без пробелов)`
        }
    },
    //Заголовок сообщения
    sSubject: {
        type: String,
        required: false,
        message: {
            type: path => `Заголовок сообщения (${path}) имеет некорректный тип данных (ожидалось - String)`,
            required: path => `Не указан заголовок сообщения (${path})`
        }
    },
    //Текст уведомления
    sMessage: {
        type: String,
        required: false,
        message: {
            type: path => `Текст уведомления (${path}) имеет некорректный тип данных (ожидалось - String)`,
            required: path => `Не указан текст уведомления (${path})`
        }
    },
    //HTML текст сообщения
    sHTML: {
        type: String,
        required: false,
        message: {
            type: path => `HTML текст сообщения (${path}) имеет некорректный тип данных (ожидалось - String)`,
            required: path => `Не указан HTML текст сообщения (${path})`
        }
    },
    //Вложения сообщения
    attachments: {
        type: Array,
        required: false,
        message: {
            type: path => `Список вложений сообщения (${path}) имеет некорректный тип данных (ожидалось - Array)`,
            required: path => `Не указан список вложений сообщения (${path})`
        }
    }
});

//Схема валидации параметров функции сборки URL
exports.buildURL = new Schema({
    //Корневой каталог сервиса
    sSrvRoot: {
        type: String,
        required: true,
        message: {
            type: path => `Корневой каталог сервиса (${path}) имеет некорректный тип данных (ожидалось - String)`,
            required: path => `Не указан корневой каталог сервиса (${path})`
        }
    },
    //Адрес функции сервиса
    sFnURL: {
        type: String,
        required: true,
        message: {
            type: path => `Адрес функции сервиса (${path}) имеет некорректный тип данных (ожидалось - String)`,
            required: path => `Не указан адрес функции сервиса (${path})`
        }
    },
    //Параметры запроса
    sQuery: {
        type: String,
        required: false,
        message: {
            type: path => `Параметры запроса (${path}) имеют некорректный тип данных (ожидалось - String)`,
            required: path => `Не указаны параметры запроса (${path})`
        }
    }
});

//Схема валидации параметров функции разбора XML
exports.parseXML = new Schema({
    //Разбираемый XML
    sXML: {
        type: String,
        required: true,
        message: {
            type: path => `Разбираемый XML (${path}) имеет некорректный тип данных (ожидалось - String)`,
            required: path => `Не указан разбираемый XML (${path})`
        }
    },
    //Параметры парсера
    options: {
        type: Object,
        required: true,
        message: {
            type: path =>
                `Параметры парсера XML (${path}) имеют некорректный тип данных (ожидалось - Object, см. документацию к XML2JS - https://github.com/Leonidas-from-XIV/node-xml2js)`,
            required: path => `Не указаны параметры парсера XML (${path})`
        }
    }
});

//Схема валидации параметров функции разбора XML параметров сообщения/ответа (XML > JSON)
exports.parseOptionsXML = new Schema({
    //XML параметры сообщения/ответа
    sOptions: {
        type: String,
        required: true,
        message: {
            type: path => `XML параметры сообщения/ответа (${path}) имеют некорректный тип данных (ожидалось - String)`,
            required: path => `Не указаны XML параметры сообщения/ответа (${path})`
        }
    }
});

//Схема валидации параметров функции сборки параметров сообщения/ответа (JSON > XML)
exports.buildOptionsXML = new Schema({
    //XML параметры сообщения/ответа
    options: {
        type: Object,
        required: true,
        message: {
            type: path => `Объект параметров сообщения/ответа (${path}) имеет некорректный тип данных (ожидалось - Object)`,
            required: path => `Не указан объект параметров сообщения/ответа (${path})`
        }
    }
});
