using System;
using System.Linq;
using System.Reflection;
using GoogleMobileAds.Api;
using Script.Utils;
using UnityEngine;
using Newtonsoft.Json.Linq;
namespace Script.SDKManager.AdsSDKManager.AdmobAdsManager.Utils
{
    public class AdmobUtils
    {
        public static string ParseResponseInfo(ResponseInfo responseInfo)
        {
            string pubid = "";
            try
            {
                string responseInfoJson = responseInfo.ToString();
                JObject responseInfoObj = JObject.Parse(responseInfoJson);
                JToken loadedAdapterResponse = responseInfoObj["Response Extras"];
                if (loadedAdapterResponse != null)
                {
                    pubid = loadedAdapterResponse["mediation_group_name"]?.ToString();
                }
            }
            catch { }
            return pubid;
        }
        public static double GetBannerEcpm(BannerView bannerView)
        {
            return GetEcpm(bannerView, "bannerView", "adView", BannerStack);
        }
        public static double GetRewardedAdEcpm(RewardedAd rewardedAd)
        {
            return GetEcpm(rewardedAd, "androidRewardedAd", "rewardedAd", RvStack);
        }
        public static double GetInterstitialAdEcpm(InterstitialAd interstitialAd)
        {
            return GetEcpm(interstitialAd, "androidInterstitialAd", "interstitialAd", IvStack);
        }
        public static double GetAppOpenAdEcpm(AppOpenAd appOpenAd)
        {
            return GetEcpm(appOpenAd, "androidAppOpenAd", "appOpenAd", SpStack);
        }
        private static double GetEcpm(object o, string cShapeFieldName, string javaFieldName, string[] stack)
        {
            try
            {
                return GetEcpm(GetAdValue(GetJavaAdViewOjb(o, cShapeFieldName, javaFieldName), stack));
            }
            catch (Exception e)
            {
                LoggerUtils.Error("[AdmobTools] e : " + e.Message + "\t cShapeFieldName : " + cShapeFieldName);
            }
            return -1;
        }
        private static readonly string[] BannerStack = { "zza", "zzj", "zzi", "zze", "zza", "zzk", "zzae" };
        private static readonly string[] SpStack = { "zzb", "zzi", "zze", "zze", "zzae" };
        private static readonly string[] IvStack = { "zzc", "zzj", "zzf", "zzd", "zzae" };
        private static readonly string[] RvStack = { "zzb", "zzi", "zze", "zze", "zzae" };
        /// 
        /// 获取java ad view 对象
        /// 
        /// unity admob 实例化对象
        /// unity 引用 java 桥阶层的属性名
        /// java桥阶层,持有ad对象的方法名
        /// 
        private static AndroidJavaObject GetJavaAdViewOjb(object o, string cShapeFieldName, string javaFieldName)
        {
            if (o == null)
            {
                throw new NullReferenceException("adView is null ; " + cShapeFieldName + "\t " + javaFieldName);
            }
            var type = o.GetType(); // 获取 BannerView 类型
            var fieldInfo = type.GetField("_client", BindingFlags.NonPublic | BindingFlags.Instance); // 获取 _client 字段信息
            if (fieldInfo == null)
            {
                throw new NullReferenceException("fieldInfo is null ; " + cShapeFieldName + "\t " + javaFieldName);
            }
            var client = fieldInfo.GetValue(o); // 获取 _client 字段的值
            var clientType = client.GetType();
            var bannerViewFieldInfo = clientType.GetField(cShapeFieldName, BindingFlags.NonPublic | BindingFlags.Instance);
            if (bannerViewFieldInfo == null)
            {
                throw new NullReferenceException("cShapeFieldName fieldInfo is null ; " + cShapeFieldName + "\t " + javaFieldName);
            }
            var bannerViewAndroidJavaObject = (AndroidJavaObject)bannerViewFieldInfo.GetValue(client);
            var javaAdViewOjb = bannerViewAndroidJavaObject.Get(javaFieldName);
            if (javaAdViewOjb == null)
            {
                throw new NullReferenceException("java obj is null ; " + cShapeFieldName + "\t " + javaFieldName);
            }
            return javaAdViewOjb;
        }
        /// 
        /// 获取 admob 的 AdValue 对象
        /// 
        /// admob 广告对象
        /// 内存位置
        /// AdValue 的对象
        private static AndroidJavaObject GetAdValue(AndroidJavaObject obj, string[] stack)
        {
            return stack.Aggregate(obj, (current, field) =>
            {
                var androidJavaObject = current.Get(field);
                if (androidJavaObject == null)
                {
                    throw new NullReferenceException("androidJavaObject is null ; " + current + "\t " + field);
                }
                return androidJavaObject;
            });
        }
        /// 
        /// 获取 ecpm
        /// 
        /// admob AdValue对象
        /// 广告收益
        private static double GetEcpm(AndroidJavaObject obj)
        {
            return obj.Get("zzd") * 1.0 / 1000000;
        }
    }
}