const _                 = require('lodash');
const Ajv               = require('ajv/dist/2020');
const error             = require('../error');
const commonDefinitions = require('../../schema/common.json');

RegExp.prototype.toJSON = RegExp.prototype.toString;

const ajv = new Ajv({
	verbose:         true,
	allErrors:       true,
	allowUnionTypes: true,
	coerceTypes:     true,
	strict:          false,
	schemas:         [commonDefinitions]
});

/**
 *
 * @param   {Object} schema
 * @param   {Object} payload
 * @returns {Promise}
 */
function validator (schema, payload) {
	return new Promise(function (resolve, reject) {
		if (!payload) {
			reject(new error.InternalValidationError('Payload is falsy'));
		} else {
			try {
				let validate = ajv.compile(schema);
				let valid    = validate(payload);

				if (valid && !validate.errors) {
					resolve(_.cloneDeep(payload));
				} else {
					let message = ajv.errorsText(validate.errors);
					reject(new error.InternalValidationError(message));
				}
			} catch (err) {
				reject(err);
			}
		}
	});
}

module.exports = validator;