angular
	.module('dating.directives.profilesList', ['dating.models.profiles'])
	.controller(
		'ProfilesListCtrl',
		function (
			ProfilesModel,
			globalParamsService,
			ProfilePreviewDialog,
			authService,
			$scope,
			$state,
			$rootScope,
			monetizationHook,
			UpgradeDialog,
			$window
		) {
			var GLOBALS = globalParamsService.GLOBALS;
			var profilesListCtrl = this,
				currentPage = profilesListCtrl.currentPage || 1,
				profilesPerPage = profilesListCtrl.count || 8;
			$scope.$on('tickerChanged', function (event, changedKeys) {
				var triggers = {
					NewViewedYou: 'viewed-you',
					NewLikesYou: 'likes-you',
					NewMatches: 'matches',
					NewMembers: 'new-members',
					NearYou: 'near-you',
					OnlineNow: 'online-now'
				};
				changedKeys.map(function (key) {
					if (triggers[key]) {
						if (profilesListCtrl.type === triggers[key]) {
							loadProfiles(true);
						}
					}
				});
			});
			profilesListCtrl.currentUser = authService.currentUser;
			profilesListCtrl.isMobile = parseInt(GLOBALS.isMobile);
			profilesListCtrl.isExternalUpgradeSite = parseInt(GLOBALS.isExternalUpgradeSite);
			profilesListCtrl.nProfileInsteadOfLprofile = GLOBALS.nProfileInsteadOfLprofile;
			profilesListCtrl.isLoggedIn = authService.isAuthenticated;
			var externalUpgradeUrl = profilesListCtrl.isLoggedIn ? GLOBALS.userInfo.partnerBillingRedirectUrl : '';
			profilesListCtrl.upgradeUrl = parseInt(GLOBALS.isExternalUpgradeSite) ? externalUpgradeUrl : '/billing/upgrade';
			profilesListCtrl.isPremiumUser = profilesListCtrl.isLoggedIn
				? profilesListCtrl.currentUser.membership === 'premium'
				: false;
			profilesListCtrl.themePath = GLOBALS.baseUrl;
			profilesListCtrl.featureToggles = GLOBALS.featureToggles;
			profilesListCtrl.monetizationOptions = GLOBALS.monetizationOptions;
			profilesListCtrl.monetizationHook = monetizationHook;
			profilesListCtrl.isCreditsSite = parseInt(GLOBALS.isCreditsSite);
			profilesListCtrl.isRegularUpgradeSite =
				!profilesListCtrl.isExternalUpgradeSite && !profilesListCtrl.isCreditsSite;
			profilesListCtrl.shouldShowUpgradePopup = +GLOBALS.showUpgradePopup && profilesListCtrl.isRegularUpgradeSite;
			profilesListCtrl.pageChanged = function () {
				if (profilesListCtrl.plist != undefined) {
					$state.go('dating.pages.plist', {
						section: profilesListCtrl.plist,
						page: profilesListCtrl.currentPage
					});
				} else {
					loadProfiles();
				}
			};
			var loadProfiles = function (isTickerInvoked) {
				if (isTickerInvoked) {
					profilesListCtrl.profiles = [];
				}
				profilesListCtrl.isLoading = true;
				ProfilesModel.getProfilesList(
					profilesListCtrl.currentPage,
					profilesListCtrl.type,
					profilesListCtrl.profilesPerPage
				).then(function (result) {
					profilesListCtrl.profiles = result.profiles;
					profilesListCtrl.totalProfiles = result.total_profiles;
					profilesListCtrl.currentPage = result.current_page;
					profilesListCtrl.isLoading = false;
					if (parseInt(profilesListCtrl.totalProfiles) <= parseInt(profilesListCtrl.profilesPerPage)) {
						profilesListCtrl.hidePagination = true;
					}
				});
			};
			profilesListCtrl.profilesPerPage = profilesPerPage;
			profilesListCtrl.currentPage = currentPage;
			profilesListCtrl.isLoading = true;
			profilesListCtrl.currentUser = authService.currentUser;
			profilesListCtrl.sendingMatch = [];
			profilesListCtrl.showMatchStamp = [];
			if (profilesListCtrl.currentUser) {
				loadProfiles();
			}
			profilesListCtrl.getRange = function (n) {
				if (n < 0) {
					n = 0;
				}
				return new Array(n);
			};

			profilesListCtrl.showIndicator = true;
			$scope.$on('hideIndicator', function () {
				profilesListCtrl.showIndicator = false;
			});

			if (+profilesListCtrl.featureToggles.loadProfilesOnSuccess) {
				$scope.$on('play-vote:success', function () {
					loadProfiles();
				});
			}

			profilesListCtrl.sendMatch = function (profileId, status, showMatchStamp) {
				showMatchStamp = typeof showMatchStamp == 'undefined' ? false : showMatchStamp;
				if (status === 'redirect') {
					$state.go('dating.pages.viewProfile', { id: profileId });
					return;
				}
				if (showMatchStamp) {
					profilesListCtrl.showMatchStamp[profileId] = true;
				}
				_.each(profilesListCtrl.profiles, function (value) {
					if (value.id == profileId) {
						value.matchStatus = status == 'accept' ? 'match' : 'youLiked';
					}
				});
				ProfilesModel.sendMatch(profileId, status).then(function () {
					profilesListCtrl.showMatchStamp[profileId] = false;
					$state.go('dating.pages.viewProfile', { id: profileId });
				});
			};
			profilesListCtrl.previewProfile = function (profileId) {
				ProfilePreviewDialog.open(profileId).then(function () {
					$state.go('dating.pages.dashboard');
				});
			};

			profilesListCtrl.showUpgrade = function () {
				UpgradeDialog.open();
			};

			if (GLOBALS.parentSite == 'discreetcrush') {
				profilesListCtrl.onClickRefreshExoFooterAds = function () {
					$rootScope.$broadcast('refreshBanners');
				};
			}
			profilesListCtrl.handleReveal = function (profile) {
				var data = { userId: profile.id };
				if (!profilesListCtrl.isLoggedIn) {
					$state.go('dating.pages.viewProfile', { id: profile.id });
				} else {
					if (GLOBALS.isCreditsSite) {
						if (profilesListCtrl.isPremiumUser && !GLOBALS.userInfo.hasInsufficientCreditsFlag) {
							ProfilesModel.sendRevealLocation(data).then(function (response) {
								profile.showDistanceInsteadOfLocation = false;
								profile.country = response.data.location.country;
								profile.city = response.data.location.city;
								profile.location = profile.city + ', ' + profile.country;
								profile.bCanRequestPhoto = false;
								profile.isPhotoRequestDisabled = false;
							});
						} else {
							$window.location.href = profilesListCtrl.upgradeUrl + '?revealLocationUpgrade=1';
						}
					} else {
						if (profilesListCtrl.shouldShowUpgradePopup) {
							profilesListCtrl.showUpgrade();
						} else {
							$window.location.href = profilesListCtrl.upgradeUrl;
						}
					}
				}
			};
			$scope.$on('sign-out:success', function () {
				profilesListCtrl.currentUser = null;
			});
			$scope.$watch(
				function () {
					return authService.currentUser ? authService.currentUser.safeMode : null;
				},
				function (newValue, oldValue) {
					if (newValue !== oldValue) {
						loadProfiles();
					}
				},
				true
			);
		}
	)
	.directive('profileslist', function () {
		return {
			restrict: 'E',
			controller: 'ProfilesListCtrl',
			controllerAs: 'profilesListCtrl',
			bindToController: true,
			scope: {
				type: '@type',
				count: '@count',
				hidePagination: '@hidePagination',
				plist: '@plist',
				hideTotalPhotos: '@hideTotalPhotos',
				hideLocation: '@hideLocation',
				hideGender: '@hideGender',
				owlc: '@owlc',
				currentPage: '@currentPage',
				section: '@section'
			},
			templateUrl: globalParams.templateUrls.directives.profiles_list,
			link: function () {}
		};
	})
	.service('ProfilePreviewDialog', function ($q, $modal) {
		var ProfilePreviewDialog = this;
		var modalInstance;

		ProfilePreviewDialog.open = function (profileId) {
			var deferred = $q.defer();

			modalInstance = $modal.open({
				templateUrl: globalParams.templateUrls.helpers.profile_preview,
				controller: 'ProfilePreviewDialogCtrl as profilePreviewDialogCtrl',
				size: 'profilePreview',
				keyboard: false,
				backdrop: 'static',
				animation: false,
				resolve: {
					profileId: function () {
						return profileId;
					},

					deferred: function () {
						return deferred;
					}
				}
			});

			return deferred.promise.finally(function () {
				modalInstance.close();
			});
		};

		return ProfilePreviewDialog;
	})
	.controller(
		'ProfilePreviewDialogCtrl',
		function ($state, $modalInstance, ProfileData, ProfilesModel, profileId, deferred) {
			var profilePreviewDialogCtrl = this;
			ProfilesModel.getProfile(profileId).then(function (result) {
				profilePreviewDialogCtrl.profile = new ProfileData(result);
			});
			profilePreviewDialogCtrl.sendMatch = function (status) {
				if (status == 'like') {
					profilePreviewDialogCtrl.profile.set('matchStatus', 'youLiked');
				} else if (status == 'accept') {
					profilePreviewDialogCtrl.profile.set('matchStatus', 'match');
				}
				ProfilesModel.sendMatch(profileId, status).then(function (result) {
					ProfilesModel.getProfile(profileId).then(function () {
						profilePreviewDialogCtrl.profile = new ProfileData(result);
					});
				});
			};

			profilePreviewDialogCtrl.close = function () {
				deferred.reject();
			};
		}
	);
