using System;
#if UNITY_WEBGL && !UNITY_EDITOR
using System.Runtime.InteropServices;
#endif
using UnityEngine;
using AOT;

namespace Arkadium
{
	public interface IArkadiumWallet
	{
		void IsGemsSupported(Action<bool> cb);
		void GetGems(Action<int> cb);
		void ConsumeGems(int value, Action<bool> cb);
	}

	public class ArkadiumWallet : IArkadiumWallet
	{
#if UNITY_WEBGL && !UNITY_EDITOR
		[DllImport("__Internal")]
		private static extern void _IsGemsSupported(Action<int> cb);
		[DllImport("__Internal")]
		private static extern void _GetGems(Action<int> cb);
		[DllImport("__Internal")]
		private static extern void _ConsumeGems(int value, Action<int> cb);
#else
		private void _IsGemsSupported(Action<int> cb) { cb?.Invoke(1); }
		private void _GetGems(Action<int> cb) { cb?.Invoke(10000); }
		private void _ConsumeGems(int value, Action<int> cb) { cb?.Invoke(1); }

#endif

		private static Action<bool> _isGemsSupportedCb;
		private static Action<int> _getGemsCb;
		private static Action<bool> _consumeGemsCb;

		public void IsGemsSupported(Action<bool> cb)
		{
			_isGemsSupportedCb = cb;
			_IsGemsSupported(IsGemsSupportedCb);
		}
		public void GetGems(Action<int> cb)
		{
			_getGemsCb = cb;
			_GetGems(GetGemsCb);
		}
		public void ConsumeGems(int value, Action<bool> cb)
		{
			_consumeGemsCb = cb;
			_ConsumeGems(value, ConsumeGemsCb);
		}

		[MonoPInvokeCallback(typeof(Action<int>))]
		private static void IsGemsSupportedCb(int result)
		{
			var isSupported = result == 1;
			ArkadiumSDK.Instance.Log($"is gems supported: {isSupported}");
			_isGemsSupportedCb?.Invoke(isSupported);
			_isGemsSupportedCb = null;
		}

		[MonoPInvokeCallback(typeof(Action<int>))]
		private static void GetGemsCb(int gems)
		{
			ArkadiumSDK.Instance.Log($"get wallet gems returned {gems}");
			_getGemsCb?.Invoke(gems);
			_getGemsCb = null;
		}

		[MonoPInvokeCallback(typeof(Action<int>))]
		private static void ConsumeGemsCb(int result)
		{
			var success = result == 1;
			ArkadiumSDK.Instance.Log($"consume wallet gems {success}");
			_consumeGemsCb?.Invoke(success);
			_consumeGemsCb = null;
		}
	}
}