"use strict";

var Condicio = require("condicio");

/**
 * @class Error.DataError
 * 数据错误,请求资源文件的数据错误
 */
function DataError(message) {
	/**
	 * @property {String}  [name="DataError"] 	错误名
	 */	
    this.name = "DataError";
	/**
	 * @property {String}  message 				错误信息
	 */    
	this.message = message;
};

/**
 * @class Error.NetworkError
 * 网络错误,请求资源时发生网络错误
 */
function NetworkError(message) {
	/**
	 * @property {String}  [name="NetworkError"] 	错误名
	 */
    this.name = "NetworkError";
	/**
	 * @property {String}  message					错误信息
	 */
    this.message = message;
};

/**
 * @class Error.SystemError
 * 系统错误(因权限无法进行文件I/O,对文件资源的使用被占用、无法删除)
 */
function SystemError(message){
	/**
	 * @property {String}  [name="SystemError"] 	错误名
	 */
	this.name = "SystemError";
	/**
	 * @property {String}  message					错误信息
	 */    
	this.message = message;
};

/**
 * @class Error.InvalidArgumentError
 * 参数错误,VIC与BRS进行资源或对象请求时传入参数错误
 */
function InvalidArgumentError(message){
	/**
	 * @property {String}  [name="InvalidArgumentError"] 	错误名
	 */
	 this.name = "InvalidArgumentError";
	/**
	 * @property {String}  message					错误信息
	 */
	 this.message = message;
};

/**
 * @class Error.VersioningError
 * 版本管理异常,VIC与BRS进行版本协商不通过
 */
function VersioningError(message){
	/**
	 * @property {String}  [name="VersioningError"] 	错误名
	 */
	this.name = "VersioningError";
	/**
	 * @property {String}  message					错误信息
	 */
	this.message = message;
};
 
/** 
 * @ignore
 * @enum {Number} ErrorCode   错误代码
 */
var ErrorCode = {
    E_Data: -10001,
    E_Network: -10002,
	E_InvalidArgument: -10003,
	E_System: -10004,
	E_Versioning: -10005
};

/**
 * @ignore
 * 
 * 包装所有的错误
 */
var genError = function(error){
	if(error.code === ErrorCode.E_Data){
		return new DataError(error.message);
	}
	else if(error.code === ErrorCode.E_Network){
		return new NetworkError(error.message);
	}
	else if (error.code === ErrorCode.E_InvalidArgument){
		return new InvalidArgumentError(error.message);
	}
	else if (error.code === ErrorCode.E_System){
		return new SystemError(error.message);
	}
	else if (error.code === ErrorCode.E_Versioning){
		return new VersioningError(error.message);
	}
	else {
		throw Error("Unknown Error");
	}
 };
 
exports.genError = genError;
exports.DataError = DataError;
exports.NetworkError = NetworkError;
exports.SystemError = SystemError;
exports.VersioningError = VersioningError;
exports.InvalidArgumentError = InvalidArgumentError;