﻿#if UNITY_ANDROID
using System;
using System.Collections.Generic;
using UnityEngine;

namespace InMobiAds.Platforms.Android
{
	public class Utils
	{
		#region InMobi Ads Unity Plugin class names

		public const string InMobiPluginClassName = "com.unity.inmobi.plugin.InMobiPlugin";
		public const string SdkInitializationListener = "com.inmobi.sdk.SdkInitializationListener";
		public const string BannerAdClassName = "com.unity.inmobi.plugin.Banner";
		public const string BannerAdListenerClassName = "com.unity.inmobi.plugin.UnityBannerAdListener";
		public const string InterstitialAdClassName = "com.unity.inmobi.plugin.Interstitial";
		public const string InterstitialAdListenerClassName = "com.unity.inmobi.plugin.UnityInterstitialAdListener";

		public const string ASAdListenerClassName = "com.unity.inmobi.plugin.AS.ASUnityAdEventListener";
		public const string ASBannerAdClassName = "com.unity.inmobi.plugin.AS.ASBannerWrapper";
		public const string ASInterstitialAdClassName = "com.unity.inmobi.plugin.AS.ASInterstitialWrapper";
		public const string ASSdkClassName = "com.unity.inmobi.plugin.AS.AerServSdkPlugin";

		public const string InMobiUserDataModelClassName = "com.unity.inmobi.plugin.unifiedId.InMobiUserDataModel";
		public const string InMobiUserDataTypesClassName = "com.unity.inmobi.plugin.unifiedId.InMobiUserDataTypes";
		public const string InMobiUserDataModelBuilderClassName = "com.unity.inmobi.plugin.unifiedId.InMobiUserDataModel$Builder";
		public const string InMobiUserDataTypesBuilderClassName = "com.unity.inmobi.plugin.unifiedId.InMobiUserDataTypes$Builder";

		public const string InMobiUnifiedIdServicePluginClassName = "com.unity.inmobi.plugin.unifiedId.InMobiUnifiedIdService";
		public const string InMobiUnifiedIdInterfaceClassName = "com.unity.inmobi.plugin.unifiedId.UnityOnFetchUnifiedIdListener";

		#endregion

		#region Unity class names

		//public const string UnityActivityClassName = "com.unity3d.player.UnityPlayer";

		internal static AndroidJavaObject ConvertDictionaryToJavaMap(Dictionary<string, object> dictionary)
		{
			AndroidJavaObject map = new AndroidJavaObject("java.util.HashMap");
			IntPtr putMethod = AndroidJNIHelper.GetMethodID(map.GetRawClass(), "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
			object[] args = new object[2];
			foreach (KeyValuePair<string, object> kvp in dictionary)
			{
				args[0] = kvp.Key;

				if (kvp.Value is int)
				{
					args[1] = new AndroidJavaObject("java.lang.Integer", kvp.Value);
				}
				if (kvp.Value is float)
				{
					args[1] = new AndroidJavaObject("java.lang.Float", kvp.Value);
				}
				if (kvp.Value is double)
				{
					args[1] = new AndroidJavaObject("java.lang.Double", kvp.Value);
				}
				else if (kvp.Value is bool)
				{
					args[1] = new AndroidJavaObject("java.lang.Boolean", kvp.Value);
				}
				else if (kvp.Value is string)
				{
					args[1] = new AndroidJavaObject("java.lang.String", kvp.Value);
				}
				else if (kvp.Value is System.Collections.IDictionary)
				{
					args[1] = ConvertDictionaryToJavaMap((Dictionary<string, object>)kvp.Value);
				}

				AndroidJNI.CallObjectMethod(map.GetRawObject(), putMethod, AndroidJNIHelper.CreateJNIArgArray(args));
			}
			return map;
		}

		internal static AndroidJavaObject ConvertDictionaryToJavaMap(Dictionary<string, string> dictionary)
		{
			if (dictionary == null)
				return null;
			AndroidJavaObject map = new AndroidJavaObject("java.util.HashMap");
			IntPtr putMethod = AndroidJNIHelper.GetMethodID(map.GetRawClass(), "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
			object[] args = new object[2];
			foreach (KeyValuePair<string, string> kvp in dictionary)
			{
				args[0] = new AndroidJavaObject("java.lang.String", kvp.Key);
				args[1] = new AndroidJavaObject("java.lang.String", kvp.Value);
				AndroidJNI.CallObjectMethod(map.GetRawObject(), putMethod, AndroidJNIHelper.CreateJNIArgArray(args));
			}
			return map;
		}

		#endregion
	}
}
#endif


