angular
	.module('dating.directives.activity', ['dating.models.activity'])
	.controller(
		'ActivityCtrl',
		function (
			$sce,
			$scope,
			ActivityModel,
			MessagesModel,
			ProfilesModel,
			authService,
			$rootScope,
			monetizationHook,
			globalParamsService,
			$state,
			$window,
			UsersModel,
			UpgradeDialog,
			$element
		) {
			var GLOBALS = globalParamsService.GLOBALS;
			var activityCurrentPage = -1;
			var activityCtrl = this;
			activityCtrl.profilesPerPage = parseInt(activityCtrl.count) || 8;
			activityCtrl.activity = [];
			activityCtrl.sendMessage = sendMessage;
			$scope.$on('tickerChanged', function () {
				activityCurrentPage = -1;
				activityCtrl.loadActivity(null, true);
			});
			$scope.$on('userLoggedIn', function () {
				setCtrl();
			});
			function setCtrl() {
				activityCtrl.isExternalUpgradeSite = parseInt(GLOBALS.isExternalUpgradeSite);
				activityCtrl.monetizationOptions = GLOBALS.monetizationOptions;
				activityCtrl.monetizationHook = monetizationHook;
				activityCtrl.isCreditsSite = parseInt(GLOBALS.isCreditsSite);
				activityCtrl.isRegularUpgradeSite = !activityCtrl.isExternalUpgradeSite && !activityCtrl.isCreditsSite;
				activityCtrl.currentUser = authService.currentUser;
				activityCtrl.isLoggedIn = authService.isAuthenticated;
				var externalUpgradeUrl = activityCtrl.isLoggedIn ? GLOBALS.userInfo.partnerBillingRedirectUrl : '';
				activityCtrl.upgradeUrl = parseInt(GLOBALS.isExternalUpgradeSite) ? externalUpgradeUrl : '/billing/upgrade';
				activityCtrl.isPremiumUser = activityCtrl.isLoggedIn
					? activityCtrl.currentUser.membership === 'premium'
					: false;
				activityCtrl.customFlowCredits = GLOBALS.customFlowCredits;
				activityCtrl.featureToggles = GLOBALS.featureToggles;
				activityCtrl.nProfileInsteadOfLprofile = GLOBALS.nProfileInsteadOfLprofile;
				activityCtrl.shouldShowUpgradePopup = +GLOBALS.showUpgradePopup && activityCtrl.isRegularUpgradeSite;
				if (+activityCtrl.featureToggles.exoClickAdsRefresh) {
					activityCtrl.onClickRefreshExoFooterAds = function () {
						$rootScope.$broadcast('refreshBanners');
					};
				}
				activityCtrl.loadActivity = loadActivity;
				activityCtrl.loadActivity();
			}

			function loadActivity($el, loadForTicker) {
				activityCtrl.isLoading = true;
				ActivityModel.getActivity(activityCurrentPage + 1, activityCtrl.profilesPerPage).then(function (result) {
					if (result.length) {
						if (loadForTicker) {
							activityCtrl.activity = result;
						} else {
							activityCtrl.activity = activityCtrl.activity.concat(result);
							activityCurrentPage++;
						}
					} else {
						if ($el) {
							$el.attr('disabled', true).addClass('disabled').off('click');
							$el.find('.text').text($el.attr('data-no-activity') ? $el.attr('data-no-activity') : 'No more activity');
						}
					}
					activityCtrl.isLoading = false;
				});
			}

			activityCtrl.sendMatch = function (id, type, username) {
				ProfilesModel.sendMatch(id, type).then(function () {
					_.each(activityCtrl.activity, function (value) {
						if (value.username == username) {
							value.matchStatus = type == 'accept' ? 'match' : 'youLiked';
						}
					});
				});
			};

			activityCtrl.sendPhotoRequest = function (id, username) {
				var data = { userId: id };
				_.each(activityCtrl.activity, function (value) {
					if (value.username === username) {
						value.isPhotoRequestDisabled = true;
					}
				});
				ProfilesModel.sendPhotoRequest(data).then(function () {
					_.each(activityCtrl.activity, function (value) {
						if (value.username === username) {
							value.bCanRequestPhoto = false;
							value.isPhotoRequestDisabled = false;
						}
					});
				});
			};
			activityCtrl.showUpgrade = function () {
				UpgradeDialog.open();
			};

			function sendMessage(activity) {
				if (!activity.newMessage || !activity.newMessage.content) {
					activity.emptyMessage = true;
				} else if (activityCtrl.currentUser.canSendMessages) {
					if (GLOBALS.isCreditsSite && activityCtrl.currentUser.membership === 'premium') {
						UsersModel.checkInsufficientCredits().then(function (response) {
							if (response.data && response.data.hasInsufficientCreditsFlag) {
								$rootScope.$broadcast('showPurchaseModal');
							}
						});
					}
					activity.newMessage.receiverId = activity.profileId;
					activity.isSending = true;
					MessagesModel.sendMessage(activity.newMessage).then(function () {
						activity.isSending = false;
						activity.newMessage.content = '';
						activity.sendMessageFeedback = $sce.trustAsHtml(
							"Message sent. View conversation history <a href='" +
								'/profile/view/id/' +
								activity.newMessage.receiverId +
								"'>here</a>"
						);
					});
				} else {
					MessagesModel.logMessageAttempt(activity.profileId);
					if (activityCtrl.shouldShowUpgradePopup) {
						activityCtrl.showUpgrade();
					} else {
						window.location.href = activityCtrl.upgradeUrl;
					}
				}
			}

			$scope.$on('sign-out:success', function () {
				activityCtrl.isLoggedIn = false;
				activityCtrl.currentUser = null;
			});
			activityCtrl.goToProfile = function (profileId) {
				$state.go('dating.pages.viewProfile', { id: profileId });
			};
			activityCtrl.handleReveal = function (profile) {
				var data = { userId: profile.profileId };
				if (!activityCtrl.isLoggedIn) {
					$state.go('dating.pages.viewProfile', { id: profile.id });
				} else {
					if (GLOBALS.isCreditsSite) {
						if (activityCtrl.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 = activityCtrl.upgradeUrl + '?revealLocationUpgrade=1';
						}
					} else {
						if (activityCtrl.shouldShowUpgradePopup) {
							activityCtrl.showUpgrade();
						} else {
							$window.location.href = activityCtrl.upgradeUrl;
						}
					}
				}
			};
			$element.on('click', '#load-more-activity-btn', function (ev) {
				ev.stopPropagation();
				activityCtrl.loadActivity($(ev.currentTarget));
			});
			setCtrl();
		}
	)
	.directive('activity', function () {
		return {
			restrict: 'E',
			controller: 'ActivityCtrl',
			controllerAs: 'activityCtrl',
			bindToController: true,
			scope: {
				count: '@count',
				showLoadMore: '@showLoadMore',
				textLoadMore: '@textLoadMore',
				textNoActivity: '@textNoActivity'
			},
			templateUrl: globalParams.templateUrls.directives.activity
		};
	});
