angular
	.module('dating.directives.updates', ['dating.models.updates'])
	.controller(
		'UpdatesListCtrl',
		function (
			$scope,
			UpdatesModel,
			MessagesModel,
			globalParamsService,
			authService,
			showSignInBox,
			$rootScope,
			PagesModel,
			monetizationHook,
			UpgradeDialog,
			$element,
			ProfilesModel,
			$state,
			$window
		) {
			var GLOBALS = globalParamsService.GLOBALS;
			var updatesListCtrl = this;
			var updatesCurrentPage = -1;
			updatesListCtrl.updates = [];
			updatesListCtrl.currentPage = 1;
			$scope.$on('tickerChanged', function () {
				reloadUpdates();
			});
			$scope.$on('userLoggedIn', function () {
				setCtrl();
			});
			function setCtrl() {
				updatesListCtrl.isLoggedIn = authService.isAuthenticated;
				updatesListCtrl.currentUser = authService.currentUser;
				updatesListCtrl.isMobile = parseInt(GLOBALS.isMobile);
				updatesListCtrl.updatesPerPage = parseInt(updatesListCtrl.count) || 8;
				var externalUpgradeUrl = updatesListCtrl.isLoggedIn ? GLOBALS.userInfo.partnerBillingRedirectUrl : '';
				updatesListCtrl.isExternalUpgradeSite = parseInt(GLOBALS.isExternalUpgradeSite);
				updatesListCtrl.upgradeUrl = updatesListCtrl.isExternalUpgradeSite ? externalUpgradeUrl : '/billing/upgrade';
				updatesListCtrl.upgradeUrlAddonForUpdate = GLOBALS.upgradeUrlAddonForUpdate;
				updatesListCtrl.isMainstream = GLOBALS.isMainstreamSite;
				updatesListCtrl.featureToggles = GLOBALS.featureToggles;
				updatesListCtrl.customFlowCredits = GLOBALS.customFlowCredits;
				updatesListCtrl.isCreditsSite = parseInt(GLOBALS.isCreditsSite);
				updatesListCtrl.nProfileInsteadOfLprofile = GLOBALS.nProfileInsteadOfLprofile;
				updatesListCtrl.monetizationOptions = GLOBALS.monetizationOptions;
				updatesListCtrl.monetizationHook = monetizationHook;
				updatesListCtrl.isRegularUpgradeSite = !updatesListCtrl.isExternalUpgradeSite && !updatesListCtrl.isCreditsSite;
				updatesListCtrl.maxUpdateChars = GLOBALS.maxUpdateChars;
				updatesListCtrl.maxMessageChars = GLOBALS.maxMessageChars;
				updatesListCtrl.showReplyForm = false;
				updatesListCtrl.showSignInBox = showSignInBox;
				updatesListCtrl.isSafeMode = authService.isAuthenticated ? !!authService.currentUser.safeMode : true;
				updatesListCtrl.showExoclickAds = !!(authService.isAuthenticated && authService.currentUser.showExoclickAds);
				updatesListCtrl.shouldShowUpdatesList = PagesModel.getCurrentPage() !== 'Profiles';
				updatesListCtrl.shouldShowUpgradePopup = +GLOBALS.showUpgradePopup && updatesListCtrl.isRegularUpgradeSite;
				if (+updatesListCtrl.featureToggles.exoClickAdsRefresh) {
					updatesListCtrl.onClickRefreshExoFooterAds = function () {
						$rootScope.$broadcast('refreshBanners');
					};
				}
				updatesListCtrl.editMessage = editMessage;
				updatesListCtrl.sendMessage = sendMessage;
				updatesListCtrl.sendUpdate = sendUpdate;
				updatesListCtrl.loadUpdates = loadUpdates;
				updatesListCtrl.deleteUpdate = deleteUpdate;
				updatesListCtrl.loadUpdates();
			}

			updatesListCtrl.showUpgrade = function () {
				UpgradeDialog.open();
			};
			function sendUpdate() {
				if (updatesListCtrl.currentUser.canSendMessages) {
					UpdatesModel.sendUpdate(updatesListCtrl.newUpdate).then(function (result) {
						updatesListCtrl.newUpdate.content = '';
						if (result.data) {
							updatesListCtrl.updates = result.data.concat(updatesListCtrl.updates);
							updatesListCtrl.loadUpdates();
						}
					});
				} else {
					if (updatesListCtrl.shouldShowUpgradePopup) {
						updatesListCtrl.showUpgrade();
					} else {
						window.location.href = updatesListCtrl.upgradeUrl + '?' + updatesListCtrl.upgradeUrlAddonForUpdate;
					}
				}
			}
			updatesListCtrl.handleReveal = function (profile) {
				var data = { userId: profile.externalId };
				if (!updatesListCtrl.isLoggedIn) {
					$state.go('dating.pages.viewProfile', { id: profile.externalId });
				} else {
					if (GLOBALS.isCreditsSite) {
						if (updatesListCtrl.currentUser.membership === 'premium' && !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 = updatesListCtrl.upgradeUrl + '?revealLocationUpgrade=1';
						}
					} else {
						if (updatesListCtrl.isExternalUpgradeSite) {
							$window.location.href = updatesListCtrl.upgradeUrl;
						} else if (updatesListCtrl.shouldShowUpgradePopup) {
							updatesListCtrl.showUpgrade();
						} else {
							$window.location.href = updatesListCtrl.upgradeUrl + '?revealLocationUpgrade=1';
						}
					}
				}
			};
			function loadUpdates($el) {
				updatesListCtrl.isLoading = true;
				UpdatesModel.getUpdates(updatesCurrentPage + 1, updatesListCtrl.targetId, updatesListCtrl.updatesPerPage).then(
					function (result) {
						updatesListCtrl.isLoading = false;
						if (result.length) {
							updatesListCtrl.updates = updatesListCtrl.updates.concat(result);
							updatesCurrentPage++;
							updatesListCtrl.currentPage++;
						} else {
							if ($el) {
								$el.attr('disabled', true).addClass('disabled').off('click');
								$el.find('.text').text($el.attr('data-no-updates') ? $el.attr('data-no-updates') : 'No more updates');
							}
						}
					}
				);
			}

			function reloadUpdates() {
				updatesListCtrl.isLoading = true;
				updatesCurrentPage = -1;
				updatesListCtrl.updates = [];
				UpdatesModel.getUpdates(updatesCurrentPage + 1, updatesListCtrl.targetId, updatesListCtrl.updatesPerPage).then(
					function (result) {
						updatesListCtrl.isLoading = false;
						if (result.length) {
							updatesListCtrl.updates = updatesListCtrl.updates.concat(result);
							updatesCurrentPage++;
							updatesListCtrl.currentPage++;
						}
					}
				);
			}

			function deleteUpdate(updateId, $update) {
				UpdatesModel.deleteUpdate(updateId).then(function () {
					$update.hide();
				});
			}

			function sendMessage(update) {
				if (updatesListCtrl.currentUser.canSendMessages) {
					update.newMessage.receiverId = update.externalId;
					update.isSending = true;
					MessagesModel.sendMessage(update.newMessage).then(function () {
						update.messageSent = true;
						update.isSending = false;
						update.newMessage.content = '';
					});
				} else {
					MessagesModel.logMessageAttempt(update.externalId);
					if (updatesListCtrl.shouldShowUpgradePopup) {
						updatesListCtrl.showUpgrade();
					} else {
						window.location.href = updatesListCtrl.upgradeUrl;
					}
				}
			}

			function editMessage(update) {
				if (update.newMessage.content !== '') {
					update.messageSent = false;
				}
			}

			$scope.$on('sign-out:success', function () {
				updatesListCtrl.isLoggedIn = false;
				updatesListCtrl.currentUser = null;
			});
			$scope.$on('$locationChangeStart', function () {
				updatesListCtrl.shouldShowUpdatesList = PagesModel.getCurrentPage() != 'Profiles';
			});

			$scope.$watch(
				function () {
					return authService.currentUser ? authService.currentUser.safeMode : null;
				},
				function (newValue, oldValue) {
					if (newValue !== oldValue) {
						reloadUpdates();
					}
				},
				true
			);
			$element.on('click', '#load-more-updates-btn', function (ev) {
				updatesListCtrl.loadUpdates($(ev.currentTarget));
			});
			$element.on('click', '.delete-update', function (ev) {
				ev.preventDefault();
				var $el = $(ev.target);
				updatesListCtrl.deleteUpdate($el.data('id'), $el.parents('.update-cnt:first'));
			});
			setCtrl();
		}
	)
	.directive('updates', function () {
		return {
			restrict: 'E',
			controller: 'UpdatesListCtrl',
			controllerAs: 'updatesListCtrl',
			bindToController: true,
			scope: {
				showAddForm: '@showAddForm',
				showLoadMore: '@showLoadMore',
				textLoadMore: '@textLoadMore',
				textNoUpdates: '@textNoUpdates',
				textEmptyList: '@textEmptyList',
				textSendButton: '@textSendButton',
				showCharsLeft: '@showCharsLeft',
				showDelete: '@showDelete',
				showReply: '@showReply',
				showNewImages: '@showNewImages',
				targetId: '@targetId'
			},
			templateUrl: globalParams.templateUrls.directives.updates
		};
	});
