interface Templates {
	casino: Template;
}

function getGamesFilter() {
	var selector: any = {};

	if (Session.get('menuName')) {

		var productHandles = Casino.Product.db.find({active: true}).fetch().map(function (x) {
			return {urlName: x.name.replace(/\W+/g, "").toLowerCase(), handle: x.handle};
		});

		if (Session.get('menuName') == 'favorite-games') {
			selector._id = {
				$in: Casino.Favorite.db.find().map(function (fav) {
					return fav.game.id;
				})
			}
		}
		else if (Session.get('menuName') == 'popular-games') {

		}
		else if (Session.get('menuName') == 'high-limits') {
			selector.isHighLimit = true;
		}
		else {
			var mi = Casino.MenuItem.db.findOne({handle: Session.get('menuName')});
			if (mi) {
				selector["category"] = {$in: (typeof mi.category.ids === 'string') ? [mi.category.ids] : mi.category.ids};
			}
		}
	}
	if (Session.get('gameSearch')) {
		selector.name = new RegExp(Session.get('gameSearch'), 'i');
	}
	return selector;
}

Template.casino.onCreated(function() {
		this.subscribe('Casino.MenuItem', {
			mobile: true
		});
		this.subscribe('Casino.Favorite');
		this.subscribe('Casino.Vote');

		Session.setDefault('gameListLimit', 40);

		var sort = {
			'siteSettings.sportsbet.isFeatured': -1,
			'siteSettings.sportsbet.isNew': -1,
			'siteSettings.sportsbet.isHot': -1,
			rating: -1,
			name: -1
		};

		this.autorun(() => {
			var selector: any = {type: Casino.detectGameType()};
			var options: any = {};

			if (Session.get('gameSearch')) {
				selector.name = {$regex: Session.get('gameSearch'), $options: 'i'};
			}

			var menuName = Session.get('menuName');

			if (menuName) {
				var productHandles = Casino.Product.db.find({active: true}).fetch().map(function (x) {
					return {urlName: x.name.replace(/\W+/g, "").toLowerCase(), handle: x.handle};
				});

				if (menuName == 'favorite-games') {
					selector._id = {
						$in: Casino.Favorite.db.find().map(function (fav) {
							return fav.game.id;
						})
					}
				}
				else if (menuName == 'popular-games') {

				}
				else if (Session.get('menuName') == 'high-limits') {
					selector.isHighLimit = true;
				}
				else {
					var mi = Casino.MenuItem.db.findOne({handle: Session.get('menuName')});
					if (mi) {
						if(mi.type == Casino.MenuItemType.GAMES){
							selector["category"] = {$in: (typeof mi.category.ids === 'string') ? [mi.category.ids] : mi.category.ids};
						}
						if (mi.type == Casino.MenuItemType.PRODUCTS) {
							selector["product"] = {$in: (typeof mi.product.ids === 'string') ? [mi.product.ids] : mi.product.ids};
						}
					}
				}
			}

			options.sort = sort;
			// options.limit = Session.get('gameListLimit');
			console.log('casino.ts 100', JSON.stringify(selector));
			this.gameSub = this.subscribe('Casino.Game', selector, options);
		});
		Casino.Game.db.setSort(sort);
});

Template.casino.onRendered(function() {

	this.autorun(() => {
		var liveCat = Casino.Category.db.findOne({name: capitalize(('live-' + Session.get('menuName')).replace('-', ' '))});
		if (Session.get('liveGamesSub') && liveCat) {
			this.subscribe('Casino.Game', {category: Session.get('liveGamesSub')});
		}
	});

});

Template.casino.helpers({

	games: function () {
		var selector = getGamesFilter();
		var options: any = {};
		options.limit = Session.get('gameListLimit');
		var games = Casino.Game.db.findSorted(selector, options).fetch();

		_.each(games, function (game: Casino.Game) {
			if (!game.categoryName && game.category.fetch()) {
				game.categoryName = game.category.fetch().name;
			}
		});
		return games;
	}

});

Template.casino.events({

	'click .navbar-toggle': function() {
		var tpl = Template.instance();
		tpl.setVar('showGameCategories', tpl.getVar('showGameCategories') ? false : true);

		googleSend({
			'eventCategory': 'Gaming',
			'eventAction': 'Opened Casino game categories',
			'pageVertical': 'Gaming',
			'pageEventArea': 'Main'
		});

	}

});
