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

public class WortiseAppOpen
{
    #if UNITY_ANDROID && !UNITY_EDITOR
    private static AndroidJavaObject activity
    {
        get
        {
            return WortiseSdk.activity;
        }
    }

    private AndroidJavaObject appOpenAd;
    #endif

    #if UNITY_IOS && !UNITY_EDITOR
    public static Dictionary<int, WortiseAppOpen> instances = new Dictionary<int, WortiseAppOpen>();

    private static int lastId = 1;

    private int id;
    #endif

    public bool AutoReload
    {
        get
        {
            #if UNITY_ANDROID && !UNITY_EDITOR
            return appOpenAd.Call<bool>("getAutoReload");
            #elif UNITY_IOS && !UNITY_EDITOR
            return Wortise_AppOpen_GetAutoReload(id);
            #else
            return false;
            #endif
        }

        set
        {
            #if UNITY_ANDROID && !UNITY_EDITOR
            appOpenAd.Call("setAutoReload", value);
            #elif UNITY_IOS && !UNITY_EDITOR
            Wortise_AppOpen_SetAutoReload(id, value);
            #endif
        }
    }

    public bool IsAvailable
    {
        get
        {
            #if UNITY_ANDROID && !UNITY_EDITOR
            return appOpenAd.Call<bool>("isAvailable");
            #elif UNITY_IOS && !UNITY_EDITOR
            return Wortise_AppOpen_IsAvailable(id);
            #else
            return false;
            #endif
        }
    }
    
    public bool IsDestroyed
    {
        get
        {
            #if UNITY_ANDROID && !UNITY_EDITOR
            return appOpenAd.Call<bool>("isDestroyed");
            #elif UNITY_IOS && !UNITY_EDITOR
            return Wortise_AppOpen_IsDestroyed(id);
            #else
            return false;
            #endif
        }
    }

    public bool IsShowing
    {
        get
        {
            #if UNITY_ANDROID && !UNITY_EDITOR
            return appOpenAd.Call<bool>("isShowing");
            #elif UNITY_IOS && !UNITY_EDITOR
            return Wortise_AppOpen_IsShowing(id);
            #else
            return false;
            #endif
        }
    }


    public event Action OnClicked;
    public event Action OnDismissed;
    public event Action OnFailedToLoad;
    public event Action OnFailedToShow;
    public event Action OnImpression;
    public event Action OnLoaded;
    public event Action<WortiseRevenueData> OnRevenuePaid;
    public event Action OnShown;


    public WortiseAppOpen(string adUnitId)
    {
        #if UNITY_ANDROID && !UNITY_EDITOR
        appOpenAd = new AndroidJavaObject("com.wortise.ads.appopen.AppOpenAd", activity, adUnitId);
        appOpenAd.Call("setListener", new AppOpenAdListener(this));
        #elif UNITY_IOS && !UNITY_EDITOR
        id = lastId++;

        instances.Add(id, this);

        Wortise_AppOpen_Create(id, adUnitId);
        #endif
    }
    
    public void Destroy()
    {
        #if UNITY_ANDROID && !UNITY_EDITOR
        appOpenAd.Call("destroy");
        #elif UNITY_IOS && !UNITY_EDITOR
        Wortise_AppOpen_Destroy(id);

        instances.Remove(id);
        #endif
    }
    
    public void LoadAd()
    {
        #if UNITY_ANDROID && !UNITY_EDITOR
        appOpenAd.Call("loadAd");
        #elif UNITY_IOS && !UNITY_EDITOR
        Wortise_AppOpen_LoadAd(id);
        #endif
    }
    
    public void ShowAd()
    {
        #if UNITY_ANDROID && !UNITY_EDITOR
        if (activity != null)
        {
            appOpenAd.Call("showAd", activity);
        }
        #elif UNITY_IOS && !UNITY_EDITOR
        Wortise_AppOpen_ShowAd(id);
        #endif
    }

    public void TryToShowAd()
    {
        #if UNITY_ANDROID && !UNITY_EDITOR
        appOpenAd.Call("tryToShowAd", activity);
        #elif UNITY_IOS && !UNITY_EDITOR
        Wortise_AppOpen_TryToShowAd(id);
        #endif
    }


    internal void OnAdClicked()
    {
        WortiseSdk.RaiseAction(OnClicked);
    }

    internal void OnAdDismissed()
    {
        WortiseSdk.RaiseAction(OnDismissed);
    }

    internal void OnAdFailedToLoad()
    {
        WortiseSdk.RaiseAction(OnFailedToLoad);
    }

    internal void OnAdFailedToShow()
    {
        WortiseSdk.RaiseAction(OnFailedToShow);
    }

    internal void OnAdImpression()
    {
        WortiseSdk.RaiseAction(OnImpression);
    }

    internal void OnAdLoaded()
    {
        WortiseSdk.RaiseAction(OnLoaded);
    }

    internal void OnAdRevenuePaid(WortiseRevenueData data)
    {
        WortiseSdk.RaiseAction(() =>
        {
            OnRevenuePaid?.Invoke(data);
        });
    }

    internal void OnAdShown()
    {
        WortiseSdk.RaiseAction(OnShown);
    }
    
    
    #if UNITY_ANDROID && !UNITY_EDITOR
    class AppOpenAdListener : AndroidJavaProxy
    {
        private WortiseAppOpen appOpenAd;


        public AppOpenAdListener(WortiseAppOpen appOpenAd) : base("com.wortise.ads.appopen.AppOpenAd$Listener")
        {
            this.appOpenAd = appOpenAd;
        }
        
        public void onAppOpenClicked(AndroidJavaObject ad)
        {
            appOpenAd.OnAdClicked();
        }

        public void onAppOpenDismissed(AndroidJavaObject ad)
        {
            appOpenAd.OnAdDismissed();
        }

        public void onAppOpenFailedToLoad(AndroidJavaObject ad, AndroidJavaObject error)
        {
            appOpenAd.OnAdFailedToLoad();
        }

        public void onAppOpenFailedToShow(AndroidJavaObject ad, AndroidJavaObject error)
        {
            appOpenAd.OnAdFailedToShow();
        }

        public void onAppOpenImpression(AndroidJavaObject ad)
        {
            appOpenAd.OnAdImpression();
        }

        public void onAppOpenLoaded(AndroidJavaObject ad)
        {
            appOpenAd.OnAdLoaded();
        }

        public void onAppOpenRevenuePaid(AndroidJavaObject ad, AndroidJavaObject data)
        {
            WortiseRevenueData revenue = WortiseRevenueData.FromAndroidJavaObject(data);

            if (revenue == null)
            {
                return;
            }

            appOpenAd.OnAdRevenuePaid(revenue);
        }

        public void onAppOpenShown(AndroidJavaObject ad)
        {
            appOpenAd.OnAdShown();
        }
    }
    #endif

    #if UNITY_IOS && !UNITY_EDITOR
    [DllImport("__Internal")]
    private static extern void Wortise_AppOpen_Create(int id, String adUnitId);

    [DllImport("__Internal")]
    private static extern void Wortise_AppOpen_Destroy(int id);

    [DllImport("__Internal")]
    private static extern bool Wortise_AppOpen_GetAutoReload(int id);

    [DllImport("__Internal")]
    private static extern bool Wortise_AppOpen_IsAvailable(int id);

    [DllImport("__Internal")]
    private static extern bool Wortise_AppOpen_IsDestroyed(int id);

    [DllImport("__Internal")]
    private static extern bool Wortise_AppOpen_IsShowing(int id);

    [DllImport("__Internal")]
    private static extern void Wortise_AppOpen_LoadAd(int id);

    [DllImport("__Internal")]
    private static extern void Wortise_AppOpen_SetAutoReload(int id, bool value);

    [DllImport("__Internal")]
    private static extern void Wortise_AppOpen_ShowAd(int id);

    [DllImport("__Internal")]
    private static extern void Wortise_AppOpen_TryToShowAd(int id);
    #endif
}
