define([ 'angular', 'toaster' ], function(angular) {
	'use strict';
	angular.module('common.services', ['toaster' ]).factory('SessionService', function() {
		return {
			get : function(key) {
				var storage = window.sessionStorage;
				if(storage)
					return sessionStorage.getItem(key);
				return null;
			},
			set : function(key, val) {
				var storage = window.sessionStorage;
				if(storage)
					return sessionStorage.setItem(key, val);
				return null;
			},
			unset : function(key) {
				var storage = window.sessionStorage;
				if(storage)
					return sessionStorage.removeItem(key);
				return null;
			},
			getCookie: function(key) {
				var storage = window.localStorage;
				if(storage)
					return storage.getItem(key);
				else {
					var val = document.cookie.match(new RegExp("(^| )" + key + "=([^;]*)(;|$)"));
					if (val != null) {
						return unescape(val[2]);
					}
					return null
				}
			},
			setCookie: function(key, val) {
				var storage = window.localStorage;
				if(storage)
					storage.setItem(key, val);
				else {
					var date = new Date(new Date().getTime() + 30 * 24 * 60 * 60 * 1000);
					document.cookie = key + "=" + escape(val) + ";expires=" + date.toGMTString();
				}
			},
			removeCookie: function(key) {
				var storage = window.localStorage;
				if(storage)
					storage.removeItem(key);
				else {
					var val = this.getCookie(key);
					if (val != null) {
						var date = new Date(new Date().getTime() - 1);
						document.cookie = key + "=" + val + ";expires=" + date.toGMTString()
					}
				}
			}
		};
	}).factory('BaseService', function() {
		return {
			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);
			},
			isNumber: function(n) {
		        return !isNaN(parseFloat(n)) && isFinite(n);
		    },
		    /**
			 * parse url params
			 */
		    parseParams: function(requestParams) {
		    	var me = this;
		        for (var key in requestParams) {
		            if (key.indexOf('[') >= 0) {
		                var params = key.split(/\[(.*)\]/), value = requestParams[key], lastKey = '';
		                angular.forEach(params.reverse(), function(name) {
		                    if (name != '') {
		                        var v = value;
		                        value = {};
		                        value[lastKey = name] = me.isNumber(v) ? parseFloat(v) : v;
		                    }
		                });
		                requestParams[lastKey] = angular.extend(requestParams[lastKey] || {}, value[lastKey]);
		                delete requestParams[key];
		            } else {
		                requestParams[key] = me.isNumber(requestParams[key]) ? parseFloat(requestParams[key]) : requestParams[key];
		            }
		        }
		        return requestParams;
			}
		};
	}).factory('AuthenticationService', function($http, SessionService, BaseService, SerializerUtil) {
		var cacheSession = function() {
			SessionService.set('authenticated', true);
		};
		var uncacheSession = function() {
			SessionService.unset('authenticated');
		};
		var rootPath = BaseService.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('SnapshotService', function($http, BaseService) {
		var rootPath = BaseService.getRootPath();
		return {
			getTodo : function(success) {
				var request = $http.get(rootPath + '/snapshot/todo');
				request.success(function(data){
					success.call(null, data);
				});
			},
			getNotice : function(count, success) {
				var request = $http.get(rootPath + '/snapshot/notice?count='+count);
				request.success(function(data){
					success.call(null, data);
				});
			}
		};
	}).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, BaseService, toaster) {
		var rootPath = BaseService.getRootPath();
		return {
			/**
			 * 打印方法
			 * enuu 企业的UU号
			 * pageName 打印页面的名称
			 * condition 单据的条件(格式：{tableName.propertyName}=value;当tableName含有'$'符号时将其换成'_'符号)
			 * title 单据标题
			 */
			print: function(enuu, pageName, condition, title) {
				$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', '系统错误', '获取报表名称失败');
					});
			}
		}
	});
});