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

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, float usdprice, JObject purchaseInfo)
        {
            if (!IsLoggedIn) return new PaymentInfo() { code = "-1", msg = "未登录" };

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

            if(purchaseInfo == null)
                purchaseInfo = new JObject();

            string extraInfo = purchaseInfo.ToString(Newtonsoft.Json.Formatting.None);
            //to base64
            extraInfo = Convert.ToBase64String(Encoding.UTF8.GetBytes(extraInfo));
            Debug.Log("[TYSdk] extraInfo: " + extraInfo);
            var prodId = prod.ProdID;
            var prodPrice = usdprice.ToString();
            var prodName = prod.title;

#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 pType = "googleiab.global.app";

            var task = TYSDKCallbackManager.Instance.RegisterCallback<PaymentInfo>(TimeSpan.FromMinutes(1));

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

                var result = await task;
                result.count = count;
                result.orderId = orderId;
                result.productId = prodId;
                result.price = prodPrice;
                return result;
            }
            catch (Exception e)
            {
              Debug.LogWarning($"[TYSdkFacade::Pay] Faild {e.Message}");
              return new PaymentInfo(){code = "-1"};
            }


#elif UNITY_IOS
            var task = TYSDKCallbackManager.Instance.RegisterCallback<PaymentInfo>(TimeSpan.FromMinutes(1));
            UnityBridgeFunc.UnityKnow(_accountInfo.strUserId, prodId, prodPrice, prodName, count.ToString(), orderId, extraInfo);

            try{
                var result = await task;
                result.count = count;
                result.orderId = orderId;
                result.productId = prodId;
                result.price = prodPrice;
                return result;
            }
            catch(Exception e)
            {
                Debug.LogWarning($"[TYSdkFacade::Pay] Faild {e.Message}");
                return new PaymentInfo(){code = "-1"};
            }
#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();
            TYSDKCallbackManager.Instance.TryTriggerCallback(result);
        }

        // 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 task = TYSDKCallbackManager.Instance.RegisterCallback<ProductListInfo>();
            UnityBridgeFunc.GetSKUList();
            var result = await 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
            }

            TYSDKCallbackManager.Instance.TryTriggerCallback(result);
        }
    }
}




