#if UNITY_ANDROID

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class VrtcalAndroid
{
    private static readonly AndroidJavaClass AndroidBridge =
            new AndroidJavaClass("com.vrtcal.sdk.platformplugin.VrtcalSdkBridge");
    private static readonly VrtcalAndroidSdkBridgeListener AndroidSdkBridgeListener =
            new VrtcalAndroidSdkBridgeListener();

    public static void InitSdk(int appId)
    {
        AndroidBridge.CallStatic("setPlatform", new object[] {"UNITY"});

        AndroidJavaObject activity = GetActivity();

        bool isAdvertisingInfoSupported = Application.RequestAdvertisingIdentifierAsync(
            (string advertisingId, bool trackingEnabled, string errorMsg) =>
            {
                AndroidBridge.CallStatic("setAdvertisingInfo", new object[] {advertisingId, trackingEnabled});
                AndroidBridge.CallStatic("initSdk", new object[] {activity, appId, AndroidSdkBridgeListener});
            }
        );
        if (!isAdvertisingInfoSupported) {
            AndroidBridge.CallStatic("initSdk", new object[] {activity, appId, AndroidSdkBridgeListener});
        }

        if (Input.location.isEnabledByUser)
        {
            Input.location.Start();
        }
    }

    public static void SetPiiData(string piiDataType, string piiDataValue)
    {
        if (piiDataType == "e")
        {
            AndroidBridge.CallStatic("setPiiData", new object[] {"EMAIL", piiDataValue});
        }
        if (piiDataType == "p")
        {
            AndroidBridge.CallStatic("setPiiData", new object[] {"PHONE_NUMBER", piiDataValue});
        }
    }

    public static void LoadTopBanner(int adUnitId, float width, float height)
    {
        SetLocation();

        AndroidJavaObject activity = GetActivity();
        AndroidBridge.CallStatic("loadTopBanner", new object[] {activity, adUnitId, DipToPx(width), DipToPx(height),
                AndroidSdkBridgeListener});
    }

    public static void LoadBottomBanner(int adUnitId, float width, float height)
    {
        SetLocation();

        AndroidJavaObject activity = GetActivity();
        AndroidBridge.CallStatic("loadBottomBanner", new object[] {activity, adUnitId, DipToPx(width), DipToPx(height),
                AndroidSdkBridgeListener});
    }

    public static void LoadBanner(int adUnitId, float x, float y, float width, float height)
    {
        SetLocation();

        AndroidJavaObject activity = GetActivity();
        AndroidBridge.CallStatic("loadBannerAtPosition", new object[] {activity, adUnitId, DipToPx(x), DipToPx(y),
                DipToPx(width), DipToPx(height), AndroidSdkBridgeListener});
    }

    public static void MoveBanner(int adUnitId, float x, float y)
    {
        AndroidBridge.CallStatic("moveBanner", new object[] {adUnitId, DipToPx(x), DipToPx(y)});
    }

    public static void DestroyBanner(int adUnitId)
    {
        AndroidBridge.CallStatic("destroyBanner", new object[] {adUnitId});
    }

    public static void LoadInterstitial(int adUnitId)
    {
        SetLocation();
        AndroidJavaObject activity = GetActivity();
        AndroidBridge.CallStatic("loadInterstitial", new object[] {activity, adUnitId, AndroidSdkBridgeListener});
    }

    public static void ShowInterstitial(int adUnitId)
    {
        AndroidBridge.CallStatic("showInterstitial", new object[] {adUnitId});
    }

    public static void DestroyInterstitial(int adUnitId)
    {
        AndroidBridge.CallStatic("destroyInterstitial", new object[] {adUnitId});
    }

    private static float GetDisplayDensity()
    {
        AndroidJavaObject activity = GetActivity();
        return AndroidBridge.CallStatic<float>("getDisplayDensity", new object[] {activity});
    }

    private static AndroidJavaObject GetActivity()
    {
        AndroidJavaClass unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        return unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity");
    }

    private static void SetLocation()
    {
        try
        {
            if (Input.location.status == LocationServiceStatus.Running)
            {
                object[] locationData = new object[6];
                locationData[0] = Input.location.lastData.latitude;
                locationData[1] = Input.location.lastData.longitude;
                locationData[2] = Input.location.lastData.horizontalAccuracy;
                locationData[3] = Input.location.lastData.verticalAccuracy;
                locationData[4] = Input.location.lastData.altitude;
                locationData[5] = System.Convert.ToInt64(Input.location.lastData.timestamp * 1000.0);
                AndroidBridge.CallStatic("setLocation", locationData);
            }
        }
        catch (Exception e)
        {
            Debug.Log("Exception setting location: " + e);
        }
    }

    private static int DipToPx(float dip)
    {
        return (Mathf.RoundToInt(dip * GetDisplayDensity()));
    }


    class VrtcalAndroidSdkBridgeListener : AndroidJavaProxy
    {
        private const string LogTag = "VrtcalAndroidSdkBridgeListener";

        public VrtcalAndroidSdkBridgeListener() : base("com.vrtcal.sdk.platformplugin.VrtcalSdkBridgeListener")
        {
        }

        public void onSdkInitialized()
        {
            Debug.Log(LogTag + ": " + "onSdkInitialized() called");
            Vrtcal.OnSdkInitializedEvent.Invoke(null);
        }

        public void onSdkFailedToInitialize(string reason)
        {
            Debug.Log(LogTag + ": " + "onSdkFailedToInitialize() called with reason: " + reason);
            Vrtcal.OnSdkFailedToInitializeEvent.Invoke(reason);
        }

        public void onBannerLoaded(int adUnitId)
        {
            Debug.Log(LogTag + ": " + "onBannerLoaded() called with zone ID " + adUnitId);
            Vrtcal.OnBannerLoadedEvent.Invoke(adUnitId, null);
        }

        public void onBannerFailedToLoad(int adUnitId, string reason)
        {
            Debug.Log(LogTag + ": " + "onBannerFailedToLoad() called with zone ID " + adUnitId
                    + " and reason: " + reason);
            Vrtcal.OnBannerFailedToLoadEvent.Invoke(adUnitId, reason);
        }

        public void onBannerClicked(int adUnitId)
        {
            Debug.Log(LogTag + ": " + "onBannerClicked() called with zone ID " + adUnitId);
            Vrtcal.OnBannerClickedEvent.Invoke(adUnitId, null);
        }

        public void onBannerExpanded(int adUnitId)
        {
            Debug.Log(LogTag + ": " + "onBannerExpanded() called with zone ID " + adUnitId);
            Vrtcal.OnBannerWillPresentModalEvent.Invoke(adUnitId, null);
        }

        public void onBannerCollapsed(int adUnitId)
        {
            Debug.Log(LogTag + ": " + "onBannerCollapsed() called with zone ID " + adUnitId);
            Vrtcal.OnBannerDidDismissModalEvent.Invoke(adUnitId, null);
        }

        public void onBannerVideoStarted(int adUnitId)
        {
            Debug.Log(LogTag + ": " + "onBannerVideoStarted() called with zone ID " + adUnitId);
            Vrtcal.OnBannerVideoStartedEvent.Invoke(adUnitId, null);
        }

        public void onBannerVideoCompleted(int adUnitId)
        {
            Debug.Log(LogTag + ": " + "onBannerVideoCompleted() called with zone ID " + adUnitId);
            Vrtcal.OnBannerVideoCompletedEvent.Invoke(adUnitId, null);
        }

        public void onInterstitialLoaded(int adUnitId)
        {
            Debug.Log(LogTag + ": " + "onInterstitialLoaded() called with zone ID " + adUnitId);
            Vrtcal.OnInterstitialLoadedEvent.Invoke(adUnitId, null);
        }

        public void onInterstitialFailedToLoad(int adUnitId, string reason)
        {
            Debug.Log(LogTag + ": " + "onInterstitialFailedToLoad() called with zone ID " + adUnitId
                    + " and reason: " + reason);
            Vrtcal.OnInterstitialFailedToLoadEvent.Invoke(adUnitId, reason);
        }

        public void onInterstitialShown(int adUnitId)
        {
            Debug.Log(LogTag + ": " + "onInterstitialShown() called with zone ID " + adUnitId);
            Vrtcal.OnInterstitialShownEvent.Invoke(adUnitId, null);
        }

        public void onInterstitialFailedToShow(int adUnitId, string reason)
        {
            Debug.Log(LogTag + ": " + "onInterstitialFailedToShow() called with zone ID "
                    + adUnitId + " and reason: " + reason);
            Vrtcal.OnInterstitialFailedToShowEvent.Invoke(adUnitId, reason);
        }

        public void onInterstitialClicked(int adUnitId)
        {
            Debug.Log(LogTag + ": " + "onInterstitialClicked() called with zone ID " + adUnitId);
            Vrtcal.OnInterstitialClickedEvent.Invoke(adUnitId, null);
        }

        public void onInterstitialDismissed(int adUnitId)
        {
            Debug.Log(LogTag + ": " + "onInterstitialDismissed() called with zone ID " + adUnitId);
            Vrtcal.OnInterstitialDismissedEvent.Invoke(adUnitId, null);
        }
    }
}

#endif
