/*
  Сервис интеграции ПП Парус 8 с WEB API
  Модели данных: описатели параметров функций обработчика очереди исходящих сообщений (класс OutQueue)
*/

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

const Schema = require("validate"); //Схемы валидации
const { outGoing } = require("./obj_config"); //Схемы валидации конфигурации сервера приложений
const { defServices } = require("./obj_services"); //Схема валидации списка сервисов
const { Queue } = require("./obj_queue"); //Схема валидации сообщения очереди
const { DBConnector } = require("../core/db_connector"); //Класс взаимодействия в БД
const { Logger } = require("../core/logger"); //Класс для протоколирования работы
const { Notifier } = require("../core/notifier"); //Класс рассылки уведомлений

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

const validateChildProcess = val => {
    return val["constructor"]["name"] === "ChildProcess";
};

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

//Схема валидации параметров конструктора
exports.OutQueue = new Schema({
    //Параметры обработки очереди исходящих сообщений
    outGoing: {
        schema: outGoing,
        required: true,
        message: {
            required: path => `Не указаны параметры обработки очереди исходящих сообщений (${path})`
        }
    },
    //Объект для взаимодействия с БД
    dbConn: {
        type: DBConnector,
        required: true,
        message: {
            type: path => `Объект для взаимодействия с БД (${path}) имеет некорректный тип данных (ожидалось - DBConnector)`,
            required: path => `Не указан объект для взаимодействия с БД (${path})`
        }
    },
    //Объект для протоколирования работы
    logger: {
        type: Logger,
        required: true,
        message: {
            type: path => `Объект для протоколирования работы (${path}) имеет некорректный тип данных (ожидалось - Logger)`,
            required: path => `Не указаны объект для протоколирования работы (${path})`
        }
    },
    //Объект для рассылки уведомлений
    notifier: {
        type: Notifier,
        required: true,
        message: {
            type: path => `Объект для рассылки уведомлений (${path}) имеет некорректный тип данных (ожидалось - Notifier)`,
            required: path => `Не указан объект для рассылки уведомлений (${path})`
        }
    },
    //Глобальный адрес прокси-сервера
    sProxy: {
        type: String,
        required: false,
        message: {
            type: path => `Глобальный адрес прокси-сервера (${path}) имеет некорректный тип данных (ожидалось - String)`,
            required: path => `Не указан глобальный адрес прокси-сервера (${path})`
        }
    }
});

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

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

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

//Схема валидации параметров функции запуска обработчика сообщения очереди
exports.startQueueProcessor = new Schema({
    //Обрабатываемое сообщение очереди
    queue: {
        schema: Queue,
        required: true,
        message: {
            required: path => `Не указано обрабатываемое сообщение очреди (${path})`
        }
    },
    //Процесс обработчика
    proc: {
        use: { validateChildProcess },
        required: true,
        message: {
            validateChildProcess: path => `Процесс обработчика (${path}) имеет некорректный тип данных (ожидалось - ChildProcess)`,
            required: path => `Не указан процесс обработчика (${path})`
        }
    }
});

//Схема валидации параметров функции останова обработчика сообщения очереди
exports.stopQueueProcessor = new Schema({
    //Идентификатор сообщения
    nQueueId: {
        type: Number,
        required: true,
        message: {
            type: path => `Идентификатор сообщения (${path}) имеет некорректный тип данных (ожидалось - Number)`,
            required: path => `Не указан идентификатор сообщения (${path})`
        }
    },
    //Процесс обработчика
    proc: {
        use: { validateChildProcess },
        required: false,
        message: {
            validateChildProcess: path => `Процесс обработчика (${path}) имеет некорректный тип данных (ожидалось - ChildProcess)`
        }
    }
});

//Схема валидации параметров функции оповещения об ошибке исполнения сообщения обмена
exports.notifyMessageProcessError = new Schema({
    //Обрабатываемое исходящее сообщение
    queue: {
        schema: Queue,
        required: true,
        message: {
            required: path => `Не указано обрабатываемое исходящее сообщение (${path})`
        }
    }
});

//Схема валидации параметров функции передачи исходящего сообшения на обработку
exports.processMessage = new Schema({
    //Обрабатываемое исходящее сообщение
    queue: {
        schema: Queue,
        required: true,
        message: {
            required: path => `Не указано обрабатываемое исходящее сообщение (${path})`
        }
    }
});

//Схема валидации параметров функции запуска обслуживания очереди
exports.startProcessing = new Schema({
    //Список обслуживаемых сервисов
    services: defServices(true, "services")
});
