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

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

const Schema = require("validate"); //Схемы валидации

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

//Состояния исполнения сообщений очереди обмена
const NQUEUE_EXEC_STATE_INQUEUE = 0; //Поставлено в очередь
const NQUEUE_EXEC_STATE_APP = 1; //Обрабатывается сервером приложений
const NQUEUE_EXEC_STATE_APP_OK = 2; //Успешно обработано сервером приложений
const NQUEUE_EXEC_STATE_APP_ERR = 3; //Ошибка обработки сервером приложений
const NQUEUE_EXEC_STATE_DB = 4; //Обрабатывается СУБД
const NQUEUE_EXEC_STATE_DB_OK = 5; //Успешно обработано СУБД
const NQUEUE_EXEC_STATE_DB_ERR = 6; //Ошибка обработки СУБД
const NQUEUE_EXEC_STATE_OK = 7; //Обработано успешно
const NQUEUE_EXEC_STATE_ERR = 8; //Обработано с ошибками
const SQUEUE_EXEC_STATE_INQUEUE = "INQUEUE"; //Поставлено в очередь (строковый код)
const SQUEUE_EXEC_STATE_APP = "APP"; //Обрабатывается сервером приложений (строковый код)
const SQUEUE_EXEC_STATE_APP_OK = "APP_OK"; //Успешно обработано сервером приложений (строковый код)
const SQUEUE_EXEC_STATE_APP_ERR = "APP_ERR"; //Ошибка обработки сервером приложений (строковый код)
const SQUEUE_EXEC_STATE_DB = "DB"; //Обрабатывается СУБД (строковый код)
const SQUEUE_EXEC_STATE_DB_OK = "DB_OK"; //Успешно обработано СУБД (строковый код)
const SQUEUE_EXEC_STATE_DB_ERR = "DB_ERR"; //Ошибка обработки СУБД (строковый код)
const SQUEUE_EXEC_STATE_OK = "OK"; //Обработано успешно (строковый код)
const SQUEUE_EXEC_STATE_ERR = "ERR"; //Обработано с ошибками (строковый код)

//Значения признака "В работе" сообщения очереди обмена
const NQUEUE_IN_PROGRESS_NO = 0; //Не в работе
const NQUEUE_IN_PROGRESS_YES = 1; //В работе

//Коды результатов исполнения обработчика сообщения
const SPRC_RESP_RESULT_OK = "OK"; //Обработано успешно
const SPRC_RESP_RESULT_ERR = "ERR"; //Ошибка обработки
const SPRC_RESP_RESULT_UNAUTH = "UNAUTH"; //Неаутентифицирован

//Флаг сброса данных сообщения
const NQUEUE_RESET_DATA_NO = 0; //Не сбрасывать
const NQUEUE_RESET_DATA_YES = 1; //Сбросить

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

//Константы
exports.NQUEUE_EXEC_STATE_INQUEUE = NQUEUE_EXEC_STATE_INQUEUE;
exports.NQUEUE_EXEC_STATE_APP = NQUEUE_EXEC_STATE_APP;
exports.NQUEUE_EXEC_STATE_APP_OK = NQUEUE_EXEC_STATE_APP_OK;
exports.NQUEUE_EXEC_STATE_APP_ERR = NQUEUE_EXEC_STATE_APP_ERR;
exports.NQUEUE_EXEC_STATE_DB = NQUEUE_EXEC_STATE_DB;
exports.NQUEUE_EXEC_STATE_DB_OK = NQUEUE_EXEC_STATE_DB_OK;
exports.NQUEUE_EXEC_STATE_DB_ERR = NQUEUE_EXEC_STATE_DB_ERR;
exports.NQUEUE_EXEC_STATE_OK = NQUEUE_EXEC_STATE_OK;
exports.NQUEUE_EXEC_STATE_ERR = NQUEUE_EXEC_STATE_ERR;
exports.SQUEUE_EXEC_STATE_INQUEUE = SQUEUE_EXEC_STATE_INQUEUE;
exports.SQUEUE_EXEC_STATE_APP = SQUEUE_EXEC_STATE_APP;
exports.SQUEUE_EXEC_STATE_APP_OK = SQUEUE_EXEC_STATE_APP_OK;
exports.SQUEUE_EXEC_STATE_APP_ERR = SQUEUE_EXEC_STATE_APP_ERR;
exports.SQUEUE_EXEC_STATE_DB = SQUEUE_EXEC_STATE_DB;
exports.SQUEUE_EXEC_STATE_DB_OK = SQUEUE_EXEC_STATE_DB_OK;
exports.SQUEUE_EXEC_STATE_DB_ERR = SQUEUE_EXEC_STATE_DB_ERR;
exports.SQUEUE_EXEC_STATE_OK = SQUEUE_EXEC_STATE_OK;
exports.SQUEUE_EXEC_STATE_ERR = SQUEUE_EXEC_STATE_ERR;
exports.SPRC_RESP_RESULT_OK = SPRC_RESP_RESULT_OK;
exports.SPRC_RESP_RESULT_ERR = SPRC_RESP_RESULT_ERR;
exports.SPRC_RESP_RESULT_UNAUTH = SPRC_RESP_RESULT_UNAUTH;
exports.NQUEUE_RESET_DATA_NO = NQUEUE_RESET_DATA_NO;
exports.NQUEUE_RESET_DATA_YES = NQUEUE_RESET_DATA_YES;
exports.NQUEUE_IN_PROGRESS_NO = NQUEUE_IN_PROGRESS_NO;
exports.NQUEUE_IN_PROGRESS_YES = NQUEUE_IN_PROGRESS_YES;

//Схема валидации сообщения очереди обмена
exports.Queue = new Schema({
    //Идентификатор сообщения очереди обмена
    nId: {
        type: Number,
        required: true,
        message: {
            type: path => `Идентификатор сообщения очереди обмена (${path}) имеет некорректный тип данных (ожидалось - Number)`,
            required: path => `Не указан идентификатор сообщения очереди обмена (${path})`
        }
    },
    //Дата постановки сообщения в очередь обмена
    dInDate: {
        type: Date,
        required: true,
        message: {
            type: path => `Дата постановки сообщения в очередь обмена (${path}) имеет некорректный тип данных (ожидалось - Date)`,
            required: path => `Не указана дата постановки сообщения в очередь обмена (${path})`
        }
    },
    //Дата постановки сообщения в очередь обмена (строковое представление)
    sInDate: {
        type: String,
        required: true,
        message: {
            type: path =>
                `Строковое представление даты постановки сообщения в очередь обмена (${path}) имеет некорректный тип данных (ожидалось - String)`,
            required: path => `Не указано строковое представление даты постановки сообщения в очередь обмена (${path})`
        }
    },
    //Пользователь поставивший сообщение в очередь обмена
    sInAuth: {
        type: String,
        required: true,
        message: {
            type: path => `Пользователь, поставивший сообщение в очередь обмена (${path}) имеет некорректный тип данных (ожидалось - String)`,
            required: path => `Не указан пользователь, поставивший сообщение в очередь обмена (${path})`
        }
    },
    //Идентификатор сервиса-обработчика сообщения очереди обмена
    nServiceId: {
        type: Number,
        required: true,
        message: {
            type: path => `Идентификатор сервиса-обработчика сообщения очереди обмена (${path}) имеет некорректный тип данных (ожидалось - Number)`,
            required: path => `Не указан идентификатор сервиса-обработчика сообщения очереди обмена (${path})`
        }
    },
    //Код сервиса-обработчика сообщения очереди обмена
    sServiceCode: {
        type: String,
        required: true,
        message: {
            type: path => `Код сервиса-обработчика сообщения очереди обмена (${path}) имеет некорректный тип данных (ожидалось - String)`,
            required: path => `Не указан код сервиса-обработчика сообщения очереди обмена (${path})`
        }
    },
    //Идентификатор функции сервиса-обработчика сообщения очереди обмена
    nServiceFnId: {
        type: Number,
        required: true,
        message: {
            type: path =>
                `Идентификатор функции сервиса-обработчика сообщения очереди обмена (${path}) имеет некорректный тип данных (ожидалось - Number)`,
            required: path => `Не указан идентификатор функции сервиса-обработчика сообщения очереди обмена (${path})`
        }
    },
    //Код функции сервиса-обработчика сообщения очереди обмена
    sServiceFnCode: {
        type: String,
        required: true,
        message: {
            type: path => `Код функции сервиса-обработчика сообщения очереди обмена (${path}) имеет некорректный тип данных (ожидалось - String)`,
            required: path => `Не указан код функции сервиса-обработчика сообщения очереди обмена (${path})`
        }
    },
    //Дата обработки сообщения очереди обмена
    dExecDate: {
        type: Date,
        required: false,
        message: {
            type: path => `Дата обработки сообщения очереди обмена (${path}) имеет некорректный тип данных (ожидалось - Date)`,
            required: path => `Не указана дата обработки сообщения очереди обмена (${path})`
        }
    },
    //Дата обработки сообщения очереди обмена (строковое представление)
    sExecDate: {
        type: String,
        required: false,
        message: {
            type: path =>
                `Строковое представление даты обработки сообщения очереди обмена (${path}) имеет некорректный тип данных (ожидалось - String)`,
            required: path => `Не указано строковое представление даты обработки сообщения очереди обмена (${path})`
        }
    },
    //Количество попыток обработки сообщения очереди обмена
    nExecCnt: {
        type: Number,
        required: true,
        message: {
            type: path => `Количество попыток обработки сообщения очереди обмена (${path}) имеет некорректный тип данных (ожидалось - Number)`,
            required: path => `Не указано количество попыток обработки сообщения очереди обмена (${path})`
        }
    },
    //Предельное количество попыток обработки сообщения очереди обмена
    nRetryAttempts: {
        type: Number,
        required: true,
        message: {
            type: path =>
                `Предельное количество попыток обработки сообщения очереди обмена (${path}) имеет некорректный тип данных (ожидалось - Number)`,
            required: path => `Не указано предельное количество попыток обработки сообщения очереди обмена (${path})`
        }
    },
    //Состояние обработки сообщения очереди обмена
    nExecState: {
        type: Number,
        enum: [
            NQUEUE_EXEC_STATE_INQUEUE,
            NQUEUE_EXEC_STATE_APP,
            NQUEUE_EXEC_STATE_APP_OK,
            NQUEUE_EXEC_STATE_APP_ERR,
            NQUEUE_EXEC_STATE_DB,
            NQUEUE_EXEC_STATE_DB_OK,
            NQUEUE_EXEC_STATE_DB_ERR,
            NQUEUE_EXEC_STATE_OK,
            NQUEUE_EXEC_STATE_ERR
        ],
        required: true,
        message: {
            type: path => `Состояние обработки сообщения очереди обмена (${path}) имеет некорректный тип данных (ожидалось - Number)`,
            enum: path => `Значение состояния обработки сообщения очереди обмена (${path}) не поддерживается`,
            required: path => `Не указано состояние обработки сообщения очереди обмена (${path})`
        }
    },
    //Состояние обработки сообщения очереди обмена (строковый код)
    sExecState: {
        type: String,
        enum: [
            SQUEUE_EXEC_STATE_INQUEUE,
            SQUEUE_EXEC_STATE_APP,
            SQUEUE_EXEC_STATE_APP_OK,
            SQUEUE_EXEC_STATE_APP_ERR,
            SQUEUE_EXEC_STATE_DB,
            SQUEUE_EXEC_STATE_DB_OK,
            SQUEUE_EXEC_STATE_DB_ERR,
            SQUEUE_EXEC_STATE_OK,
            SQUEUE_EXEC_STATE_ERR
        ],
        required: true,
        message: {
            type: path => `Строковый код состояния обработки сообщения очереди обмена (${path}) имеет некорректный тип данных (ожидалось - String)`,
            enum: path => `Значение строкового кода состояния обработки сообщения очереди обмена (${path}) не поддерживается`,
            required: path => `Не указан строковый код состояния обработки сообщения очереди обмена (${path})`
        }
    },
    //Информация от обработчика сообщения очереди обмена
    sExecMsg: {
        type: String,
        required: false,
        message: {
            type: path => `Информация от обработчика сообщения очереди обмена (${path}) имеет некорректный тип данных (ожидалось - String)`,
            required: path => `Не указана информация от обработчика сообщения очереди обмена (${path})`
        }
    },
    //Идентификатор связанного сообщения очереди обмена
    nQueueId: {
        type: Number,
        required: false,
        message: {
            type: path => `Идентификатор связанного сообщения очереди обмена (${path}) имеет некорректный тип данных (ожидалось - Number)`,
            required: path => `Не указан идентификатор связанного сообщения очереди обмена (${path})`
        }
    },
    //Параметры сообщения
    sOptions: {
        type: String,
        required: false,
        message: {
            type: path => `Параметры сообщения очереди обмена (${path}) имеют некорректный тип данных (ожидалось - String)`,
            required: path => `Не указаны параметры сообщения очереди обмена (${path})`
        }
    },
    //Параметры ответа
    sOptionsResp: {
        type: String,
        required: false,
        message: {
            type: path => `Параметры ответа на сообщение очереди обмена (${path}) имеют некорректный тип данных (ожидалось - String)`,
            required: path => `Не указаны параметры ответа на сообщение очереди обмена (${path})`
        }
    },
    //Приоритет в очереди обмена
    nPriority: {
        type: Number,
        required: true,
        message: {
            type: path => `Приоритет в очереди обмена (${path}) имеет некорректный тип данных (ожидалось - Number)`,
            required: path => `Не указан приоритет в очереди обмена (${path})`
        }
    }
});

//Схема валидации данных сообщения очереди обмена
exports.QueueMsg = new Schema({
    //Данные сообщения очереди обмена
    blMsg: {
        type: Buffer,
        required: true,
        message: {
            type: path => `Данные сообщения очереди обмена (${path}) имеют некорректный тип данных (ожидалось - Buffer)`,
            required: path => `Не указаны данные сообщения очереди обмена (${path})`
        }
    }
}).validator({ required: val => val === null || val });

//Схема валидации данных ответа сообщения очереди обмена
exports.QueueResp = new Schema({
    //Данные ответа сообщения очереди обмена
    blResp: {
        type: Buffer,
        required: true,
        message: {
            type: path => `Данные ответа сообщения очереди обмена (${path}) имеют некорректный тип данных (ожидалось - Buffer)`,
            required: path => `Не указаны данные ответа сообщения очереди обмена (${path})`
        }
    }
}).validator({ required: val => val === null || val });

//Схема валидации результата обработки сообщения очереди
exports.QueuePrcResult = new Schema({
    //Состояние обработки сообщения очереди обмена
    sResult: {
        type: String,
        enum: [SPRC_RESP_RESULT_OK, SPRC_RESP_RESULT_ERR, SPRC_RESP_RESULT_UNAUTH],
        required: true,
        message: {
            type: path => `Состояние обработки сообщения очереди обмена (${path}) имеет некорректный тип данных (ожидалось - String)`,
            enum: path => `Значение состояния обработки сообщения очереди обмена (${path}) не поддерживается`,
            required: path => `Не указано состояние обработки сообщения очереди обмена (${path})`
        }
    },
    //Параметры ответа на сообщение очереди обмена
    sOptionsResp: {
        type: String,
        required: false,
        message: {
            type: path => `Параметры ответа на сообщение очереди обмена (${path}) имеют некорректный тип данных (ожидалось - String)`,
            required: path => `Не указаны параметры ответа на сообщение очереди обмена (${path})`
        }
    },
    //Информация от обработчика сообщения очереди обмена
    sMsg: {
        type: String,
        required: true,
        message: {
            type: path => `Информация от обработчика сообщения очереди обмена (${path}) имеет некорректный тип данных (ожидалось - String)`,
            required: path => `Не указана информация от обработчика сообщения очереди обмена (${path})`
        }
    }
}).validator({
    required: val => typeof val != "undefined"
});
