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

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

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

    private static int lastId = 1;

    private int id;
    #endif
            
    public bool IsAvailable
    {
        get
        {
            #if UNITY_ANDROID && !UNITY_EDITOR
            return interstitialAd.Call<bool>("isAvailable");
            #elif UNITY_IOS && !UNITY_EDITOR
            return Wortise_Interstitial_IsAvailable(id);
            #else
            return false;
            #endif
        }
    }
    
    public bool IsDestroyed
    {
        get
        {
            #if UNITY_ANDROID && !UNITY_EDITOR
            return interstitialAd.Call<bool>("isDestroyed");
            #elif UNITY_IOS && !UNITY_EDITOR
            return Wortise_Interstitial_IsDestroyed(id);
            #else
            return false;
            #endif
        }
    }

    public bool IsShowing
    {
        get
        {
            #if UNITY_ANDROID && !UNITY_EDITOR
            return interstitialAd.Call<bool>("isShowing");
            #elif UNITY_IOS && !UNITY_EDITOR
            return Wortise_Interstitial_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 WortiseInterstitial(string adUnitId)
    {
        #if UNITY_ANDROID && !UNITY_EDITOR
        interstitialAd = new AndroidJavaObject("com.wortise.ads.interstitial.InterstitialAd", activity, adUnitId);
        interstitialAd.Call("setListener", new InterstitialAdListener(this));
        #elif UNITY_IOS && !UNITY_EDITOR
        id = lastId++;

        instances.Add(id, this);

        Wortise_Interstitial_Create(id, adUnitId);
        #endif
    }

    public void Destroy()
    {
        #if UNITY_ANDROID && !UNITY_EDITOR
        interstitialAd.Call("destroy");
        #elif UNITY_IOS && !UNITY_EDITOR
        Wortise_Interstitial_Destroy(id);

        instances.Remove(id);
        #endif
    }

    public void LoadAd()
    {
        #if UNITY_ANDROID && !UNITY_EDITOR
        interstitialAd.Call("loadAd");
        #elif UNITY_IOS && !UNITY_EDITOR
        Wortise_Interstitial_LoadAd(id);
        #endif
    }
    
    public void ShowAd()
    {
        #if UNITY_ANDROID && !UNITY_EDITOR
        if (activity != null)
        {
            interstitialAd.Call("showAd", activity);
        }
        #elif UNITY_IOS && !UNITY_EDITOR
        Wortise_Interstitial_ShowAd(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
    private class InterstitialAdListener : AndroidJavaProxy
    {
        private WortiseInterstitial interstitialAd;


        public InterstitialAdListener(WortiseInterstitial interstitialAd) : base("com.wortise.ads.interstitial.InterstitialAd$Listener")
        {
            this.interstitialAd = interstitialAd;
        }
        
        public void onInterstitialClicked(AndroidJavaObject ad)
        {
            interstitialAd.OnAdClicked();
        }

        public void onInterstitialDismissed(AndroidJavaObject ad)
        {
            interstitialAd.OnAdDismissed();
        }

        public void onInterstitialFailedToLoad(AndroidJavaObject ad, AndroidJavaObject error)
        {
            interstitialAd.OnAdFailedToLoad();
        }

        public void onInterstitialFailedToShow(AndroidJavaObject ad, AndroidJavaObject error)
        {
            interstitialAd.OnAdFailedToShow();
        }

        public void onInterstitialImpression(AndroidJavaObject ad)
        {
            interstitialAd.OnAdImpression();
        }

        public void onInterstitialLoaded(AndroidJavaObject ad)
        {
            interstitialAd.OnAdLoaded();
        }

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

            if (revenue == null)
            {
                return;
            }

            interstitialAd.OnAdRevenuePaid(revenue);
        }

        public void onInterstitialShown(AndroidJavaObject ad)
        {
            interstitialAd.OnAdShown();
        }
    }
    #endif

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

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

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

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

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

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

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