var urlencode = require('urlencode');
exports = module.exports = function (logger, rest, settings) {
	function getOptions(url, type) {
		var catalog = url.substring(1, url.indexOf('/', 1));
		var pathUrl = url.substring(url.indexOf('/', 1));
		var fullPath = '/' + catalog + settings.restful.version + pathUrl;
		return {
			'host': settings.restful.host, //后台请求地址
			'port': settings.restful.port,
			'path': fullPath,
			'method': type,
			'agent': false,
			'headers': {
				"Accept": "application/json",
				"Content-Type": "application/json",
				'User-Agent': 'Request for Express'
			}
		};
	}

	function addToken(options, req) {
		if (req.session.passport && req.session.passport.user && req.session.passport.user && req.session.passport.user.token) {
			options.headers['Authorization'] = "Bearer " + req.session.passport.user.token;
		}
		if (req.headers['device-id']) {
			options.headers['Device-Id'] = req.headers['device-id']
		}
		if (req.ip) {
			options.headers['Client-Ip'] = req.ip
		}
		return options;
	}

	function addParams(options, req) {
		var postData = !req.body ? '' : JSON.stringify(req.body || {});
		// options.headers['Content-Length'] = postData.length;
		options.params = postData;
	}

	function addContentLength(options) {
		if (options.params) {
			options.headers['Content-Length'] = options.params.length;
		}
	}

	function encodeUrl(url) {
		return urlencode(url);
	}

	function encodePamars(params) {
		var temp = [];
		for (var i = 0; i < params.length; i++) {
			var param = params[i];
			var tempParam = param.split("=")
			tempParam[1] = urlencode.decode(tempParam[1], 'utf8');
			tempParam[1] = tempParam[1].replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
			console.log(tempParam[1]);
			if (i < (params.length - 1)) {
				if (/[:&+/?%#=]/g.test(tempParam[1])) {
					temp.push(tempParam[0] + "=" + encodeUrl(tempParam[1]) + "&");
				} else {
					temp.push(tempParam[0] + "=" + tempParam[1] + "&");
				}
			} else {
				if (/[:&+/?%#=]/g.test(tempParam[1])) {
					temp.push(tempParam[0] + "=" + encodeUrl(tempParam[1]));
				} else {
					temp.push(tempParam[0] + "=" + tempParam[1]);
				}
			}
		}
		return temp.join("");
	}

	function handlePamars(url) {
		var tempUrl = url;
		// if(url.indexOf("?")!=-1){
		// 	var temp=url.split("?");
		// 	var params=""; 
		// 	if(temp[1]&&temp[1].indexOf("&")!=-1){
		// 		params=encodePamars(temp[1].split("&"));
		// 	}else{
		// 		params=encodePamars([temp[1]]);
		// 	}
		// 	return temp[0]+"?"+params;
		// }else {
		// 	return tempUrl;
		// } 
		return tempUrl;
	}

	function splitServiceFromUrl(url) {
		var catalog = url.substring(1, url.indexOf('/', 1));
		var pathUrl = url.substring(url.indexOf('/', 1));
		var fullPath = settings.restful.url + catalog + settings.restful.version + pathUrl;
		return fullPath
	}

	function splitUrl(fullUrl) {
		if (settings.prefix && settings.prefix.length > 1) {
			fullUrl = fullUrl.substring(settings.prefix.length - 1);
		}
		var url = fullUrl.substring(4);
		return url;
	}

	function searchService(services, name) {
		if (services[name]) {
			console.log(services[name]);
			return false;
		} else {
			return true;
		}
	}

	function checkReq(req, res) {
		var flag = true;
		// if(flag&&req.headers&&!req.headers['service-catalog']){
		// 	res.status(400);
		// 	res.send({"errors":{},"message":"缺少必要请求参数,服务目录名称是必填项"}); 
		// 	flag=false;
		// }
		// if(flag&&req.session.passport&&req.session.passport.user&&!req.session.passport.user.service_catalog){
		// 	res.status(404);
		// 	res.send({"errors":{},"message":"服务目录未加载,请重新登录"}); 
		// 	flag=false;
		// }
		// if(flag&&searchService(req.session.passport.user.service_catalog,req.headers['service-catalog'])){
		// 	res.status(404);
		// 	res.send({"errors":{},"message":"服务目录未查询到请求服务,请确认参数正确"}); 
		// 	flag=false; 
		// }
		return flag;
	}

	function checkJson(req) {
		if (req.headers && req.headers['content-type'] == 'application/json') {
			return true;
		} else {
			return false;
		}
	}

	function get(req, res, next) {
		var url = splitUrl(req.originalUrl);
		var options = getOptions(url, 'GET');
		addToken(options, req);
		function _success(data, response) {
			if (response.statusCode >= 400 || !data) {
				logger.error(options, data);
				res.status(response.statusCode);
				res.send(data);
			} else {
				res.send(data);
			}
		}
		function _fail(err) {
			logger.error(options, err);
			res.send(err);
		}
		rest.restClient(options, _success, _fail);
	}

	function post(req, res, next) {
		var url = splitUrl(req.originalUrl);
		var options = getOptions(url, 'POST');
		addToken(options, req);
		addParams(options, req);
		function _success(data, response) {
			if (response.statusCode >= 400) {
				logger.error(options, data);
				res.status(response.statusCode);
				res.send(data);
			} else if (!data || 'null' == data || "null\n" == data || '{}' == data) {
				res.send({
					code: 200,
					message: '操作成功!'
				});
			} else {
				res.send(data);
			}
		}
		function _fail(err) {
			logger.error(options, err);
			res.send(err);
		}
		rest.restClient(options, _success, _fail);
	}

	function put(req, res, next) {
		var url = splitUrl(req.originalUrl);
		var options = getOptions(url, 'PUT');
		addToken(options, req);
		addParams(options, req);
		function _success(data, response) {
			if (response.statusCode >= 400) {
				logger.error(options, data);
				res.status(response.statusCode);
				res.send(data);
			} else if (!data || 'null' == data || "null\n" == data || '{}' == data) {
				res.send({
					code: 200,
					message: '操作成功!'
				});
			} else {
				res.send(data);
			}
		}
		function _fail(err) {
			logger.error(options, err);
			res.send(err);
		}
		rest.restClient(options, _success, _fail);
	}

	function patch(req, res, next) {
		var url = splitUrl(req.originalUrl);
		var options = getOptions(url, 'PATCH');
		addToken(options, req);
		addParams(options, req);
		function _success(data, response) {
			if (response.statusCode >= 400) {
				logger.error(options, data);
				res.send(data);
			} else if (!data) {
				res.send({
					code: 200,
					message: '操作成功!'
				});
			} else {
				res.send(data);
			}
		}
		function _fail(err) {
			logger.error(options, err);
			res.send(err);
		}
		rest.restClient(options, _success, _fail);
	}

	function head(req, res, next) {
		var url = splitUrl(req.originalUrl);
		var options = getOptions(url, 'HEAD');
		addToken(options, req);
		addParams(options, req);
		function _success(data, response) {
			if (response.statusCode >= 400) {
				logger.error(options, data);
				res.send(data);
			} else if (!data) {
				res.send({
					code: 200,
					message: '操作成功!'
				});
			} else {
				res.send(data);
			}
		}
		function _fail(err) {
			logger.error(options, err);
			res.send(err);
		}
		rest.restClient(options, _success, _fail);
	}

	function del(req, res, next) {
		var url = splitUrl(req.originalUrl);
		var options = getOptions(url, 'DELETE');
		addToken(options, req);
		addParams(options, req);
		addContentLength(options);
		function _success(data, response) {
			if (response.statusCode >= 400) {
				logger.error(options, data);
				res.status(response.statusCode);
				res.send(data);
			} else if (!data || (data && !data.message)) {
				res.send({
					code: 200,
					action: "delete",
					message: '删除成功'
				});
			} else {
				res.send(data);
			}
		}
		function _fail(err) {
			logger.error(options, err);
			res.send(err);
		}
		rest.restClient(options, _success, _fail);
	}

	return {
		'get': get,
		'post': post,
		'put': put,
		'patch': patch,
		'head': head,
		'delete': del
	};
};

exports['@singleton'] = true;
exports['@require'] = ['igloo/logger', 'utils/rest', 'igloo/settings'];