﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
#if UNITY_IOS && !UNITY_EDITOR
using System.Runtime.InteropServices;
#endif
using UnityEngine;

public class WortiseSdk
{
    #if UNITY_ANDROID && !UNITY_EDITOR
    public static AndroidJavaObject activity
    {
        get
        {
            AndroidJavaClass playerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            return playerClass.GetStatic<AndroidJavaObject>("currentActivity");
        }
    }
    
    private static AndroidJavaClass wortiseSdk;
    #endif

    private static SynchronizationContext _synchronizationContext;

    private static int _unityMainThreadId;
   

    public static bool IsInitialized
    {
        get
        {
            #if UNITY_ANDROID && !UNITY_EDITOR
            return wortiseSdk.CallStatic<bool>("isInitialized");
            #elif UNITY_IOS && !UNITY_EDITOR
            return Wortise_IsInitialized();
            #else
            return false;
            #endif
        }
    }

    public static bool IsReady
    {
        get
        {
            #if UNITY_ANDROID && !UNITY_EDITOR
            return wortiseSdk.CallStatic<bool>("isReady");
            #elif UNITY_IOS && !UNITY_EDITOR
            return Wortise_IsReady();
            #else
            return false;
            #endif
        }
    }

    public static event Action OnInitialized;

    public static string Version
    {
        get
        {
            #if UNITY_ANDROID && !UNITY_EDITOR
            return wortiseSdk.CallStatic<string>("getVersion");
            #elif UNITY_IOS && !UNITY_EDITOR
            return Wortise_GetVersion();
            #else
            return null;
            #endif
        }
    }


    static WortiseSdk()
    {
        SetUnityMainThreadSynchronizationContext();

        #if UNITY_ANDROID && !UNITY_EDITOR
        wortiseSdk = new AndroidJavaClass("com.wortise.ads.WortiseSdk");
        #endif
    }

    public static void Initialize(string assetKey)
    {
        #if UNITY_ANDROID && !UNITY_EDITOR
        if (activity != null)
        {
            wortiseSdk.CallStatic("initialize", activity, assetKey, new SdkInitializationListener());
        }
        #elif UNITY_IOS && !UNITY_EDITOR
        Wortise_Initialize(assetKey);
        #endif
    }


    public static void OnSdkInitialized()
    {
        WortiseSdk.RaiseAction(OnInitialized);
    }


    internal static void RaiseAction(Action action)
    {
        if (action == null)
        {
            return;
        }

        if (_synchronizationContext == null || Thread.CurrentThread.ManagedThreadId == _unityMainThreadId)
        {
            action();
            return;
        }

        _synchronizationContext.Post((state) =>
        {
            action();
        }, action);
    }

    internal static void SetUnityMainThreadSynchronizationContext()
    {
        _synchronizationContext = SynchronizationContext.Current;
        _unityMainThreadId = Thread.CurrentThread.ManagedThreadId;
    }


    #if UNITY_ANDROID && !UNITY_EDITOR
    class SdkInitializationListener : AndroidJavaProxy
    {
        public SdkInitializationListener() : base("com.wortise.ads.unity.SdkInitializationListener")
        {
        }
        
        public AndroidJavaObject invoke()
        {
            OnSdkInitialized();
            return null;
        }
    }
    #endif

    #if UNITY_IOS && !UNITY_EDITOR
    [DllImport("__Internal")]
    private static extern string Wortise_GetVersion();

    [DllImport("__Internal")]
    private static extern void Wortise_Initialize(string assetKey);

    [DllImport("__Internal")]
    private static extern bool Wortise_IsInitialized();

    [DllImport("__Internal")]
    private static extern bool Wortise_IsReady();
    #endif
}
