const _    = require('lodash');
const util = require('util');

module.exports = {

	PermissionError: function (message, previous) {
		Error.captureStackTrace(this, this.constructor);
		this.name     = this.constructor.name;
		this.previous = previous;
		this.message  = 'Permission Denied';
		this.public   = true;
		this.status   = 403;
	},

	ItemNotFoundError: function (id, previous) {
		Error.captureStackTrace(this, this.constructor);
		this.name     = this.constructor.name;
		this.previous = previous;
		this.message  = 'Item Not Found - ' + id;
		this.public   = true;
		this.status   = 404;
	},

	AuthError: function (message, previous) {
		Error.captureStackTrace(this, this.constructor);
		this.name     = this.constructor.name;
		this.previous = previous;
		this.message  = message;
		this.public   = true;
		this.status   = 401;
	},

	InternalError: function (message, previous) {
		Error.captureStackTrace(this, this.constructor);
		this.name     = this.constructor.name;
		this.previous = previous;
		this.message  = message;
		this.status   = 500;
		this.public   = false;
	},

	InternalValidationError: function (message, previous) {
		Error.captureStackTrace(this, this.constructor);
		this.name     = this.constructor.name;
		this.previous = previous;
		this.message  = message;
		this.status   = 400;
		this.public   = false;
	},

	ConfigurationError: function (message, previous) {
		Error.captureStackTrace(this, this.constructor);
		this.name     = this.constructor.name;
		this.previous = previous;
		this.message  = message;
		this.status   = 400;
		this.public   = true;
	},

	CacheError: function (message, previous) {
		Error.captureStackTrace(this, this.constructor);
		this.name     = this.constructor.name;
		this.message  = message;
		this.previous = previous;
		this.status   = 500;
		this.public   = false;
	},

	ValidationError: function (message, previous) {
		Error.captureStackTrace(this, this.constructor);
		this.name     = this.constructor.name;
		this.previous = previous;
		this.message  = message;
		this.public   = true;
		this.status   = 400;
	},

	AssertionFailedError: function (message, previous) {
		Error.captureStackTrace(this, this.constructor);
		this.name     = this.constructor.name;
		this.previous = previous;
		this.message  = message;
		this.public   = false;
		this.status   = 400;
	},

	CommandError: function (stdErr, code, previous) {
		Error.captureStackTrace(this, this.constructor);
		this.name     = this.constructor.name;
		this.previous = previous;
		this.message  = stdErr;
		this.code     = code;
		this.public   = false;
	},
};

_.forEach(module.exports, function (error) {
	util.inherits(error, Error);
});