#if UNITY_IOS && !UNITY_EDITOR
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Globalization;
using UnityEngine;

public class WortiseEvents : MonoBehaviour
{
    private static WortiseEvents Instance;


    void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            gameObject.name = "WortiseEvents";
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }

    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    private static void Initialize()
    {
        if (Instance == null)
        {
            GameObject receiverObject = new GameObject("WortiseEvents");
            Instance = receiverObject.AddComponent<WortiseEvents>();
            DontDestroyOnLoad(receiverObject);
        }
    }


    // SDK events
    public void OnSdkInitialized(string message)
    {
        WortiseSdk.OnSdkInitialized();
    }


    // Consent manager events
    public void OnConsentRequestFinished(string message)
    {
        Dictionary<string, object> data = WortiseJson.Deserialize(message) as Dictionary<string, object>;

        int  id    = Convert.ToInt32  (data["id"]);
        bool shown = Convert.ToBoolean(data["shown"]);

        Action<bool> callback;

        if (WortiseConsentManager.requestCallbacks.TryGetValue(id, out callback))
        {
            WortiseConsentManager.requestCallbacks.Remove(id);
            callback?.Invoke(shown);
        }
    }


    // App open events
    public void OnAppOpenClicked(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseAppOpen instance;

        if (WortiseAppOpen.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdClicked();
        }
    }

    public void OnAppOpenDismissed(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseAppOpen instance;

        if (WortiseAppOpen.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdDismissed();
        }
    }

    public void OnAppOpenFailedToLoad(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseAppOpen instance;

        if (WortiseAppOpen.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdFailedToLoad();
        }
    }

    public void OnAppOpenFailedToShow(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseAppOpen instance;

        if (WortiseAppOpen.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdFailedToShow();
        }
    }

    public void OnAppOpenImpression(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseAppOpen instance;

        if (WortiseAppOpen.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdImpression();
        }
    }

    public void OnAppOpenLoaded(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseAppOpen instance;

        if (WortiseAppOpen.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdLoaded();
        }
    }

    public void OnAppOpenRevenuePaid(string message)
    {
        Dictionary<string, object> data = WortiseJson.Deserialize(message) as Dictionary<string, object>;

        int id = Convert.ToInt32(data["id"]);

        WortiseAppOpen instance;

        if (WortiseAppOpen.instances.TryGetValue(id, out instance))
        {
            WortiseRevenueData revenue = WortiseRevenueData.FromDictionary(data);

            instance?.OnAdRevenuePaid(revenue);
        }
    }

    public void OnAppOpenShown(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseAppOpen instance;

        if (WortiseAppOpen.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdShown();
        }
    }


    // Banner events
    public void OnBannerClicked(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseBanner instance;

        if (WortiseBanner.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdClicked();
        }
    }

    public void OnBannerFailedToLoad(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseBanner instance;

        if (WortiseBanner.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdFailedToLoad();
        }
    }

    public void OnBannerImpression(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseBanner instance;

        if (WortiseBanner.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdImpression();
        }
    }

    public void OnBannerLoaded(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseBanner instance;

        if (WortiseBanner.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdLoaded();
        }
    }

    public void OnBannerRevenuePaid(string message)
    {
        Dictionary<string, object> data = WortiseJson.Deserialize(message) as Dictionary<string, object>;

        int id = Convert.ToInt32(data["id"]);

        WortiseBanner instance;

        if (WortiseBanner.instances.TryGetValue(id, out instance))
        {
            WortiseRevenueData revenue = WortiseRevenueData.FromDictionary(data);

            instance?.OnAdRevenuePaid(revenue);
        }
    }


    // Interstitial events
    public void OnInterstitialClicked(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseInterstitial instance;

        if (WortiseInterstitial.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdClicked();
        }
    }

    public void OnInterstitialDismissed(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseInterstitial instance;

        if (WortiseInterstitial.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdDismissed();
        }
    }

    public void OnInterstitialFailedToLoad(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseInterstitial instance;

        if (WortiseInterstitial.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdFailedToLoad();
        }
    }

    public void OnInterstitialFailedToShow(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseInterstitial instance;

        if (WortiseInterstitial.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdFailedToShow();
        }
    }

    public void OnInterstitialImpression(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseInterstitial instance;

        if (WortiseInterstitial.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdImpression();
        }
    }

    public void OnInterstitialLoaded(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseInterstitial instance;

        if (WortiseInterstitial.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdLoaded();
        }
    }

    public void OnInterstitialRevenuePaid(string message)
    {
        Dictionary<string, object> data = WortiseJson.Deserialize(message) as Dictionary<string, object>;

        int id = Convert.ToInt32(data["id"]);

        WortiseInterstitial instance;

        if (WortiseInterstitial.instances.TryGetValue(id, out instance))
        {
            WortiseRevenueData revenue = WortiseRevenueData.FromDictionary(data);

            instance?.OnAdRevenuePaid(revenue);
        }
    }

    public void OnInterstitialShown(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseInterstitial instance;

        if (WortiseInterstitial.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdShown();
        }
    }


    // Rewarded events
    public void OnRewardedClicked(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseRewarded instance;

        if (WortiseRewarded.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdClicked();
        }
    }

    public void OnRewardedCompleted(string message)
    {
        Dictionary<string, object> data = WortiseJson.Deserialize(message) as Dictionary<string, object>;

        int id = Convert.ToInt32(data["id"]);

        WortiseRewarded instance;

        if (WortiseRewarded.instances.TryGetValue(id, out instance))
        {
            WortiseReward reward = WortiseReward.FromDictionary(data);

            instance?.OnAdCompleted(reward);
        }
    }

    public void OnRewardedDismissed(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseRewarded instance;

        if (WortiseRewarded.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdDismissed();
        }
    }

    public void OnRewardedFailedToLoad(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseRewarded instance;

        if (WortiseRewarded.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdFailedToLoad();
        }
    }

    public void OnRewardedFailedToShow(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseRewarded instance;

        if (WortiseRewarded.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdFailedToShow();
        }
    }

    public void OnRewardedImpression(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseRewarded instance;

        if (WortiseRewarded.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdImpression();
        }
    }

    public void OnRewardedLoaded(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseRewarded instance;

        if (WortiseRewarded.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdLoaded();
        }
    }

    public void OnRewardedRevenuePaid(string message)
    {
        Dictionary<string, object> data = WortiseJson.Deserialize(message) as Dictionary<string, object>;

        int id = Convert.ToInt32(data["id"]);

        WortiseRewarded instance;

        if (WortiseRewarded.instances.TryGetValue(id, out instance))
        {
            WortiseRevenueData revenue = WortiseRevenueData.FromDictionary(data);

            instance?.OnAdRevenuePaid(revenue);
        }
    }

    public void OnRewardedShown(string message)
    {
        int id = Convert.ToInt32(message);

        WortiseRewarded instance;

        if (WortiseRewarded.instances.TryGetValue(id, out instance))
        {
            instance?.OnAdShown();
        }
    }
}
#endif