#if UNITY_ANDROID
/*
*PubMatic Inc. ("PubMatic") CONFIDENTIAL
* Unpublished Copyright (c) 2006-2022 PubMatic, All Rights Reserved.
*
* NOTICE:  All information contained herein is, and remains the property of PubMatic. The intellectual and technical concepts contained
* herein are proprietary to PubMatic and may be covered by U.S. and Foreign Patents, patents in process, and are protected by trade secret or copyright law.
* Dissemination of this information or reproduction of this material is strictly forbidden unless prior written permission is obtained
* from PubMatic.  Access to the source code contained herein is hereby forbidden to anyone except current PubMatic employees, managers or contractors who have executed
* Confidentiality and Non-disclosure agreements explicitly covering such access or to such other persons whom are directly authorized by PubMatic to access the source code and are subject to confidentiality and nondisclosure obligations with respect to the source code.
*
* The copyright notice above does not evidence any actual or intended publication or disclosure  of  this source code, which includes
* information that is confidential and/or proprietary, and is a trade secret, of  PubMatic.   ANY REPRODUCTION, MODIFICATION, DISTRIBUTION, PUBLIC  PERFORMANCE,
* OR PUBLIC DISPLAY OF OR THROUGH USE  OF THIS  SOURCE CODE  WITHOUT  THE EXPRESS WRITTEN CONSENT OF PUBMATIC IS STRICTLY PROHIBITED, AND IN VIOLATION OF APPLICABLE
* LAWS AND INTERNATIONAL TREATIES.  THE RECEIPT OR POSSESSION OF  THIS SOURCE CODE AND/OR RELATED INFORMATION DOES NOT CONVEY OR IMPLY ANY RIGHTS
* TO REPRODUCE, DISCLOSE OR DISTRIBUTE ITS CONTENTS, OR TO MANUFACTURE, USE, OR SELL ANYTHING THAT IT  MAY DESCRIBE, IN WHOLE OR IN PART.
*/
using System;
using System.Collections.Generic;
using UnityEngine;
using OpenWrapSDK.Common;
namespace OpenWrapSDK.Android
{
    /// 
    /// Android specific Util class.
    /// 
    internal static class POBAndroidUtils {
        #region Private variables
        private static readonly string Tag = "POBAndroidUtils";
        #endregion
        /// 
        /// Returs the unity player activity.
        /// 
        /// Unity player activity
        internal static AndroidJavaObject getActivity() {
            AndroidJavaClass player = new AndroidJavaClass(POBConstants.UnityPlayerClassName);
            AndroidJavaObject activityContext = player.GetStatic("currentActivity");
            return activityContext;
        }
        /// 
        /// Converts native POBError class to POBErrorEventArgs
        /// 
        ///  native error object
        /// POBErrorEventArgs instance
        internal static POBErrorEventArgs ConvertToPOBErrorEventArgs(AndroidJavaObject _error)
        {
            POBErrorEventArgs _errorEventArgs = null;
            if (_error != null)
            {
                _errorEventArgs = new POBErrorEventArgs();
                _errorEventArgs.ErrorCode = _error.Call("getErrorCode");
                _errorEventArgs.Message = _error.Call("getErrorMessage");
            }
            else
            {
                POBLog.Warning(Tag, POBLogStrings.ConvertToPOBErrorEventArgsLog);
            }
            return _errorEventArgs;
        }
        /// 
        /// Converts native POBRewardClient class to POBRewardEventArgs
        /// 
        /// 
        /// 
        internal static POBRewardEventArgs GetPOBRewardEventArgs(AndroidJavaObject reward)
        {
            POBRewardEventArgs rewardEventArgs = null;
            if(reward != null)
            {
                POBRewardClient rewardClient = new POBRewardClient(reward);
                rewardEventArgs = new POBRewardEventArgs(rewardClient);
            }
            else
            {
                POBLog.Warning(Tag, POBLogStrings.GetPOBRewardEventArgsLog);
            }
            return rewardEventArgs;
        }
        /// 
        /// Converts C# POBAdSize class to native POBAdSize
        /// 
        /// ad size
        /// native POBAdSize
        internal static AndroidJavaObject ConvertToPOBAdSize(POBAdSize adSize)
        {
            if(adSize != null)
            {
                return new AndroidJavaObject(POBConstants.POBBannerAdSizeClassName, adSize.GetWidth(), adSize.GetHeight());
            }
            else
            {
                POBLog.Warning(Tag, POBLogStrings.ConvertToPOBAdSizeLog);
                return null;
            }
        }
        /// 
        /// Converts POBGender to respective JAVA enum instance
        /// 
        ///  gender instance
        /// 
        internal static AndroidJavaObject ConvertGenderToJavaObject(POBGender gender)
        {
            AndroidJavaClass POBGenderEnum = new AndroidJavaClass(POBConstants.POBGenderClassName);
            AndroidJavaObject enumObject = null;
            switch(gender)
            {
                case POBGender.Male:
                    enumObject = POBGenderEnum.GetStatic("MALE");
                    break;
                case POBGender.Female:
                    enumObject = POBGenderEnum.GetStatic("FEMALE");
                    break;
                case POBGender.Other:
                    enumObject = POBGenderEnum.GetStatic("OTHER");
                    break;
                default:
                    POBLog.Info(Tag, POBLogStrings.ConvertGenderToJavaObjectLog);
                    break;
            }
            return enumObject;
        }
        /// 
        /// Converts JAVA enum instance to respective POBGender enum.
        /// 
        /// JAVA enum instance
        /// POBGender type
        internal static POBGender GetPOBGender(AndroidJavaObject javaObject)
        {
            POBGender gender;
            if(javaObject != null)
            {
                string value = javaObject.Call("getValue");
                switch (value)
                {
                    case "M":
                        gender = POBGender.Male;
                        break;
                    case "F":
                        gender = POBGender.Female;
                        break;
                    case "O":
                        gender = POBGender.Other;
                        break;
                    default:
                        gender = POBGender.None;
                        break;
                }
            }
            else
            {
                POBLog.Warning(Tag, POBLogStrings.GetPOBGenderLog);
                return POBGender.None;
            }
            return gender;
        }
        /// 
        /// Converts POBLocSource to respective JAVA enum instance
        /// 
        ///  location source instance
        /// POBLocSource type
        internal static AndroidJavaObject ConvertLocationSourceToJavaObject(POBLocSource locSource)
        {
            AndroidJavaClass POBLocSourceEnum = new AndroidJavaClass(POBConstants.POBLocationSourceClassName);
            AndroidJavaObject enumObject;
            switch (locSource)
            {
                case POBLocSource.GPS:
                    enumObject = POBLocSourceEnum.GetStatic("GPS");
                    break;
                case POBLocSource.IPAddress:
                    enumObject = POBLocSourceEnum.GetStatic("IP_ADDRESS");
                    break;
                case POBLocSource.UserProvided:
                    enumObject = POBLocSourceEnum.GetStatic("USER");
                    break;
                default:
                    enumObject = null;
                    break;
            }
            return enumObject;
        }
        /// 
        /// Converts POBSDKLogLevel to respective JAVA enum instance
        /// 
        ///  log level instance
        /// POBSDKLogLevel type
        internal static AndroidJavaObject ConvertLogLevelToJavaObject(POBSDKLogLevel logLevel)
        {
            AndroidJavaClass POBLogLevelEnum = new AndroidJavaClass(POBConstants.POBLogLevelClassName);
            AndroidJavaObject enumObject;
            switch (logLevel)
            {
                case POBSDKLogLevel.All:
                    enumObject = POBLogLevelEnum.GetStatic("All");
                    break;
                case POBSDKLogLevel.Verbose:
                    enumObject = POBLogLevelEnum.GetStatic("Verbose");
                    break;
                case POBSDKLogLevel.Debug:
                    enumObject = POBLogLevelEnum.GetStatic("Debug");
                    break;
                case POBSDKLogLevel.Info:
                    enumObject = POBLogLevelEnum.GetStatic("Info");
                    break;
                case POBSDKLogLevel.Warning:
                    enumObject = POBLogLevelEnum.GetStatic("Warn");
                    break;
                case POBSDKLogLevel.Error:
                    enumObject = POBLogLevelEnum.GetStatic("Error");
                    break;
                case POBSDKLogLevel.Off:
                    enumObject = POBLogLevelEnum.GetStatic("Off");
                    break;
                default:
                    enumObject = null;
                    break;
            }
            return enumObject;
        }
        /// 
        /// Generic method to convert c# dictionary to java map
        /// 
        ///  instance of dictionary
        /// AndroidJavaObject of type map
        internal static AndroidJavaObject ConvertDictionaryToJavaMap(Dictionary dictionary)
        {
            AndroidJavaObject map = new AndroidJavaObject("java.util.HashMap");
            //Get the map's put method using reflection
            IntPtr putMethod = AndroidJNIHelper.GetMethodID(map.GetRawClass(), "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
            //iterate the dictionary and put every entry in java hash map
            foreach (var entry in dictionary)
            {
                AndroidJNI.CallObjectMethod(
                    map.GetRawObject(),
                    putMethod,
                    AndroidJNIHelper.CreateJNIArgArray(new object[] { entry.Key, entry.Value })
                );
            }
            return map;
        }
        /// 
        /// Generic method to convert c# list to java list
        /// 
        ///  instance of List
        /// AndroidJavaObject of type arrayList
        internal static AndroidJavaObject ConvertListToJavaList(List list)
        {
            AndroidJavaObject javaList = new AndroidJavaObject("java.util.ArrayList");
            if(list != null)
            {
                //Iterate the list and add each entry of c# list to java arrayList
                foreach (T obj in list)
                {
                    javaList.Call("add", obj);
                }
            }
            else
            {
                POBLog.Warning(Tag, POBLogStrings.ConvertListToJavaListLog);
            }
            return javaList;
        }
        /// 
        ///  Method to convert java map object to Dictionary
        /// 
        ///  AndroidJavaObject of map
        /// Dictionary of given map
        internal static Dictionary ConvertJavaMapToDictionary(AndroidJavaObject map)
        {
            var dict = new Dictionary();
            if (map != null)
            {
                var iterator = map.Call("keySet").Call("iterator");
                while (iterator.Call("hasNext"))
                {
                    K key = iterator.Call("next");
                    V value = map.Call("get", key);
                    dict.Add(key, value);
                }
            }
            else
            {
                POBLog.Warning(Tag, POBLogStrings.ConvertJavaMapToDictionaryLog);
            }
            return dict;
        }
        /// 
        ///  Method to convert native adPosition object to POBAdPosition
        /// 
        ///  value of adPosition enum
        /// instance of POBAdPosition
        internal static POBAdPosition convertJavaAdPostionToPOBAdPosition(int value)
        {
            POBAdPosition adPosition = POBAdPosition.Unknown;
            switch (value)
            {
                case 1:
                    adPosition = POBAdPosition.AboveTheFold;
                    break;
                case 3:
                    adPosition = POBAdPosition.BelowTheFold;
                    break;
                case 4:
                    adPosition = POBAdPosition.Footer;
                    break;
                case 5:
                    adPosition = POBAdPosition.Fullscreen;
                    break;
                case 6:
                    adPosition = POBAdPosition.Header;
                    break;
                case 7:
                    adPosition = POBAdPosition.Sidebar;
                    break;
                default:
                    adPosition = POBAdPosition.Unknown;
                    break;
            }
            return adPosition;
        }
        /// 
        ///  Method to convert  POBAdPosition object to native adPosition instance
        /// 
        ///  instance of POBAdPosition
        /// string representation of AdPosition
        internal static string convertPOBAdPostionToAdPosition(POBAdPosition adPosition)
        {
            string adPositionString;
            switch ((int)adPosition)
            { 
                case 1:
                    adPositionString = "ABOVE_THE_FOLD";
                    break;
                case 3:
                    adPositionString = "BELOW_THE_FOLD";
                    break;
                case 4:
                    adPositionString = "HEADER";
                    break;
                case 5:
                    adPositionString = "FOOTER";
                    break;
                case 6:
                    adPositionString = "SIDEBAR";
                    break;
                case 7:
                    adPositionString = "FULL_SCREEN";
                    break;
                default:
                    adPositionString = "UNKNOWN";
                    break;
            }
            return adPositionString;
        }
        /// 
        /// Converts c# dictionary to java JSONObject
        /// 
        ///  instance of dictionary 
        /// AndroidJavaObject of type JSONObject
        internal static AndroidJavaObject ConvertDictionaryToJavaJSONObject(Dictionary dictionary)
        {
            AndroidJavaObject extensionJsonObject = null;
            if(dictionary != null && dictionary.Count > 0)
            {
                // Initialise the AndroidJavaObject only when dictionary has some values in it.
                extensionJsonObject = new AndroidJavaObject("org.json.JSONObject");
                //Get the JSONObjects's put method using reflection
                IntPtr putMethod = AndroidJNIHelper.GetMethodID(extensionJsonObject.GetRawClass(), "put", "(Ljava/lang/String;Ljava/lang/Object;)Lorg.json/JSONObject;");
                //iterate the dictionary and put every entry in java Json object
                foreach (KeyValuePair entry in dictionary)
                {
                    AndroidJNI.CallObjectMethod(
                        extensionJsonObject.GetRawObject(),
                        putMethod,
                        AndroidJNIHelper.CreateJNIArgArray(new object[] { entry.Key, entry.Value })
                    );
                }
            }
            else
            {
                POBLog.Warning(Tag, POBLogStrings.ConvertDictionaryToJavaJSONObjectLog);
            }
            return extensionJsonObject;
        }
        /// 
        /// Converts java JSONObject to c# dictionary 
        /// 
        ///  instance of AndroidJavaObject of java JSONObject 
        /// AndroidJavaObject of type JSONObject
        internal static Dictionary ConvertJavaJSONObjectToDictionary(AndroidJavaObject androidJavaObject)
        {
            Dictionary extensionMap = null;
            if (androidJavaObject != null && androidJavaObject.Call("length") > 0)
            {
                // Initialise the dictionary only when Java JSONObject has some values in it.
                extensionMap = new Dictionary();
                // Iterate JSONObject and put its key and values to Dictionary of 
                AndroidJavaObject iteratorObject = androidJavaObject.Call("keys");
                while (iteratorObject.Call("hasNext"))
                {
                    string key = iteratorObject.Call("next");
                    string value = androidJavaObject.Call("getString", key);
                    extensionMap.Add(key, value);
                }
            }
            else
            {
                POBLog.Warning(Tag, POBLogStrings.ConvertJavaJSONObjectToDictionaryLog);
            }
            return extensionMap;
        }
    }
}
#endif