﻿using UnityEngine;
using UnityEngine.Events;

namespace Yodo1.MAS
{
    public class InterstitialAtBreaks : MonoBehaviour
    {
        [Header("PlacementID (optional) ")]
        public string placementID;

        [Space(10)]
        [Header("Interstitial AD Events (optional) ")]
        [SerializeField] UnityEvent OnInterstitialAdLoaded;
        [SerializeField] UnityEvent OnInterstitialAdLoadFailed;
        [SerializeField] UnityEvent OnInterstitialAdOpened;
        [SerializeField] UnityEvent OnInterstitialAdOpenFailed;
        [SerializeField] UnityEvent OnInterstitialAdClosed;
        [SerializeField] UnityEvent OnInterstitialAdPayRevenue;

        private void OnEnable()
        {
            Yodo1U3dInterstitialAd.GetInstance().OnAdLoadedEvent += OnInterstitialAdLoadedEvent;
            Yodo1U3dInterstitialAd.GetInstance().OnAdLoadFailedEvent += OnInterstitialAdLoadFailedEvent;
            Yodo1U3dInterstitialAd.GetInstance().OnAdOpenedEvent += OnInterstitialAdOpenedEvent;
            Yodo1U3dInterstitialAd.GetInstance().OnAdOpenFailedEvent += OnInterstitialAdOpenFailedEvent;
            Yodo1U3dInterstitialAd.GetInstance().OnAdClosedEvent += OnInterstitialAdClosedEvent;
            Yodo1U3dInterstitialAd.GetInstance().OnAdPayRevenueEvent += OnInterstitialAdPayRevenueEvent;

            ShowAd();
        }

        private void OnDisable()
        {
            Yodo1U3dInterstitialAd.GetInstance().OnAdLoadedEvent -= OnInterstitialAdLoadedEvent;
            Yodo1U3dInterstitialAd.GetInstance().OnAdLoadFailedEvent -= OnInterstitialAdLoadFailedEvent;
            Yodo1U3dInterstitialAd.GetInstance().OnAdOpenedEvent -= OnInterstitialAdOpenedEvent;
            Yodo1U3dInterstitialAd.GetInstance().OnAdOpenFailedEvent -= OnInterstitialAdOpenFailedEvent;
            Yodo1U3dInterstitialAd.GetInstance().OnAdClosedEvent -= OnInterstitialAdClosedEvent;
            Yodo1U3dInterstitialAd.GetInstance().OnAdPayRevenueEvent -= OnInterstitialAdPayRevenueEvent;
        }

        private void LoadAd()
        {
            Yodo1U3dInterstitialAd.GetInstance().LoadAd();
        }

        private void ShowAd()
        {
            if (Yodo1U3dInterstitialAd.GetInstance().IsLoaded())
            {
                if (string.IsNullOrEmpty(placementID))
                {
                    Yodo1U3dInterstitialAd.GetInstance().ShowAd();
                }
                else
                {
                    Yodo1U3dInterstitialAd.GetInstance().ShowAd(placementID);
                }
            }
            else
            {

                LoadAd();
                Debug.Log(Yodo1U3dMas.TAG + "NoCode Interstitial ad has not been cached.");
                gameObject.SetActive(false);
            }
        }

        private void OnInterstitialAdLoadedEvent(Yodo1U3dInterstitialAd ad)
        {
            Debug.Log(Yodo1U3dMas.TAG + "NoCode Interstitial ad loaded");
            OnInterstitialAdLoaded.Invoke();

            if (gameObject.activeSelf == true)
            {
                ShowAd();
            }
        }

        private void OnInterstitialAdLoadFailedEvent(Yodo1U3dInterstitialAd ad, Yodo1U3dAdError adError)
        {
            Debug.Log(Yodo1U3dMas.TAG + "NoCode Interstitial ad load failed, error - " + adError.ToString());
            OnInterstitialAdLoadFailed.Invoke();
            //OnInterstitialAdError.Invoke();
        }

        private void OnInterstitialAdOpenedEvent(Yodo1U3dInterstitialAd ad)
        {
            Debug.Log(Yodo1U3dMas.TAG + "NoCode Interstitial ad opened");
            OnInterstitialAdOpened.Invoke();
        }

        private void OnInterstitialAdOpenFailedEvent(Yodo1U3dInterstitialAd ad, Yodo1U3dAdError adError)
        {
            Debug.Log(Yodo1U3dMas.TAG + "NoCode Interstitial ad open failed, error - " + adError.ToString());
            OnInterstitialAdOpenFailed.Invoke();
            //OnInterstitialAdError.Invoke();
        }

        private void OnInterstitialAdClosedEvent(Yodo1U3dInterstitialAd ad)
        {
            Debug.Log(Yodo1U3dMas.TAG + "NoCode Interstitial ad closed - AdBreaks");
            OnInterstitialAdClosed.Invoke();
            LoadAd();
            gameObject.SetActive(false);
        }

        private void OnInterstitialAdPayRevenueEvent(Yodo1U3dInterstitialAd ad, Yodo1U3dAdValue adValue)
        {
            Debug.Log(Yodo1U3dMas.TAG + "NoCode Interstitial ad pay revenue - AdBreaks");
            OnInterstitialAdPayRevenue.Invoke();
        }
    }
}
