/// <reference path=".#ts/client.d.ts" />

var dataLayer = this.dataLayer = [];

var userArgs: any = {};

function userArgsReady() {
	if (Meteor.loggingIn()) {
		// console.log('logging in...');
		return false;
	}
	if (Meteor.userId()) {
		var user = Users.Profile.active();
		if (!user) {
			// if (!Backend.isProduction) {
			// 	console.log('logged in and user data not here yet...');
			// }
			return false;
		}
		if (Reporting.Tag.db.find().count() !== user.tags.ids.length) {
			// if (!Backend.isProduction) {
			// 	console.log('user tags not here yet...');
			// }
			return false;
		}
		if (user.tracker.id && !user.tracker.fetch()) {
			// if (!Backend.isProduction) {
			// 	console.log('user tracker not here yet...');
			// }
			return false;
		}
		if (user.affiliate.id && !user.affiliate.fetch()) {
			// if (!Backend.isProduction) {
			// 	console.log('user affiliate not here yet...');
			// }
			return false;
		}
	}
	return true;
}

var userArgsDep = new Tracker.Dependency();
Tracker.autorun(function () {
	if (!userArgsReady()) {
		// if (!Backend.isProduction) {
		// 	console.log('user args not ready...');
		// }
		return;
	}
	if (Meteor.userId()) {
		userArgs = {
			visitorLoginStatus: 'Logged in',
			visitorId: gtmVisitorId(),
			visitorAffiliate: gtmAffiliate(),
			visitorTracker: gtmTracker(),
			userstagValue: gtmTag('Value'),
			userstagLifestage: gtmTag('Lifestage'),
			visitorUsername: Users.Profile.active().username
		};
	}
	else {
		userArgs = {
			visitorLoginStatus: 'Logged out',
			visitorId: 'Anonymous',
			visitorAffiliate: undefined,
			visitorTracker: undefined,
			userstagValue: undefined,
			userstagLifestage: undefined,
			visitorUsername: undefined
		};
	}
	userArgsDep.changed();
});

googleSend({
	eventCategory: 'Main',
	eventAction: 'Initial page load',
	event: 'Page Load'
});

function googleSend(args, waitUser = false) {

	// if (!Backend.isProduction) {
	// 	console.log('initiating send:', args);
	// }

	Tracker.autorun(function () {
		// if (!Backend.isProduction) {
		// 	console.log('trying to send', args);
		// }
		userArgsDep.depend();
		if (!userArgsReady() || (waitUser && !userArgs.visitorUsername)) {
			// if (!Backend.isProduction) {
			// 	console.log('user args not ready...', args);
			// }
			return;
		}
		Tracker.currentComputation.stop();
		// All GTM parameters. Sending all of them even if empty
		var gtmArgs = _.extend({
			'event': undefined,
			'eventCategory': undefined,
			'eventAction': undefined,
			'eventLabel': undefined,
			'eventValue': undefined,
			'pageEventArea': undefined,
			'pageModule': undefined,
			'pageActiveTab': gtmActiveTab(),
			'pageVertical': undefined,
			'pageLocale': gtmActiveLang(),
			'pageProduct': undefined,
			'pageGameName': undefined,
			'deviceOrientation': getScreenOrientation(),
			'creativeUrl': undefined,
			'registrationsStarted': undefined,
			'registrationsCompleted': undefined,
			'engagementImpressions': undefined,
			'engagementClicks': undefined,
			'deposits': undefined,
			'depositAmount': undefined,
			'withdrawals': undefined,
			'clickedPlayForFun': undefined,
			'clickedPlayForReal': undefined,
			'starRating': undefined,
			'depositCount': undefined,
			'depositTotal': undefined
		}, userArgs);

		// if (!Backend.isProduction) {
		// 	console.log('sending...', gtmArgs);
		// }
		// GTM param name to GA param name map
		var gaParam = {
			eventCategory: 'eventCategory',
			eventAction: 'eventAction',
			eventLabel: 'eventLabel',
			visitorId: 'dimension1',
			pageVertical: 'dimension2',
			pageModule: 'dimension3',
			pageActiveTab: 'dimension4',
			pageGameName: 'dimension5',
			pageLocale: 'dimension6',
			pageProduct: 'dimension7',
			pageEventArea: 'dimension8',
			visitorLoginStatus: 'dimension9',
			creativeUrl: 'dimension10',
			deviceOrientation: 'dimension11',
			depositAmount: 'metrics1',
			registrationsStarted: 'metrics2',
			registrationsCompleted: 'metrics3',
			engagementImpressions: 'metrics4',
			engagementClicks: 'metrics5',
			deposits: 'metrics6',
			withdrawals: 'metrics7',
			clickedPlayForFun: 'metrics8',
			clickedPlayForReal: 'metrics9',
			starRating: 'metrics10'
		};

		// Converting GTM property names to GA property names
		var gaArgs = {};
		gaArgs['hitType'] = 'event';
		gaArgs['dimension1'] = gtmVisitorId();
		gaArgs['dimension9'] = gtmLoginStatus();
		gaArgs['dimension4'] = gtmActiveTab();
		gaArgs['dimension6'] = gtmActiveLang();
		gaArgs['dimension11'] = getScreenOrientation();

		_.each(args, function (val, key) {
			if (gaParam[key] && val) {
				gaArgs[gaParam[key]] = val;
			}
		});
		// Overriding default GTM values with incoming ones
		_.each(args, function (val, key) {
			gtmArgs[key] = val;
		});

		if (gtmArgs['event'] != 'Page Load') {
			gtmArgs['event'] = gtmArgs['eventCategory'] + '+' + gtmArgs['eventAction'];
		}

		// Sending GTM event
		dataLayer.push(gtmArgs);

		// Sending GA event
		if (typeof ga === 'function') {
			ga('send', gaArgs);
		}

		Events.EventClient.add({
			type: gtmArgs['event'],
			tracker: $.cookie('refCode'),
			reference: location.pathname
		});
	});

}

function gtmActiveTab() {
	if (!Pages.Page.root) {
		return;
	}
	return typeof Pages.active().title == 'function' ? (<any>Pages.active()).title() : Pages.active().title;
}

function gtmVisitorId() {
	return Users.Profile.active() ? Users.Profile.active()._id : 'Anonymous';
}

function gtmAffiliate() {
	var user = Users.Profile.active();
	if (!user) {
		return undefined;
	}

	var affiliate = user.affiliate;
	if (!affiliate) {
		return undefined;
	}
	var aff = affiliate.fetch();

	if (!aff || !aff.name) {
		return undefined;
	}
	return aff.name;
}

function gtmTracker() {
	var user = Users.Profile.active();
	if (!user) {
		return undefined;
	}

	var userTracker = user.tracker;
	if (!userTracker) {
		return undefined;
	}
	var tracker = userTracker.fetch();

	if (!tracker || !tracker.name) {
		return undefined;
	}
	return tracker.name;
}

function gtmTag(name: string) {
	var user = Users.Profile.active();
	if (!user) {
		return;
	}
	var group = Reporting.TagGroup.db.findOne({name});
	if (!group) {
		return;
	}
	var tag = user.tags.first({group});
	if (!tag) {
		return;
	}
	return tag._id;
}

function gtmLoginStatus() {
	return Users.Profile.active() ? 'Logged in' : 'Logged out';
}

function gtmActiveLang() {
	return Session.get('activeLanguage');
}

this.googleSend = googleSend;
this.gtmActiveTab = gtmActiveTab;
this.gtmVisitorId = gtmVisitorId;
this.gtmLoginStatus = gtmLoginStatus;
this.gtmActiveLang = gtmActiveLang;
this.gtmAffiliate = gtmAffiliate;
this.gtmTracker = gtmTracker;
this.gtmTag = gtmTag;

