define([ 'angular', 'toaster' ], function(angular) {
	'use strict';
	angular.module('common.services', ['toaster' ]).factory('SessionService', function() {
		return {
			get : function(key) {
				return sessionStorage.getItem(key);
			},
			set : function(key, val) {
				return sessionStorage.setItem(key, val);
			},
			unset : function(key) {
				return sessionStorage.removeItem(key);
			}
		};
	}).factory('AuthenticationService', function($http, SessionService, SerializerUtil) {
		var cacheSession = function() {
			SessionService.set('authenticated', true);
		};
		var uncacheSession = function() {
			SessionService.unset('authenticated');
		};
		var getRootPath = function() {
			var fullPath = window.document.location.href;
			var path = window.document.location.pathname;
			var pos = fullPath.indexOf(path);
			return fullPath.substring(0, pos) + path.substring(0, path.substr(1).indexOf('/') + 1);
		};
		var rootPath = getRootPath();
		return {
			root : function() {
				return rootPath;	
			},
			login : function(user) {
				var payload = SerializerUtil.param(user);
				var config = {
					headers : {
						'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
					}
				};
				var login = $http.post(rootPath + "/j_spring_security_check", payload, config);
				login.success(cacheSession);
				return login;
			},
			logout : function() {
				var logout = $http.get(rootPath + "/j_spring_security_logout");
				logout.success(uncacheSession);
				return logout;
			},
			isAuthed : function() {
				return SessionService.get('authenticated');
			},
			getAuthentication : function() {
				var request = $http.get(rootPath + '/authentication');
				request.success(function(data){
					if(data)
						cacheSession();
					else
						uncacheSession();
				});
				request.error(uncacheSession);
				return request;
			}
		};
	}).factory('SerializerUtil', function() {
		return {
			/**
			 * @description 将元素值转换为序列化的字符串表示
			 */
			param : function(obj) {
				var query = '', name, value, fullSubName, subName, subValue, innerObj, i, me = this;
				for (name in obj) {
					value = obj[name];
					if (value instanceof Array) {
						for (i = 0; i < value.length; ++i) {
							subValue = value[i];
							fullSubName = name + '[' + i + ']';
							innerObj = {};
							innerObj[fullSubName] = subValue;
							query += me.param(innerObj) + '&';
						}
					} else if (value instanceof Object) {
						for (subName in value) {
							subValue = value[subName];
							fullSubName = name + '[' + subName + ']';
							innerObj = {};
							innerObj[fullSubName] = subValue;
							query += me.param(innerObj) + '&';
						}
					} else if (value !== undefined && value !== null)
						query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&';
				}
				return query.length ? query.substr(0, query.length - 1) : query;
			}
		};
	}).factory('ReportService', function($http, toaster) {
		return {
			/**
			 * 打印方法
			 * enuu 企业的UU号
			 * pageName 打印页面的名称
			 * condition 单据的条件(格式：{tableName.propertyName}=value;当tableName含有'$'符号时将其换成'_'符号)
			 * title 单据标题
			 */
			print: function(enuu, pageName, condition, title) {
				var getRootPath = function() {
					var fullPath = window.document.location.href;
					var path = window.document.location.pathname;
					var pos = fullPath.indexOf(path);
					return fullPath.substring(0, pos) + path.substring(0, path.substr(1).indexOf('/') + 1);
				};
				var rootPath = getRootPath();
				$http.get(rootPath + '/report/getName', {params: {enuu: enuu, pagename: pageName}})
					.success(function(data){
						if(data) {
							var url = 'http://192.168.253.6:8099/B2BCR/?reportfile=' + data + '&rcondition=' + condition;		
							window.open(url, title + '-打印', 'width=' + (window.screen.width-10) + ',height=' + (window.screen.height*0.87) + ',top=0,left=0,toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no');
						} else {
							toaster.pop('error', '系统错误', '没有设置相应的报表');
						}
					}).error(function() {
						toaster.pop('error', '系统错误', '获取报表名称失败');
					});
			}
		}
	});
});