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

interface Templates {
	withdraw: Template;
}

Session.setDefault('success', false);

Template.withdraw.helpers({

	balance: function(){
		var wallet = Banking.WalletClient.db.findOne({currency: 'BTC'});
		return wallet ? wallet.balanceInMillis() : 0;
	},

	depositsLoaded: function() {
		return Session.get('depositsReady');
	},

	unconfirmedDeposit: function(){
		var method = Banking.Methods.BitcoinMethodClient.db.findOne();
		var wallet = Banking.WalletClient.db.findOne({currency: 'BTC'});
		if (!method || !wallet) {
			return;
		}
		var deps = wallet.unconfirmedDeposits(method);
		if (deps.count() == 0) {
			return;
		}
		return deps.fetch()[0];
	},

	withdraws: function(){
		var method = Banking.Methods.BitcoinMethodClient.db.findOne();
		var wallet = Banking.WalletClient.db.findOne({currency: 'BTC'});
		if (!method || !wallet) {
			return;
		}
		return Banking.Transaction.db.find({
			wallet: wallet,
			'reference.id': method._id,
			referenceType: Banking.TransactionType.WITHDRAW
		}, {sort: {createTime: -1}});
	},

	successMessage: function(){
		return Session.get('successMessage');
	},

	errorMessage: function(){
		return Session.get('errorMessage');
	},

	loading: function(){
		return Session.get('loading') ? 'loading' : '';
	},

	otpEnabled: function() {
		return Users.Profile.active() && Users.Profile.active().otpEnabled
	},

	canWithdraw: function() {
		return Session.get('canWithdraw');
	},

	wdButtonDisabled: function() {
		return Session.get('wdButtonDisabled');
	},

	canWithdrawCheck: function() {
		if (!Users.Profile.active()) {
			return;
		}

		var pwChangeDate = Users.Profile.active().passwordChangeDate;
		if (!pwChangeDate) {
			Session.set('canWithdraw', true);
			return;
		}
		var diff = moment().diff(moment(pwChangeDate), 'minutes');
		Session.set('canWithdraw', diff < 2880 ? false : true);

		setInterval(function() {
			var diff = moment().diff(moment(pwChangeDate), 'minutes');
			Session.set('canWithdraw', diff < 2880 ? false: true);
		}, 60000);
	},

	withdrawCooldownCheck: function() {
		if (!Users.Profile.active()) {
			return;
		}

		var pwChangeDate = Users.Profile.active().passwordChangeDate;
		if (!pwChangeDate) {
			return;
		}

		var diff = 2880 - moment().diff(moment(pwChangeDate), 'minutes');
		var hours = Math.floor(diff / 60);
		var minutes = diff % 60;

		Session.set('cooldown', hours + ' hours and ' + minutes + ' minutes');
		setInterval(function() {
			var diff = 2880 - moment().diff(moment(pwChangeDate), 'minutes');
			var hours = Math.floor(diff / 60);
			var minutes = diff % 60;
			Session.set('cooldown', hours + ' hours and ' + minutes + ' minutes');
		}, 60000);
	},

	withdrawCooldown: function() {
		return Session.get('cooldown');
	}


});

Template.withdraw.events({

	'click .mWithdraw a, touchstart .mWithdraw a': function(){
		var tx: Banking.Transaction = this;
		tx.showDetails();
	},

	'submit form': function(e: MeteorTemplateEvent){
		e.preventDefault();

		Session.set('successMessage', '');
		Session.set('errorMessage', '');
		Session.set('wdButtonDisabled', false);

		googleSend({
			'eventCategory': 'Cashier',
			'eventAction': 'Clicked Withdraw',
			'pageEventArea': 'Main'
		});

		var $form = $(e.target);
		var $addressField = $form.find('input[name=address]');
		var $amountField = $form.find('input[name=amount]');
		var $otpField = $form.find('input[name=otp]');
		var address = $addressField.val();
		var otpCode = $otpField.val();
		var amount = +(+$amountField.val() / 1000).toFixed(8);
		var amountValid = amount > 0 && amount <= Banking.WalletClient.db.findOne({currency: 'BTC'}).balance;
		var formValid = true;

		if (!amountValid) {
			if (!amount || amount < 0 || isNaN(amount)) {
				Session.set('errorMessage', 'Invalid amount');
			}
			else {
				Session.set('errorMessage', 'Not enough bitcoins in your current balance');
			}

			formValid = false;
			$amountField.anim('shake');

			googleSend({
				'eventCategory': 'Cashier',
				'eventAction': 'Amount Error',
				'eventLabel': 'Withdraw',
				'pageEventArea': 'Main'
			});

		}
		else {
			var method = Banking.Methods.BitcoinMethodClient.db.findOne();

			if (Users.Profile.active() && Users.Profile.active().otpEnabled && !otpCode) {
				Session.set('errorMessage', 'Google Authenticator code needed');
				formValid = false;
				$otpField.anim('shake');
			}
			else {

				function credit() {
					if (formValid) {
						method.credit(address, amount, function(err, resp){
							Session.set('loading', false);
							if (err) {
								if (err.details == 'wrongOtp') {
									Session.set('errorMessage', 'Wrong Google Authenticator code');
									formValid = false;
									$otpField.anim('shake');
									Session.set('wdButtonDisabled', false);
								}
								else {
									Session.set('errorMessage', err.message);
									Session.set('wdButtonDisabled', false);
									throw err;
								}
							}
							else {
								Session.set('wdButtonDisabled', false);
								Session.set('successMessage', 'Your withdraw request has been sent.');
								$addressField.val('');
								$amountField.val('');
								$otpField.val('');
								Meteor.call('Fraud/getDeviceInfo', (err, res) => {
									if (err) {
										return;
									}
									Meteor.call('Fraud/WithdrawLookup', res);
								});

								googleSend({
									'eventCategory': 'Cashier',
									'eventAction': 'Withdrawal Success',
									'eventValue': amount,
									'pageEventArea': 'Main',
									'withdrawals': 1
								});``

							}
						}, otpCode);
					}
					else {
						Session.set('loading', false);
					}
				}

				if (method.minWithdraw && method.minWithdraw > amount) {

					Session.set('errorMessage', 'Minimum withdraw amount is ' + (method.minWithdraw * 1000).toFixed(2) + ' mBTC');
					formValid = false;
					$amountField.anim('shake');

					googleSend({
						'eventCategory': 'Cashier',
						'eventAction': 'Amount Error',
						'eventLabel': 'Withdraw',
						'pageEventArea': 'Main'
					});

				}
				else {
					Session.set('loading', true);
					Session.set('wdButtonDisabled', true);
					Banking.Bitcoin.AddressClient.validate(address, function(err, addressValid){
						if (err) {
							Session.set('loading', false);
							Session.set('errorMessage', err.message);
							Session.set('wdButtonDisabled', false);
							throw err;
						}
						if (!addressValid) {
							Users.User.checkUsernameAvailability(address, null, function (available) {
								if (available) {
									formValid = false;
									Session.set('errorMessage', 'Incorrect Bitcoin wallet address');
									$addressField.anim('shake');
									Session.set('loading', false);
									Session.set('wdButtonDisabled', false);
									googleSend({
										'eventCategory': 'Cashier',
										'eventAction': 'Bitcoin Address Error',
										'pageEventArea': 'Main'
									});
								}
								else {
									credit();
								}
							});
							return;
						}
						credit();
					});
				}
			}
		}
	}
});

Template.withdraw.onRendered(function() {

	this.autorun(() => {
		this.subscribe('Banking.Method');
		var method = Banking.Methods.BitcoinMethodClient.db.findOne();
		var wallet = Banking.WalletClient.db.findOne({currency: 'BTC'});
		Session.set('depositsReady', false);
		if (!method || !wallet) {
			return;
		}
		this._depSub = Meteor.subscribe('Banking/userTransactions', {
			wallet: wallet._id,
			'reference.id': method._id,
			status: Banking.TransactionStatus.PENDING,
			referenceType: Banking.TransactionType.DEPOSIT
		}, function () {
			Session.set('depositsReady', true);
		});
		if (this._depSub.ready()) {
			Session.set('depositsReady', true);
		}
		this._txSub = Meteor.subscribe('Banking/userTransactions', {
			wallet: wallet._id,
			'reference.id': method._id,
			referenceType: Banking.TransactionType.WITHDRAW
		}, {sort: {createTime: -1}});
	});

});

Template.withdraw.destroyed = function() {
	if (this._txSub) {
		this._txSub.stop();
		this._depSub.stop();
	}
};
