﻿//Redoing as direct site handlers as suingle apploginstatus
//	HandleAppPacket('{"key":"versionCheck","value":{"platform":"android","version":"10001","build":"21.08.30.1917"}}');
//	HandleAppPacket('{"key":"versionCheck","value":{"platform":"ios","version":"1.0","build":"22.08.02.1055"}}');
//	HandleAppPacket('{"key":"loginStatus","value":{}}');

//Redoing as direct site handlers
//	HandleAppPacket('{"key":"login","value":{"login":"asdasd","password":"asdasd"}}');
//	HandleAppPacket('{"key":"login","value":{"login":"5003","password":"asd123"}}');
//	HandleAppPacket('{"key":"login","value":{"login":"PIN_LOGIN_ONLY","password":"PIN_LOGIN_ONLY","pinToken":"pDAkMPZqedf07VtMSVOMv25iV0GTa9jhbs0h3dyCXv6/yOKDF3…CIH3piaM0QClBR0ADXxzhf+9ARBiBjowI9eFeuUHAIuZH8w==","pin":"1234"}}');
//	HandleAppPacket('{"key":"pinTokenGenerate","value":{"login":"5003","password":"asd123","pin":"1234"}}');

//No longer needed
//	HandleAppPacket('{"key":"loginPromise","value":{}}');
//	HandleAppPacket('{"key":"pinTokenGeneratePromise","value":{}}');

//Maybe
//	HandleAppPacket('{"key":"logout","value":{}}');
//	HandleAppPacket('{"key":"forceHeartbeat","value":{}}');

//Must be via JS
//	HandleAppPacket('{"key":"showcoupon","value":{}}');
//	HandleAppPacket('{"key":"openchat","value":{}}');

//function InvokeSendPacketToApp(text) { alert(text); }
function InvokeSendPacketToApp(text) {}

var isAwaitingAlert = false;

var loginPromiseData = undefined;
var PINTGPromiseData = undefined;
var PINTLPromiseData = undefined;

var appBuildData = {};
//var appBuildData =
//{
//	"android": {"build": '21.08.30.1917', "required": '21.08.30.1917', "updateUrl": "http://playstore/appid"},
//	"ios": {"build": '22.08.02.1055', "required": '21.08.30.1917', "updateUrl": "http://appstore/appid"}
//}

$(GWCORE).on("SiteLoaded.GWCORE", function(evt)
{
	GWCORE.ForceHeartbeat();
});

$(GWCORE).on("PageLoaded.GWCORE", function(evt)
{
	//alert("pageLoaded : " + evt.url);

	InvokeSendPacketToApp(JSON.stringify({
		key: "pageLoaded",
		value: evt.url
	}));
});

$(GWCORE).on("CouponLegCountUpdated.Coupon.GWCORE", function(evt)
{
	//alert("couponLegs : " + evt.couponLegCount);

	InvokeSendPacketToApp(JSON.stringify({
		key: "couponLegs",
		value: evt.couponLegCount
	}));
});

GWCUSTOM.DisplayUserData = function()
{
	isAwaitingAlert = false;

	var userData = GWCORE.GetAllUserData();

	InvokeSendPacketToApp(JSON.stringify({
		key: "userData",
		value: userData
	}));
}

$(GWCORE).on("LoginSuccess.Account.GWCORE", async function(evt)
{
	InvokeSendPacketToApp(JSON.stringify({
		key: "loginSuccess",
		value: {
			"isLoggedIn": true,
			"balance": evt.balance,
			"daysLeft": evt.daysLeft,
			"accountID": evt.accountID,
			"userPIN": evt.userPIN,
			"countryCode": evt.countryCode,
		}
	}));
});

GWCUSTOM.Login.LoginAlert = function(returndata)
{
	if(typeof (returndata) == 'object')
		msg = returndata.message;
	else
		msg = returndata;

	//alert("LoginAlert: " + msg);

	InvokeSendPacketToApp(JSON.stringify({
		key: "errorMessage",
		value: msg
	}));
}

async function Sleep(msSleep)
{
	await new Promise(r => setTimeout(r, 100));
}

async function DoSyncLogin(data)
{
	loginPromiseData = {"displayName": "promisePending"};
	isAwaitingAlert = true;
	GWCORE.Account.Login(data.value.login, data.value.password, data.value.pin, data.value.pinToken);

	var cnt = 0;
	while(isAwaitingAlert == true && cnt < 100)
	{
		//await new Promise(r => setTimeout(r, 100));
		await Sleep(100);
		console.log("login waiting: " + cnt);
		cnt++;
	}

	await Sleep(100);
	loginPromiseData = GWCORE.GetAllUserData();

	return loginPromiseData;
}

async function DoSyncPINToken_Generate(data)
{
	PINTGPromiseData.message = "promisePending";

	GWCORE.Account.PINToken_Generate(data.value.login, data.value.password, data.value.pin).then((response) =>
	{
		console.log("PINToken_Generate: " + response);
		PINTGPromiseData = response;
	});

	var cnt = 0;

	while(PINTGPromiseData.message == "promisePending" && cnt < 100)
	{
		console.log("PINToken_Generate waiting: " + cnt);
		await Sleep(100);
		cnt++;
	}

	return PINTGPromiseData;
}

//async function DoSyncPINToken_Login(data)
//{
//	PINTLPromiseData = { "displayName": "promisePending" };
//	isAwaitingAlert = true;
//	GWCORE.Account.PINToken_Login(data.value.pinToken, data.value.pin);

//	var cnt = 0;
//	while(isAwaitingAlert == true && cnt < 100)
//	{
//		console.log("PINToken_Login waiting: " + cnt);
//		await Sleep(100);
//		cnt++;
//	}

//	return GWCORE.GetAllUserData();
//}

GWCORE.Account.PINToken_Generate = function(uname, paswd, pin)
{
	return $.ajax({
		type: 'POST',
		cache: false,
		url: '/Process/PINToken_Generate',
		data: JSON.stringify({
			username: uname, password: paswd, PIN: pin
		}),
	});
}

//GWCORE.Account.PINToken_Login = function(pinToken, pin)
//{
//	return $.ajax({
//		type: 'POST',
//		cache: false,
//		url: '/Process/PINToken_Login',
//		data: JSON.stringify({
//			pinToken: pinToken, PIN: pin
//		}),
//	});
//}

//DO NOT USE YET - APP CANNOT PROCESS THE PROMISE RESPONSE
async function HandleAppPromise(packet)
{
	var rtn = {"error": "noreply"};
	try
	{
		var data = JSON.parse(packet);

		alert(packet);

		switch(data.key)
		{
			case "loginToken":
				if(!GWCORE.isLoggedInClient)
				{
					GWCORE.Account.PINToken_Generate(data.value.login, data.value.password, data.value.pin).then(function(reply)
					{
						PINTGPromiseData = reply;
					});
				}
				else
				{
					rtn = {"error": "user not logged in"};
				}
				rtn = PINTGPromiseData;
				break;

			default:
				rtn = {"error": 'unknown key: ' + data.key};
				break;
		}
	}
	catch
	{
		rtn = {"error": 'unknown packet: ' + packet};
	}

	return rtn;
}

function GetUpdatePacket(platform, buildStr)
{
	var appBuild = 0;
	var curBuild = 0;
	var reqBuild = 0;
	var rtn = {"hasUpdate": false, "required": false, "updateURL" : "", "message" : ""};

	switch(platform)
	{
		case "android":
		case "ios":
			try
			{
				jQuery.each(buildStr.split("."), function(key, d)
				{
					appBuild = (appBuild * 100) + GWCORE.Utils.GetIntOrZero(d);
				});
				jQuery.each(appBuildData[platform].current.split("."), function(key, d)
				{
					curBuild = (curBuild * 100) + GWCORE.Utils.GetIntOrZero(d);
				});
				jQuery.each(appBuildData[platform].required.split("."), function(key, d)
				{
					reqBuild = (reqBuild * 100) + GWCORE.Utils.GetIntOrZero(d);
				});

				if(appBuild < curBuild)
				{
					rtn.hasUpdate = true;
					rtn.message = GWCORE.Utils.GetStringOrEmpty(appBuildData[platform].updateMessage);

					if(appBuild < reqBuild)
					{
						rtn.message = GWCORE.Utils.GetStringOrEmpty(appBuildData[platform].requireMessage);
						if(rtn.message === "")
							rtn.message = GWCORE.Utils.GetStringOrEmpty(appBuildData[platform].updateMessage);
						rtn.required = true;
					}
					rtn.updateURL = appBuildData[platform].updateUrl;
				}
				rtn.respGamblingMesg = appBuildData.respGamblingMesg;
				rtn.respGamblingCall = appBuildData.respGamblingCall;
			}
			catch
			{
			}
			break;
		default:
			break;
	}

	return rtn;
}

function HandleAppPacket(packet)
{
	var rtn = {"noreply": "noreply"};
	try
	{
		var data = JSON.parse(packet);

		//alert(packet);

		switch(data.key)
		{
			case "versionCheck":
				rtn = GetUpdatePacket(data.value.platform, data.value.build);
				break;
			case "loginStatus":
				rtn = GWCORE.isLoggedInClient;
				if(rtn === null || rtn === undefined)
				{
					return false;
				}
				if(rtn)
					GWCORE.ForceHeartbeat();
				break;

			case "login":
				if(!GWCORE.isLoggedInClient)
				{
					loginPromiseData = {"displayName": "promisePending"};
					rtn = DoSyncLogin(data);
					rtn.then((response) =>
					{
						console.log("sts: " + response);
						loginPromiseData = response;
					});
				}
				else
				{
					loginPromiseData = GWCORE.GetAllUserData();
				}
				break;
			case "loginPromise":
				rtn = loginPromiseData;
				break;

			//case "pinTokenLogin":
			//	if(!GWCORE.isLoggedInClient)
			//	{
			//		loginPromiseData = { "displayName": "promisePending" };
			//		rtn = DoSyncLogin(data);
			//		rtn.then((response) =>
			//		{
			//			console.log("sts: " + response);
			//			loginPromiseData = response;
			//		});
			//	}
			//	else
			//	{
			//		loginPromiseData = GWCORE.GetAllUserData();
			//	}
			//	break;
			//case "pinTokenLoginPromise":
			//	rtn = loginPromiseData;
			//	break;

			case "pinTokenGenerate":
				PINTGPromiseData = {"message": "promisePending"};
				rtn = DoSyncPINToken_Generate(data);
				break;
			case "pinTokenGeneratePromise":
				rtn = PINTGPromiseData;
				break;

			case "logout":
				GWCORE.PageManager.LoadToDynPage("/Account/Logout", "#pageContent", false);
				break;

			case "forceHeartbeat":
				GWCORE.ForceHeartbeat();
				break;

			case "showcoupon":
				if(!GWCORE.isLoggedInClient)
				{
					GWCORE.PageManager.LoadToDynPage('/Account/Login', '#pageContent', true)
				}
				else
				{
					ToggleBetslip();
				}
				break;

			case "openchat":
				//this should just call ToggleChatWindow() from the global space.
				//Will update in a future release once ToggleChatWindow handles no parameter
				try
				{
					if(typeof LC_API !== "undefined")
						LC_API.open_chat_window(); //start liveChat
					else if(typeof window.fcWidget !== "undefined")
						window.fcWidget.open(); //start freshChat
				}
				catch(err)
				{
				}
				break;

			case "refocusElement":
				if($(document.activeElement).is('input:text'))
				{
					$(document.activeElement).context.scrollIntoViewIfNeeded(false);
				}
				break;

			default:
				alert('HandleAppPacket: unknown packet: ' + packet);
				InvokeSendPacketToApp(JSON.stringify({
					key: "systemError",
					value: 'HandleAppPacket: unknown packet: ' + packet
				}));
				break;
		}
	}
	catch
	{
		InvokeSendPacketToApp(JSON.stringify({
			key: "systemError",
			value: 'HandleAppPacket: invalid packet: ' + packet
		}));
	}

	return rtn;
}
