angular
	.module('dating.directives.featured', ['dating.models.featured'])
	.factory('FeaturedMembershipService', function (FeaturedModel, $q, globalParamsService) {
		var GLOBALS = globalParamsService.GLOBALS;
		var profileState = {
			featuredProfile: '',
			isFeatured: GLOBALS.userInfo.isFeatured
		};

		return {
			getRandomFeaturedProfile: function (count) {
				var deferred = $q.defer();
				if (profileState.featuredProfile) {
					deferred.resolve(profileState.featuredProfile);
					return deferred.promise;
				}
				if (typeof count === 'undefined') {
					count = 5;
				}
				FeaturedModel.getFeaturedProfiles(count).then(function (result) {
					if (result.profiles && result.profiles.length > 0) {
						var randomIndex = Math.floor(Math.random() * result.profiles.length);
						profileState.featuredProfile = result.profiles[randomIndex];
						deferred.resolve(profileState.featuredProfile);
					} else {
						deferred.reject('No profiles found');
					}
				});
				return deferred.promise;
			},
			setIsFeatured: function (value) {
				profileState.isFeatured = value;
				return;
			},
			getIsFeatured: function () {
				return profileState.isFeatured;
			}
		};
	})
	.service('showFeaturedMembershipModal', function ($modal, $modalStack, InsufficientCreditsStateService) {
		var modalInstance = null;

		return {
			openModal: function () {
				modalInstance = $modal.open({
					templateUrl: globalParams.templateUrls.pages.featured_membership_popup,
					controller: 'FeaturedCtrl as featuredCtrl',
					keyboard: false,
					backdrop: 'static',
					backdropClass: 'modal-backdrop-featured-membership-popup',
					animation: false,
					size: 'featuredMembershipPopup'
				});
			},
			closeModal: function () {
				if (modalInstance && modalInstance.close) {
					modalInstance.close();
					modalInstance = null;
					InsufficientCreditsStateService.resetModalValue();
				}
			}
		};
	})
	.controller(
		'FeaturedCtrl',
		function (
			$sce,
			$scope,
			FeaturedModel,
			FeaturedMembershipService,
			MessagesModel,
			ProfilesModel,
			authService,
			globalParamsService,
			showFeaturedMembershipModal,
			$rootScope,
			InsufficientCreditsStateService
		) {
			var GLOBALS = globalParamsService.GLOBALS;
			var profiles = [],
				FeaturedCtrl = this,
				profilesCount = parseInt(FeaturedCtrl.count);

			FeaturedCtrl.profilesCount = profilesCount;
			FeaturedCtrl.profiles = profiles;
			FeaturedCtrl.randomProfile = {};
			FeaturedCtrl.loadFeaturedProfiles = loadFeaturedProfiles();

			FeaturedMembershipService.getRandomFeaturedProfile().then(function (profile) {
				FeaturedCtrl.randomProfile = profile;
			});

			FeaturedCtrl.successfullyPurchased = GLOBALS.userInfo.isFeatured;
			FeaturedCtrl.creditsForFeaturedMembership = GLOBALS.creditsForFeaturedMembership;

			FeaturedCtrl.showFeaturedMembershipModal = function () {
				showFeaturedMembershipModal.openModal();
			};

			FeaturedCtrl.closeAndResetModal = function () {
				showFeaturedMembershipModal.closeModal();
				InsufficientCreditsStateService.resetModalValue();
			};

			FeaturedCtrl.purchaseFeaturedMembershipCredits = function () {
				FeaturedModel.purchaseFeaturedCredits()
					.then(function (res) {
						if (res.message == 'Failed to reduce credits') {
							InsufficientCreditsStateService.setModalValue('featuredInsufficient');
							$rootScope.$broadcast('showPurchaseModal');
							return;
						} else if (res.message !== 'ok') {
							throw new Error(res.message);
						}
						FeaturedMembershipService.setIsFeatured(true);
						FeaturedCtrl.successfullyPurchased = true;
						globalParamsService.fetchGlobalParams();
						$rootScope.$broadcast('featuredMembershipPurchased');
					})
					.catch(function (err) {
						console.error(err);
					});
			};

			function loadFeaturedProfiles() {
				FeaturedCtrl.isLoading = true;
				FeaturedModel.getFeaturedProfiles(FeaturedCtrl.profilesCount).then(function (result) {
					if (result.profiles) {
						FeaturedCtrl.profiles = result.profiles;
					}
					FeaturedCtrl.isLoading = false;
				});
			}

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

			FeaturedCtrl.sendPhotoRequest = function (id, username) {
				var data = { userId: id };
				_.each(FeaturedCtrl.profiles, function (value) {
					if (value.username == username) {
						value.isPhotoRequestDisabled = true;
					}
				});
				ProfilesModel.sendPhotoRequest(data).then(function () {
					_.each(FeaturedCtrl.profiles, function (value) {
						if (value.username == username) {
							value.bCanRequestPhoto = false;
							value.isPhotoRequestDisabled = false;
						}
					});
				});
			};

			FeaturedCtrl.sendMessage = sendMessage;
			FeaturedCtrl.isLoggedIn = authService.isAuthenticated;
			FeaturedCtrl.currentUser = authService.currentUser;
			FeaturedCtrl.isFeatured = authService.currentUser.isFeatured;
			var externalUpgradeUrl = FeaturedCtrl.isLoggedIn ? GLOBALS.userInfo.partnerBillingRedirectUrl : '';
			FeaturedCtrl.upgradeUrl = parseInt(GLOBALS.isExternalUpgradeSite) ? externalUpgradeUrl : '/billing/upgrade';

			function sendMessage(activity) {
				if (!activity.newMessage || !activity.newMessage.content) {
					activity.emptyMessage = true;
				} else if (FeaturedCtrl.currentUser.canSendMessages) {
					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);
					window.location.href = FeaturedCtrl.upgradeUrl;
				}
			}

			$scope.$on('sign-out:success', function () {
				FeaturedCtrl.isLoggedIn = false;
				FeaturedCtrl.currentUser = null;
			});
		}
	)
	.directive('featured', function () {
		return {
			restrict: 'E',
			controller: 'FeaturedCtrl',
			controllerAs: 'featuredCtrl',
			bindToController: true,
			scope: {
				count: '@count',
				textNoActivity: '@textNoActivity'
			},
			templateUrl: globalParams.templateUrls.directives.featured
		};
	});
