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

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

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

    private static int lastId = 1;

    private int id;
    #endif


    public int AdHeight
    {
        get
        {
            #if UNITY_ANDROID && !UNITY_EDITOR
            return bannerAd.Call<int>("getAdHeight");
            #elif UNITY_IOS && !UNITY_EDITOR
            return Wortise_Banner_GetAdHeight(id);
            #else
            return -1;
            #endif
        }
    }

    public int AdHeightPx
    {
        get
        {
            #if UNITY_ANDROID && !UNITY_EDITOR
            return bannerAd.Call<int>("getAdHeightPx");
            #elif UNITY_IOS && !UNITY_EDITOR
            return Wortise_Banner_GetAdHeightPx(id);
            #else
            return -1;
            #endif
        }
    }


    public int AdWidth
    {
        get
        {
            #if UNITY_ANDROID && !UNITY_EDITOR
            return bannerAd.Call<int>("getAdWidth");
            #elif UNITY_IOS && !UNITY_EDITOR
            return Wortise_Banner_GetAdWidth(id);
            #else
            return -1;
            #endif
        }
    }

    public int AdWidthPx
    {
        get
        {
            #if UNITY_ANDROID && !UNITY_EDITOR
            return bannerAd.Call<int>("getAdWidthPx");
            #elif UNITY_IOS && !UNITY_EDITOR
            return Wortise_Banner_GetAdWidthPx(id);
            #else
            return -1;
            #endif
        }
    }

    public long AutoRefreshTime
    {
        get
        {
            #if UNITY_ANDROID && !UNITY_EDITOR
            return bannerAd.Call<long>("getAutoRefreshTime");
            #elif UNITY_IOS && !UNITY_EDITOR
            return Wortise_Banner_GetAutoRefreshTime(id);
            #else
            return -1;
            #endif
        }

        set
        {
            #if UNITY_ANDROID && !UNITY_EDITOR
            bannerAd.Call("setAutoRefreshTime", value);
            #elif UNITY_IOS && !UNITY_EDITOR
            Wortise_Banner_SetAutoRefreshTime(id, value);
            #endif
        }
    }

    public bool IsAutoRefreshEnabled
    {
        get
        {
            #if UNITY_ANDROID && !UNITY_EDITOR
            return bannerAd.Call<bool>("isAutoRefreshEnabled");
            #elif UNITY_IOS && !UNITY_EDITOR
            return Wortise_Banner_IsAutoRefreshEnabled(id);
            #else
            return false;
            #endif
        }
    }
    
    public bool IsDestroyed
    {
        get
        {
            #if UNITY_ANDROID && !UNITY_EDITOR
            return bannerAd.Call<bool>("isDestroyed");
            #elif UNITY_IOS && !UNITY_EDITOR
            return Wortise_Banner_IsDestroyed(id);
            #else
            return false;
            #endif
        }
    }

    public bool IsLoading
    {
        get
        {
            #if UNITY_ANDROID && !UNITY_EDITOR
            return bannerAd.Call<bool>("isLoading");
            #elif UNITY_IOS && !UNITY_EDITOR
            return Wortise_Banner_IsLoading(id);
            #else
            return false;
            #endif
        }
    }

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

    
    public WortiseBanner(string adUnitId, WortiseAdSize size, WortiseAdPosition position)
    {
        #if UNITY_ANDROID && !UNITY_EDITOR
        bannerAd = new AndroidJavaObject(
            "com.wortise.ads.unity.BannerAd",
            activity,
            adUnitId,
            size.NativeObject,
            (int)position
        );

        bannerAd.Call("setListener", new BannerAdListener(this));
        #elif UNITY_IOS && !UNITY_EDITOR
        id = lastId++;

        instances.Add(id, this);

        Wortise_Banner_Create(
            id,
            adUnitId,
            size.Width,
            size.Height,
            size.AdType.ToString(),
            (int)position
        );
        #endif
    }

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

        instances.Remove(id);
        #endif
    }

    public void LoadAd()
    {
        #if UNITY_ANDROID && !UNITY_EDITOR
        bannerAd.Call("loadAd");
        #elif UNITY_IOS && !UNITY_EDITOR
        Wortise_Banner_LoadAd(id);
        #endif
    }


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

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

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

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

    internal void OnAdRevenuePaid(WortiseRevenueData data)
    {
        WortiseSdk.RaiseAction(() =>
        {
            OnRevenuePaid?.Invoke(data);
        });
    }
    
    
    #if UNITY_ANDROID && !UNITY_EDITOR
    private class BannerAdListener : AndroidJavaProxy
    {
        private WortiseBanner bannerAd;


        public BannerAdListener(WortiseBanner bannerAd) : base("com.wortise.ads.banner.BannerAd$Listener")
        {
            this.bannerAd = bannerAd;
        }
        
        public void onBannerClicked(AndroidJavaObject ad)
        {
            bannerAd.OnAdClicked();
        }

        public void onBannerFailedToLoad(AndroidJavaObject ad, AndroidJavaObject error)
        {
            bannerAd.OnAdFailedToLoad();
        }

        public void onBannerImpression(AndroidJavaObject ad)
        {
            bannerAd.OnAdImpression();
        }

        public void onBannerLoaded(AndroidJavaObject ad)
        {
            bannerAd.OnAdLoaded();
        }

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

            if (revenue == null)
            {
                return;
            }

            bannerAd.OnAdRevenuePaid(revenue);
        }
    }
    #endif

    #if UNITY_IOS && !UNITY_EDITOR
    [DllImport("__Internal")]
    private static extern void Wortise_Banner_Create(
        int    id,
        String adUnitId,
        int    adWidth,
        int    adHeight,
        String adType,
        int    adPosition
    );

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

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

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

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

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

    [DllImport("__Internal")]
    private static extern long Wortise_Banner_GetAutoRefreshTime(int id);

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

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

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

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

    [DllImport("__Internal")]
    private static extern void Wortise_Banner_SetAutoRefreshTime(int id, long value);
    #endif
}
