using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using UnityEngine;

namespace tysdk
{
    public partial class TYSdkFacade : MonoBehaviour
    {
        /*================================================

                   ____                                  _   
                  |  _ \ __ _ _   _ _ __ ___   ___ _ __ | |_ 
                  | |_) / _` | | | | '_ ` _ \ / _ \ '_ \| __|
                  |  __/ (_| | |_| | | | | | |  __/ | | | |_ 
                  |_|   \__,_|\__, |_| |_| |_|\___|_| |_|\__|
                              |___/                          
        =================================================*/

        //public async Task<PaymentInfo> Pay(string prodId, string prodPrice, string prodName, int count, string pType, string price_amount_micros =null)
        public async Task<PaymentInfo> Pay(SKUDetail prod, int count)
        {
            if (!IsLoggedIn) return new PaymentInfo() { code = "-1", msg = "未登录" };

            var orderId = System.Guid.NewGuid().ToString();

            Dictionary<string, object> extraDic = new Dictionary<string, object>() {
                {"paytime" , System.DateTime.UtcNow.Ticks},
                {"sum" , prod.ProdPrice * count},
            };


            string extraInfo = Newtonsoft.Json.JsonConvert.SerializeObject(extraDic);
            //to base64
            extraInfo = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(extraInfo));
            var prodId = prod.ProdID;
            var prodPrice = prod.price;
            var prodName = prod.title;
            var pType = "googleiab.global.app";

#if UNITY_EDITOR

            await Task.Yield();
            var result = new PaymentInfo()
            {
                code = "0",
                msg = "success",
                count = count,
                orderId = orderId,
                productId = prodId,
                price = prodPrice
            };


            return result;
#elif UNITY_ANDROID
       
            var taskSource = new TaskCompletionSource<PaymentInfo>();
            callbacks.Add("PayResult", (ITYSdkCallback callback) =>
            {
                taskSource.SetResult((PaymentInfo)callback);
            });

            //UnityBridgeFunc.UnityKnow(prodId, prodName, count.ToString(), orderId, extraInfo);
            UnityBridgeFunc.UnityKnowNew(prodId, prodPrice, prodName, count.ToString(), orderId, extraInfo,pType);

            var result = await taskSource.Task;
            result.count = count;
            result.orderId = orderId;
            result.productId = prodId;
            result.price = prodPrice;
            return result;

#elif UNITY_IOS
            var taskSource = new TaskCompletionSource<PaymentInfo>();
            callbacks.Add("PayResult", (ITYSdkCallback callback) =>
            {
                taskSource.SetResult((PaymentInfo)callback);
            });
            UnityBridgeFunc.UnityKnow(_accountInfo.strUserId, prodId, prodPrice, prodName, count.ToString(), orderId, extraInfo);

            var result = await taskSource.Task;
            result.count = count;
            result.orderId = orderId;
            result.productId = prodId;
            result.price = prodPrice;
            return result;
#endif
        }

        //支付的回调
        public void PayResult(string json)
        {
            Debug.Log("[TYSdkFacade] pay callback:" + json);
            var jresult = JObject.Parse(json);
            var result = new PaymentInfo();
            result.code = jresult["code"].ToString();
            result.msg = jresult["errStr"].ToString();

            if (callbacks.TryGetValue("PayResult", out var action))
            {
                action.Invoke(result);
                callbacks.Remove("PayResult");
            }
        }

        // Get Pay list
        public async Task<ProductListInfo> GetSKUList()
        {
            if (!IsLoggedIn) return new ProductListInfo() { code = -1, msg = "未登录" };

#if UNITY_EDITOR 
            await Task.Yield();

            var result = new ProductListInfo();
            return result;
#elif UNITY_ANDROID || UNITY_IOS
          var taskSource = new TaskCompletionSource<ProductListInfo>();
            callbacks.Add("SKUListResult", (ITYSdkCallback callback) =>
            {
                taskSource.SetResult((ProductListInfo) callback);
            });
            UnityBridgeFunc.GetSKUList();
            var result = await taskSource.Task;
            return result;
#endif
        }

        //商品列表的回调
        public void SKUListResult(string json)
        {
            Debug.Log("[TYSdkFacade] GetSKUList callback");
            var jresult = JObject.Parse(json);
            int code = int.Parse(jresult["code"].ToString());
            var result = new ProductListInfo();
            if (code == 0)
            {
                string productStr = jresult["respObj"].ToString();
                result.code = code;
#if UNITY_ANDROID && !UNITY_EDITOR
                var jsonObjList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<SKUDetail>>(productStr);
                result.products = jsonObjList;
#elif UNITY_IOS && !UNITY_EDITOR
                result.ReadSKUFromJson(productStr);
#endif
            }

            if (callbacks.TryGetValue("SKUListResult", out var action))
            {
                action.Invoke(result);
                callbacks.Remove("SKUListResult");
            }
        }
    }
}




