import BetSlipBet = Betting.BetSlipBet;
Backend.site = <any>{
	handle: 'sportsbet-mobile'
};

declare var cdnUrl: string;
cdnUrl = `//cdn.coingaming.io/${Backend.site.handle}/`;

declare function ga(...args);

Tracker.autorun(function() {
	Meteor.userId();
	Meteor.subscribe('reporting/Tag');
});

UI.registerHelper('imagePath', function () {
	return cdnUrl;
});

UI.registerHelper('activeUser', function () {
	return Meteor.userId();
});

function displayOdds(odds) {
	var currentFormat = Session.get('oddsFormat') || Users.OddsFormat.DECIMAL;
	if (currentFormat === Users.OddsFormat.DECIMAL) {
		if (_.isUndefined(odds)) {
			return;
		}
		else {
			return odds.toFixed(2);
		}
	}
	else if (currentFormat === Users.OddsFormat.AMERICAN) {
		return Betting.decimalToAmerican(odds);
	}
	else if (currentFormat === Users.OddsFormat.FRACTIONAL) {
		return Betting.decimalToFractional(odds);
	}
}

Meteor.subscribe('betting/Sport');

function oddsFormat(name) {
	if (Session.get('oddsFormat') === Users.OddsFormat.AMERICAN) {
		name = name.replace('Match Odds', 'Moneyline');
		name = name.replace('Handicap', 'Spread');
		name = name.replace('Over/Under', 'Total Points');
		name = name.replace('Stake', 'Risk');
		name = name.replace('Potential Win', 'To Win');
	}
	return name;
}

function getGame() {
	var handle = Session.get('gameName');
	if (!handle) {
		return;
	}
	handle = handle.toLowerCase();
	var game = <Casino.GameClient>Casino.Game.db.findOne({handle: handle});
	if (!game) {
		return;
	}
	return game;
}

function getGameUrl() {
	if (!Template.instance().subscriptionsReady()) {
		return;
	}
	var game = getGame();
	var handle = game.handle;

	Countries.IpClient.getConnectionCountry(function (err, res) {
		if (err) {
			return;
		}
		Session.set('countryClient', res._id);
	});
	var country = Session.get('countryClient');

	if (!country) {
		return;
	}

	Casino.GameClient.checkIfBlocked(handle, country, function (err) {
		if (err) {
			Session.set('splashTemplate', err.reason);
		}
	});
	Casino.GameClient.checkIfExists(handle, function (err) {
		if (err) {
			Session.set('splashTemplate', 'gameError');
			Session.set('splashMessage', err.details);
		}
	});

	try {
		var url = Session.get('forFun') ? game.getDemoUrl('en') : game.getUrl('en');
	}
	catch (err) {
		if (['force_money_error', 'force_login_fun_error', 'force_login_error'].indexOf(err.reason) !== -1) {
			Session.set('splashTemplate', err.reason);
		}
		else {
			Session.set('splashTemplate', 'gameError');
		}
		Session.set('splashMessage', err.localeMessage);
	}

	if (url) {
		url = url.replace('exitURL=%2Fcasino', 'exitURL=https://' + document.domain);

		if (url.match(/betsoftgaming/i)) {
			url = url + '&homeUrl=https://' + document.domain;
		}

		if (url.match(/playngonetwork/i)) {
			url = url.replace('&lobby=/', ''); //this is fast fix
			url = url + '&lobby=http://bitcasino.io';
		}

		if (!Session.get('redirectCalled')) {
			Session.set('redirectCalled', true);
			location.replace(url);
		}
	}
	//return url;
	return;
}

function calcAge(dateString) {
	var birthday = +new Date(dateString);
	/* tslint:disable */
	return ~~((Date.now() - birthday) / (31557600000));
	/* tslint:enable */
}

function resetGameUrl() {
	var game = getGame();
	if (!game) {
		return;
	}
	if (Session.get('forFun')) {
		game.resetDemoUrl();
		game.getDemoUrl('en');
	}
	else {
		game.resetUrl();
		game.getUrl('en');
	}
}

function requestFullScreen(el) {
	var fullScreen = el.requestFullScreen || el.msRequestFullscreen || el.webkitRequestFullScreen || el.mozRequestFullScreen;
	if (fullScreen) {
		fullScreen.call(el);
	}
	else {
		Session.set('fullScreen', true);
	}
}

function setIFrameHeight() {
	Session.set('iframeWidth', '100%');
	var $iFrame = $('.gameArea').find('iframe');
	if (!$iFrame[0]) {
		Meteor.setTimeout(setIFrameHeight, 100);
	}
	else {
		var game = getGame();
		if (game && game.width) {
			var ratio = game.height / game.width;
		}
		else {
			var ratio = 3 / 4;
		}
		var iframeHeight =  $(window).height() - 200;
		var iframeWidth = Math.min(1100, iframeHeight / ratio);

		Session.set('iframeWidth', iframeWidth + 'px');
		if (iframeWidth === 1100) {
			iframeHeight = iframeWidth * ratio;
		}
		Session.set('iframeHeight', iframeHeight + 'px');
	}
}

function getScreenOrientation() {
	if (window.matchMedia("(orientation: portrait)").matches) {
		return 'Portrait';
	}
	if (window.matchMedia("(orientation: landscape)").matches) {
		return 'Landscape';
	}
}

function normaliseStr(str: string) {
	return str.replace(/-/g, ' ').replace(/\w\S*/g, function(txt){
		return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
	});
}

function validateBets() {
	var balance = Session.get('balance');
	var betslip = Betting.getBetSlip();
	var isMulti = Betting.isMultibet();
	var totalStake = Betting.getTotalStake() * 1000;
	var allStakesOk = !_.find(betslip, function (bet: BetSlipBet) {
		return bet.stake > 0 && bet.stake < 0.001;
	});
	var allBetsOk = !_.find(betslip, function (bet: BetSlipBet) {
		return bet.state && bet.state.type === 'error';
	});
	var invalidStakes = !isMulti && betslip.length && !allStakesOk;
	var invalidMultiStake = isMulti && betslip.length && totalStake > 0 && totalStake < 1;

	if (totalStake > balance) {
		Betting.setBetSlipState({
			type: 'error',
			message: 'Your bet is exceeding your available balance'
		});
		return;
	}
	else if (invalidStakes || invalidMultiStake) {
		Betting.setBetSlipState({
			type: 'error',
			message: 'Minimum stake is 1.00 mBTC'
		});
		return;
	}
	else if (!betslip.length) {
		Betting.setMultiStake(0);
		Betting.clearBetSlip();
		$('#betslip').collapse('hide');
		return;
	}
	else if (betslip.length && !allBetsOk) {
		Betting.setBetSlipState({type: 'error'});
		return;
	}
	else if (isMulti && betslip.length) {
		// if bets count equal to 1
		if (betslip.length < 2) {
			Betting.setBetSlipState({
				type: 'error',
				message: 'You need to select more than one market to make a multibet'
			});
			return;
		}

		// if multiple selections from the same event
		let events: string[] = [];
		let clearMarkets: boolean = true;

		betslip.forEach((bet: any) => {
			if (events.indexOf(bet.eventId) !== -1) {
				clearMarkets = false;
				Betting.setBetSlipState({
					type: 'error',
					message: 'Multiple selections from the same event cannot be combined in a Multibet.'
				});
			}
			if (!(events.indexOf(bet.eventId) > -1)) {
				events.push(bet.eventId);
			}
		});

		if (clearMarkets) Betting.setBetSlipState(null);

	}
	else {
		Betting.setBetSlipState(undefined);
	}
}

function nl2br (str, is_xhtml) {
	var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '<br ' + '/>' : '<br>'; // Adjust comment to avoid issue on phpjs.org display
	return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + breakTag + '$2');
}

function disableSite() {
	Session.set('siteLoading', true);
}

function enableSite() {
	Session.set('siteLoading', false);
}


UI.registerHelper('displayOdds', displayOdds);
UI.registerHelper('oddsFormat', oddsFormat);
UI.registerHelper('calcAge', calcAge);

UI.registerHelper('parentData', function() {
	return Template.parentData(1);
});

(<any>this).displayOdds = displayOdds;
(<any>this).oddsFormat = oddsFormat;
(<any>this).calcAge = calcAge;
(<any>this).getGame = getGame;
(<any>this).getGameUrl = getGameUrl;
(<any>this).resetGameUrl = resetGameUrl;
(<any>this).requestFullScreen = requestFullScreen;
(<any>this).setIFrameHeight = setIFrameHeight;
(<any>this).getScreenOrientation = getScreenOrientation;
(<any>this).normaliseStr = normaliseStr;
(<any>this).validateBets = validateBets;
(<any>this).nl2br = nl2br;
(<any>this).disableSite = disableSite;
(<any>this).enableSite = enableSite;
$(document).ready(function () {
	Backend.SiteClient.addScripts();
});
