angular
	.module('authBox', ['dating.models.users', 'ui.bootstrap'])
	.service('showSignInBox', function ($modal, $modalStack) {
		var showSignInBox = function (popupData) {
			$modal.open({
				templateUrl: globalParams.templateUrls.auth_box.sign_in_box,
				controller: 'SignInBoxCtrl as signInBoxCtrl',
				size: 'signInPopup',
				keyboard: false,
				backdrop: 'static',
				animation: false,
				resolve: {
					popupData: function () {
						return popupData || {};
					}
				}
			});
			$modalStack.dismissAll();
		};
		return showSignInBox;
	})
	.service('showSignUpBox', function ($modal, $modalStack) {
		var showSignUpBox = function (popupData) {
			$modal.open({
				templateUrl: globalParams.templateUrls.auth_box.sign_up_box,
				controller: 'SignUpBoxCtrl as signUpBoxCtrl',
				size: 'signUpPopup',
				keyboard: false,
				backdrop: 'static',
				animation: false,
				resolve: {
					popupData: function () {
						return popupData || {};
					}
				}
			});
			$modalStack.dismissAll();
		};
		return showSignUpBox;
	})
	.service('showUpdatePasswordBox', function ($modal, $modalStack) {
		var showUpdatePasswordBox = function () {
			$modal.open({
				templateUrl: globalParams.templateUrls.auth_box.update_password_box,
				controller: 'UpdatePasswordBoxCtrl as updatePasswordBoxCtrl',
				size: 'updatePasswordPopup',
				keyboard: false,
				backdrop: 'static',
				animation: false
			});
			$modalStack.dismissAll();
		};
		return showUpdatePasswordBox;
	})
	.directive('updatePasswordFrom', function () {
		return {
			restrict: 'E',
			controller: 'UpdatePasswordBoxCtrl',
			controllerAs: 'updatePasswordBoxCtrl',
			bindToController: true,
			templateUrl: globalParams.templateUrls.directives.update_password_form
		};
	})
	.service('showResetPasswordBox', function ($modal, $modalStack) {
		var showResetPasswordBox = function () {
			$modal.open({
				templateUrl: globalParams.templateUrls.auth_box.reset_password_box,
				controller: 'ResetPasswordBoxCtrl as resetPasswordCtrl',
				size: 'resetPasswordPopup',
				keyboard: false,
				backdrop: 'static',
				animation: false
			});
			$modalStack.dismissAll();
		};
		return showResetPasswordBox;
	})
	.controller(
		'SignInBoxCtrl',
		function (
			$state,
			$scope,
			$modalInstance,
			UsersModel,
			PagesModel,
			showSignUpBox,
			popupData,
			showResetPasswordBox,
			globalParamsService,
			authService,
			userAccess,
			$rootScope
		) {
			var signInBoxCtrl = this;
			var GLOBALS = globalParamsService.GLOBALS;
			signInBoxCtrl.signInUser = function () {
				signInBoxCtrl.isSubmitButtonDisabled = true;
				UsersModel.signIn(signInBoxCtrl.user)
					.error(function (result) {
						signInBoxCtrl.isSubmitButtonDisabled = false;
						signInBoxCtrl.errors = result;
					})
					.then(function () {
						signInBoxCtrl.isSubmitButtonDisabled = false;
						signInBoxCtrl.errors = null;
						globalParamsService.fetchGlobalParams().then(function (res) {
							if (res.status === 200 && angular.isDefined(res.data)) {
								authService.currentUser = res.data.userInfo;
								authService.isAuthenticated = true;
								userAccess.initialize();
								$scope.$close();
								$rootScope.$broadcast('userLoggedIn');
								$state.go('dating.pages.dashboard');
							}
						});
					});
			};

			signInBoxCtrl.showSignUpBox = showSignUpBox;
			signInBoxCtrl.mobile = popupData.mobile || false;
			signInBoxCtrl.canClose = popupData.canClose == true;
			signInBoxCtrl.siteDomain = GLOBALS.siteDomain;
			signInBoxCtrl.siteUrl = GLOBALS.siteUrl;
			signInBoxCtrl.showResetPasswordBox = showResetPasswordBox;
			signInBoxCtrl.getCurrentPage = function () {
				return PagesModel.getCurrentPage();
			};
		}
	)
	.controller(
		'SignUpBoxCtrl',
		function (
			$scope,
			$modalInstance,
			$state,
			UsersModel,
			PagesModel,
			showSignInBox,
			popupData,
			globalParamsService,
			authService,
			userAccess
		) {
			var signUpBoxCtrl = this;
			var GLOBALS = globalParamsService.GLOBALS;
			signUpBoxCtrl.days = UsersModel.getBirthdayDays();
			signUpBoxCtrl.months = UsersModel.getBirthdayMonths();
			signUpBoxCtrl.years = UsersModel.getBirthdayYears();
			signUpBoxCtrl.canClose = popupData.canClose || false;
			signUpBoxCtrl.mobile = popupData.mobile || false;
			signUpBoxCtrl.siteDomain = GLOBALS.siteDomain;
			signUpBoxCtrl.siteUrl = GLOBALS.siteUrl;
			signUpBoxCtrl.cupidMail = GLOBALS.cupidDomain;
			signUpBoxCtrl.isCreditsSite = parseInt(GLOBALS.isCreditsSite);

			function onlyUnique(value, index, self) {
				return self.indexOf(value) === index;
			}

			signUpBoxCtrl.signUpUser = function () {
				signUpBoxCtrl.isSubmitButtonDisabled = true;
				UsersModel.signUp(signUpBoxCtrl.newUser)
					.error(function (result) {
						signUpBoxCtrl.isSubmitButtonDisabled = false;
						signUpBoxCtrl.errors = result;
						if (signUpBoxCtrl.errors.email) {
							//"This email address already exists" is twice, i.e. {"email":["This email address already exists","This email address already exists"]}
							signUpBoxCtrl.errors.email = signUpBoxCtrl.errors.email.filter(onlyUnique);
						}
					})
					.then(function () {
						signUpBoxCtrl.isSubmitButtonDisabled = false;
						signUpBoxCtrl.errors = null;
						globalParamsService.fetchGlobalParams().then(function (res) {
							if (res.status === 200 && angular.isDefined(res.data)) {
								authService.currentUser = res.data.userInfo;
								authService.isAuthenticated = true;
								userAccess.initialize();
								$scope.$close();
								$state.go('dating.pages.dashboard');
							}
						});
					});
			};

			signUpBoxCtrl.showSignInBox = showSignInBox;
			signUpBoxCtrl.defaultBirthday = {
				day: parseInt(GLOBALS.defaultBirthDay.day),
				month: parseInt(GLOBALS.defaultBirthDay.month),
				year: parseInt(GLOBALS.defaultBirthDay.year)
			};
			signUpBoxCtrl.canClose = popupData.canClose == true;
			signUpBoxCtrl.getCurrentPage = function () {
				return PagesModel.getCurrentPage();
			};
		}
	)
	.controller('ResetPasswordBoxCtrl', function ($scope, $modalInstance, UsersModel, showSignInBox) {
		var resetPasswordBoxCtrl = this;

		resetPasswordBoxCtrl.resetPassForUser = function () {
			UsersModel.resetPassword(resetPasswordBoxCtrl.user)
				.error(function (result) {
					resetPasswordBoxCtrl.errors = result;
				})
				.then(function () {
					resetPasswordBoxCtrl.errors = null;
					resetPasswordBoxCtrl.messages = [
						'We sent an email to you containing instructions on how to reset you password. Check your inbox.'
					];
				});
		};

		resetPasswordBoxCtrl.showSignInBox = showSignInBox;
	})
	.controller(
		'UpdatePasswordBoxCtrl',
		function ($scope, $injector, UsersModel, globalParamsService, $state, $rootScope) {
			var updatePasswordBoxCtrl = this;
			var $modalInstance = null;
			if ($injector.has('$modalInstance')) {
				$modalInstance = $injector.get('$modalInstance');
			}
			var GLOBALS = globalParamsService.GLOBALS;
			updatePasswordBoxCtrl.imagesUrl = GLOBALS.baseUrl + '/styles/images/';
			updatePasswordBoxCtrl.awsImagesUrl = GLOBALS.s3Path + 'images/';
			updatePasswordBoxCtrl.showPassword = false;
			updatePasswordBoxCtrl.showRepeatPassword = false;
			updatePasswordBoxCtrl.isSubmitButtonDisabled = false;
			updatePasswordBoxCtrl.toggleShowPassword = function (field) {
				if (field === 'password') {
					updatePasswordBoxCtrl.showPassword = !updatePasswordBoxCtrl.showPassword;
				} else {
					updatePasswordBoxCtrl.showRepeatPassword = !updatePasswordBoxCtrl.showRepeatPassword;
				}
			};

			updatePasswordBoxCtrl.updatePassForUser = function () {
				updatePasswordBoxCtrl.isSubmitButtonDisabled = true;
				UsersModel.updatePassword(updatePasswordBoxCtrl.user)
					.error(function (result) {
						updatePasswordBoxCtrl.errors = result;
						updatePasswordBoxCtrl.isSubmitButtonDisabled = false;
					})
					.then(function () {
						updatePasswordBoxCtrl.errors = null;
						if ($modalInstance) {
							$modalInstance.close();
						}
						updatePasswordBoxCtrl.isSubmitButtonDisabled = false;
					});
				if (GLOBALS.loadMobileLayout) {
					$state.go('dating.pages.dashboard');
					$rootScope.$broadcast('overlay:hide', 'updatePassword');
				}
			};
		}
	);
