namespace Guru
{
    using UnityEngine;
    using System;
    
    
    public partial class GuruSDK
    {
        /// 
        /// 启动广告服务
        /// 
        public static void StartAds()
        {
            if (InitConfig.UseCustomConsent)
            {
                Debug.Log($"{Tag} --- Call StartAdsWithCustomConsent when you use custom consent, and pass the result (boolean) to the method.");
            }
            else
            {
                // 默认的启动顺序是先启动Consent后, 根据用户回调的结果来启动广告
                Instance.StartConsentFlow();
            }
        }
        /// 
        /// 使用自定义的Consent, 获取用户授权后, 调用此方法
        /// 
        /// 
        /// Consent 引导的类型, 如果使用了 MAX 的 consent 请填写 max 
        public static void StartAdsWithCustomConsent(bool userAllow = true, string guideType = "custom")
        {
#if UNITY_IOS
            _attType = guideType;
            InitAttStatus();
#endif
            if (userAllow)
            {
#if UNITY_IOS
                CheckAttStatus();
#else
                StartAdService();
#endif
            }
            else
            {
                Debug.Log($"{Tag} --- User refuse to provide ads Id, Ads Service will be cancelled");
            }
        }
        #region Guru Consent
        
        /// 
        /// 启动Consent流程
        /// 
        private void StartConsentFlow()
        {
            LogI($"StartConsentFlow");
            GuruConsent.StartConsent(OnConsentOver);
        }
        private void OnConsentOver(int code)
        {
#if UNITY_IOS
            InitAttStatus();
#endif
            Callbacks.ConsentFlow._onConsentResult?.Invoke(code);
            switch(code)
            {
                case GuruConsent.StatusCode.OBTAINED:
                case GuruConsent.StatusCode.NOT_AVAILABLE:
                    // 已获取授权, 或者地区不可用
#if UNITY_IOS
                    CheckAttStatus();
#else
                    StartAdService();
#endif
                    break;
            }
        }
        
        #endregion
        
        #region IOS ATT 广告授权流程
        
#if UNITY_IOS
        
        private static string _initialAttStatus;
        private static String _attType = "admob";
        
        
        /// 
        /// 显示系统的 ATT 弹窗
        /// 
        public static void RequestAttDialog()
        {
            LogI($"RequestATTDialog");
            ATTManager.RequestATTDailog(ReportAttStatus);
        }
        
        /// 
        /// 初始化 ATT 状态
        /// 
        public static void InitAttStatus()
        {
            _initialAttStatus = ATTManager.GetStatus();
            SetUserProperty(Analytics.ParameterATTStatus, _initialAttStatus); // 上报一个初始的状态
        }
        
        /// 
        /// iOS 平台检查 ATT 状态
        /// 
        private static void CheckAttStatus() => ATTManager.CheckStatus(ReportAttStatus);
         
        private static void ReportAttStatus(string status)
        {
            LogI($"{Tag} --- Get Att status: {status}");
            SetUserProperty(Analytics.ParameterATTStatus, status); // 当前的状态
            if (!string.IsNullOrEmpty(_initialAttStatus) 
                && status !=  ATTManager.ATT_STATUS_NOT_DETERMINED
                && _initialAttStatus != status)
            {
                // 上报点位:
                Analytics.AttResult(status, _attType);
            }
            switch(status)
            {
                case ATTManager.ATT_STATUS_NOT_DETERMINED:
                    // ATT 状态未知, 请求弹窗
                    RequestAttDialog();
                    break;
                case ATTManager.ATT_STATUS_RESTRICTED:
                case ATTManager.ATT_STATUS_DENIED:
                    // ATT 状态受限, 或者被拒绝, 不请求广告
                    break;
                case ATTManager.ATT_STATUS_AUTHORIZED:
                    // ATT 状态已授权, 请求广告
                    StartAdService();
                    break;
            }
        } 
#endif
        
        #endregion   
        
        #region Ad Services
        private static bool _initAdsCompleted = false;
        
        
        /// 
        /// 启动广告服务
        /// 
        public static void StartAdService()
        {
            LogI($"StartAdService");
            ADService.Instance.StartService(OnAdsInitComplete, 
                InitConfig.AutoLoadWhenAdsReady, IsDebugMode);
            
            //--------- Callbacks -----------
            ADService.OnBannerLoaded = OnBannerLoaded;
            ADService.OnInterstitialLoaded = OnInterstitialLoaded;
            ADService.OnInterstitialFailed = OnInterstitialFailed;
            ADService.OnRewardLoaded = OnRewardLoaded;
            ADService.OnRewardFailed = OnRewardFailed;
        }
        
        private static void OnBannerLoaded() 
            => Callbacks.Ads._onBannerADLoaded?.Invoke();
        private static void OnInterstitialLoaded() 
            => Callbacks.Ads._onInterstitialADLoaded?.Invoke();
        private static void OnInterstitialFailed()
            => Callbacks.Ads._onInterstitialADFailed?.Invoke();
        private static void OnRewardLoaded()
            => Callbacks.Ads._onRewardedADLoaded?.Invoke(); 
        private static void OnRewardFailed()
            => Callbacks.Ads._onRewardADFailed?.Invoke();
        private static void OnAdsInitComplete()
        {
            _initAdsCompleted = true;
            Callbacks.Ads._onAdsInitComplete?.Invoke();
        }
        private static bool CheckAdsReady()
        {
            if (!_initAdsCompleted)
            {
                LogE("Ads is not ready. Call  first.");
                return false;
            }
            return true;
        }
        /// 
        /// 显示Banner广告
        /// 
        /// 
        public static void ShowBanner(string placement = "")
        {
            if (!CheckAdsReady()) return;
            ADService.Instance.ShowBanner(placement);
        }
        /// 
        /// 隐藏Banner广告
        /// 
        public static void HideBanner()
        {
            if (!CheckAdsReady()) return;
            ADService.Instance.HideBanner();
        }
        public static void LoadInterstitialAd()
        {
            if (!CheckAdsReady()) return;
            ADService.Instance.RequestInterstitialAD();
        }
        public static bool IsInterstitialAdReady => ADService.Instance.IsInterstitialADReady();
        
        /// 
        /// 显示插屏广告
        /// 
        /// 
        /// 
        public static void ShowInterstitialAd(string placement = "", Action onDismissed = null)
        {
            if (!CheckAdsReady()) return;
            if (!ADService.Instance.IsInterstitialADReady())
            {
                LogE("Interstitial is not ready. Call  again.");
                LoadInterstitialAd();
                return;
            }
            ADService.Instance.ShowInterstitialAD(placement, onDismissed);
        }
        public static void LoadRewardAd()
        {
            if (!CheckAdsReady()) return;
            ADService.Instance.RequestRewardedAD();
        }
        
        public static bool IsRewardAdReady => ADService.Instance.IsRewardedADReady();
        
        /// 
        /// 显示激励视频广告
        /// 
        /// 
        /// 
        /// 
        public static void ShowRewardAd(string placement = "", Action onRewarded = null, Action onFailed = null)
        {
            if (!CheckAdsReady()) return;
            if (!ADService.Instance.IsRewardedADReady())
            {
                LogE("RewardAd is not ready. Call  again.");
                LoadRewardAd();
                return;
            }
            ADService.Instance.ShowRewardedAD(placement, onRewarded, onFailed);
        }
        #endregion
        #region MaxServices
        /// 
        /// 显示Max调试菜单
        /// 
        public static void ShowMaxDebugPanel()
        {
#if UNITY_EDITOR
            LogI($"Can not show Max Debug Panel in Editor, skipped.");
            return;
#endif
            if (!ADService.Instance.IsInitialized)
            {
                LogI($"ADService is not initialized, call  first.");
                return;
            }
            ADService.Instance.ShowMaxDebugPanel();
        }
        #endregion
    }
}