namespace Guru
{
    using UnityEngine;
    using System;
    using System.Linq;
    
    public partial class GuruSDK
    {
        public static bool IsIAPReady = false;
        //---------- 支付失败原因 ----------
        public const string BuyFail_PurchasingUnavailable = "PurchasingUnavailable";
        public const string BuyFail_Pending = "ExistingPurchasePending";
        public const string BuyFail_ProductUnavailable = "ProductUnavailable";
        public const string BuyFail_SignatureInvalid = "SignatureInvalid";
        public const string BuyFail_UserCancelled = "UserCancelled";
        public const string BuyFail_PaymentDeclined = "PaymentDeclined";
        public const string BuyFail_DuplicateTransaction = "DuplicateTransaction";
        public const string BuyFail_Unknown = "Unknown";
        
        #region Start
        
        /// 
        /// 初始化IAP 功能
        /// 
        public static void InitIAP(string userId, byte[] googleKey, byte[] appleRootCerts)
        {
            GuruIAP.Instance.OnInitResult += OnIAPInitResult;
            GuruIAP.Instance.OnRestored += OnRestored;
            GuruIAP.Instance.OnBuyStart += OnBuyStart;
            GuruIAP.Instance.OnBuyEnd += OnBuyEnd;
            GuruIAP.Instance.OnBuyFailed += OnBuyFailed;
            GuruIAP.Instance.OnGetProductReceipt += OnGetReceipt;
            
            Callbacks.IAP._onIAPInitStart?.Invoke(); // 初始化之前进行调用
            
            GuruIAP.Instance.InitWithKeys(userId, googleKey, appleRootCerts, IsDebugMode);
        }
        
        /// 
        /// 初始化结果
        /// 
        /// 
        private static void OnIAPInitResult(bool success)
        {
            LogI($"IAP init result: {success}");
            
            IsIAPReady = success;
            Callbacks.IAP._onIAPInitComplete?.Invoke(success);
        }
        private static bool CheckIAPReady()
        {
            if (!IsIAPReady)
            {
                LogE("IAP is not ready, call  first.");
                return false;
            }
            return true;
        }
        #endregion
        
        #region Data
        /// 
        /// 获取商品信息
        /// 
        /// 
        /// 
        public static ProductInfo GetProductInfo(string productName)
        {
            return GuruIAP.Instance?.GetInfo(productName) ?? null;
        }
        
        /// 
        /// 获取商品信息 (提供 ProductId)
        /// 
        /// 
        /// 
        public static ProductInfo GetProductInfoById(string productId)
        {
            return GuruIAP.Instance?.GetInfoById(productId) ?? null;
        }
        
        
        [Obsolete("Will be discarded in next version. Using GetProductInfoById(string productId) instead.")]
        public static ProductSetting GetProductSettingById(string productId)
        {
            var products = GuruSettings.Instance.Products;
            if (products != null && products.Length > 0)
            {
                return products.FirstOrDefault(p => p.ProductId == productId);   
            }
            return null;
        }
        
        [Obsolete("Will be discarded in next version. Using GetProductInfo(string productName) instead.")]
        public static ProductSetting GetProductSetting(string productName)
        {
            var products = GuruSettings.Instance.Products;
            if (products != null && products.Length > 0)
            {
                return products.FirstOrDefault(p => p.ProductName == productName);   
            }
            return null;
        }
        /// 
        /// 查询某个商品是否已经包含订单了
        /// 
        /// 
        /// 
        public static bool IsProductHasReceipt(string productName)
        {
            return GuruIAP.Instance.IsProductHasReceipt(productName);
        }
        public static string GetProductLocalizedPriceString(string productName)
        {
            return GuruIAP.Instance.GetLocalizedPriceString(productName);
        }
        #endregion
        
        #region Purchase
        
        private static Action _onPurchaseCallback;
        /// 
        /// 老接口, 将会被废弃
        /// 
        /// 
        /// 
        [Obsolete("Will be discarded in next version. Using Purchase(string productName, string category, Action purchaseCallback) instead.")]
        public static void Purchase(string productName, Action purchaseCallback = null)
        {
            Purchase(productName, "", purchaseCallback);
        }
        /// 
        /// 购买商品, 通过商品Name
        /// 
        /// 
        /// 
        /// 
        public static void Purchase(string productName, string category = "", Action purchaseCallback = null)
        {
            if (CheckIAPReady())
            {
                _onPurchaseCallback = purchaseCallback;
                GuruIAP.Instance.Buy(productName, category);
            }
        }
        /// 
        /// 购买商品, 通过商品ID
        /// 
        /// 
        /// 
        /// 
        public static bool PurchaseById(string productId, string category = "", Action purchaseCallback = null)
        {
            var productName = GetProductInfoById(productId)?.Name ?? "";
            
            if (CheckIAPReady() && !string.IsNullOrEmpty(productName))
            {
                Purchase(productName, category, purchaseCallback);
                return true;
            }
            return false;
        }
        
        /// 
        /// 支付回调
        /// 
        /// 
        /// 
        private static void OnBuyEnd(string productName, bool success)
        {
            _onPurchaseCallback?.Invoke(productName, success);
            Callbacks.IAP._onPurchaseEnd?.Invoke(productName, success);
        }
        /// 
        /// 支付开始
        /// 
        /// 
        private static void OnBuyStart(string productName)
        {
            Callbacks.IAP._onPurchaseStart?.Invoke(productName);
        }
        
        /// 
        /// 支付失败
        /// 
        /// 
        /// 
        private static void OnBuyFailed(string productName, string reason)
        {
            Callbacks.IAP._onPurchaseFailed?.Invoke(productName, reason);
        }
        #endregion
        
        #region Restore Purchase
        /// 
        /// 恢复购买
        /// 
        /// 
        public static void Restore(Action restoreCallback = null)
        {
            if( restoreCallback != null) Callbacks.IAP.OnIAPRestored += restoreCallback;
            if (CheckIAPReady())
            {
                GuruIAP.Instance.Restore();
            }
        }
        private static void OnRestored(bool success, string msg)
        {
            Callbacks.IAP._onIAPRestored?.Invoke(success, msg); // 更新回复购买回调
        }
        
        #endregion
        #region Receipt
        /// 
        /// 获取订单收据
        /// 
        /// 
        /// 
        /// 
        private static void OnGetReceipt(string productId, string receipt, bool appleProductIsRestored = false)
        {
            var productName = GetProductInfoById(productId)?.Name ?? "";
            if(!string.IsNullOrEmpty(productName))
                Model.AddReceipt(receipt, productName, productId, appleProductIsRestored);
        }
        #endregion
        #region Subscriptions
        /// 
        /// 订阅是否被取消
        /// 
        /// 
        /// 
        public static bool IsSubscriptionCancelled(string productName)
        {
            return GuruIAP.Instance.IsSubscriptionCancelled(productName);
        }
        
        /// 
        /// 订阅是否可用
        /// 
        /// 
        /// 
        public static bool IsSubscriptionAvailable(string productName)
        {
            return GuruIAP.Instance.IsSubscriptionAvailable(productName);
        }
        
        /// 
        /// 订阅是否过期
        /// 
        /// 
        /// 
        public static bool IsSubscriptionExpired(string productName)
        {
            return GuruIAP.Instance.IsSubscriptionExpired(productName);
        }
        
        public static bool IsSubscriptionFreeTrail(string productName)
        {
            return GuruIAP.Instance.IsSubscriptionFreeTrail(productName);
        }
        
        public static bool IsSubscriptionAutoRenewing(string productName)
        {
            return GuruIAP.Instance.IsSubscriptionAutoRenewing(productName);
        }
        
        public static bool IsSubscriptionIntroductoryPricePeriod(string productName)
        {
            return GuruIAP.Instance.IsSubscriptionIntroductoryPricePeriod(productName);
        }
        
        public DateTime GetSubscriptionExpireDate(string productName)
        {
            return GuruIAP.Instance.GetSubscriptionExpireDate(productName);
        }
        
        
        public DateTime GetSubscriptionPurchaseDate(string productName)
        {
            return GuruIAP.Instance.GetSubscriptionPurchaseDate(productName);
        }
        
        
        public DateTime GetSubscriptionCancelDate(string productName)
        {
            return GuruIAP.Instance.GetSubscriptionCancelDate(productName);
        }
        
        public TimeSpan GetSubscriptionRemainingTime(string productName)
        {
            return GuruIAP.Instance.GetSubscriptionRemainingTime(productName);
        }
        
        public TimeSpan GetSubscriptionIntroductoryPricePeriod(string productName)
        {
            return GuruIAP.Instance.GetSubscriptionIntroductoryPricePeriod(productName);
        }
        
        
        public TimeSpan GetSubscriptionFreeTrialPeriod(string productName)
        {
            return GuruIAP.Instance.GetSubscriptionFreeTrialPeriod(productName);
        }
        
        public string GetSubscriptionInfoJsonString(string productName)
        {
            return GuruIAP.Instance.GetSubscriptionInfoJsonString(productName);
        }
        
        #endregion
    }
}