#if UNITY_ANDROID
using System;
using InMobiAds.Api.UnifiedId;
using InMobiAds.Common;
using UnityEngine;

namespace InMobiAds.Platforms.Android
{
    internal class InMobiUnifiedIdClient : AndroidJavaProxy, IInMobiUnifiedIdClient
    {
        private AndroidJavaObject inMobiUnifiedIdServicePlugin;

        public event EventHandler<OnFetchCompletedEventArgs> OnFetchCompleted;

        public InMobiUnifiedIdClient() : base(Utils.InMobiUnifiedIdInterfaceClassName)
        {
            inMobiUnifiedIdServicePlugin = new AndroidJavaObject(Utils.InMobiUnifiedIdServicePluginClassName, this);
        }

        public void Push(InMobiUserDataModel inMobiUserDataModel)
        {
            this.inMobiUnifiedIdServicePlugin.Call("push", new object[1] { convertToAndroidInMobiUserDataModel(inMobiUserDataModel) });
        }

        public void FetchUnifiedIds()
        {
            inMobiUnifiedIdServicePlugin.Call("fetchUnifiedIds");
        }

        public void Reset()
        {
            this.inMobiUnifiedIdServicePlugin.Call("reset");
        }

        private object convertToAndroidInMobiUserDataModel(InMobiUserDataModel inMobiUserDataModel)
        {
            if (inMobiUserDataModel == null)
                return null;

            AndroidJavaObject androidInMobiUserDataModelBuilder = new AndroidJavaObject(Utils.InMobiUserDataModelBuilderClassName);
            androidInMobiUserDataModelBuilder.Call<AndroidJavaObject>("phoneNumber", new object[1] { convertToAndroidInMobiUserDataType(inMobiUserDataModel.PhoneNumber) });
            androidInMobiUserDataModelBuilder.Call<AndroidJavaObject>("emailId", new object[1] { convertToAndroidInMobiUserDataType(inMobiUserDataModel.EmailId) });
            androidInMobiUserDataModelBuilder.Call<AndroidJavaObject>("extras", new object[1] { Utils.ConvertDictionaryToJavaMap(inMobiUserDataModel.Extras) });
            AndroidJavaObject androidInMobiUserDataModel = new AndroidJavaObject(Utils.InMobiUserDataModelClassName);
            androidInMobiUserDataModel = androidInMobiUserDataModelBuilder.Call<AndroidJavaObject>("build");
            return androidInMobiUserDataModel;
        }

        private object convertToAndroidInMobiUserDataType(InMobiUserDataTypes inMobiUserDataTypes)
        {
            if (inMobiUserDataTypes == null)
                return null;

            AndroidJavaObject androidInMobiUserDataTypeBuilder = new AndroidJavaObject(Utils.InMobiUserDataTypesBuilderClassName);
            if(inMobiUserDataTypes.Md5!=null)
                androidInMobiUserDataTypeBuilder.Call<AndroidJavaObject>("md5", new object[1] { new AndroidJavaObject("java.lang.String", inMobiUserDataTypes.Md5) });
            if (inMobiUserDataTypes.Sha1 != null)
                androidInMobiUserDataTypeBuilder.Call<AndroidJavaObject>("sha1", new object[1] { new AndroidJavaObject("java.lang.String", inMobiUserDataTypes.Sha1) });
            if (inMobiUserDataTypes.Sha256 != null)
                androidInMobiUserDataTypeBuilder.Call< AndroidJavaObject>("sha256", new object[1] { new AndroidJavaObject("java.lang.String", inMobiUserDataTypes.Sha256) });
            AndroidJavaObject androidInMobiUserDataType = new AndroidJavaObject(Utils.InMobiUserDataTypesClassName);
            androidInMobiUserDataType = androidInMobiUserDataTypeBuilder.Call<AndroidJavaObject>("build");
            return androidInMobiUserDataType;
        }

        public void onFetchCompleted(AndroidJavaObject onFetchCompletedResponse)
        {
            OnFetchCompletedEventArgs args = new OnFetchCompletedEventArgs()
            {
                unifiedIds = onFetchCompletedResponse.Call<string>("getUnifiedIds"),
                error = onFetchCompletedResponse.Call<string>("getError")
            };
            this.OnFetchCompleted(this, args);
        }
    }
}
#endif