﻿using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using Yodo1.MAS;

[RequireComponent((typeof(Button)))]
public class RewardedAd : MonoBehaviour
{
    Button rvBtn;
    [Header("PlacementID (optional) ")]
    [Tooltip("Enter your Rewarded Ad placement ID. Leave empty if you do not have one.")]
    public string placementID;
    [Space(10)]
    [Header("Rewarded AD Events")]
    [SerializeField] UnityEvent OnRewardedAdLoaded;
    [SerializeField] UnityEvent OnRewardedAdLoadFailed;
    [SerializeField] UnityEvent OnRewardedAdOpened;
    [SerializeField] UnityEvent OnRewardedAdOpenFailed;
    [SerializeField] UnityEvent OnRewardedAdClosed;
    [Header("Award User Here")]
    [SerializeField] UnityEvent OnAdReceivedReward;

    [SerializeField] UnityEvent OnRewardedAdPayRevenue;

    private void Awake()
    {
        rvBtn = GetComponent<Button>();
    }

    private void Start()
    {
        rvBtn.onClick.AddListener(TaskOnClick);

        LoadAd();
    }

    void TaskOnClick()
    {
        if (Yodo1U3dRewardAd.GetInstance().IsLoaded())
        {
            Yodo1U3dRewardAd.GetInstance().OnAdOpenedEvent += OnRewardAdOpenedEvent;
            Yodo1U3dRewardAd.GetInstance().OnAdOpenFailedEvent += OnRewardAdOpenFailedEvent;
            Yodo1U3dRewardAd.GetInstance().OnAdClosedEvent += OnRewardAdClosedEvent;
            Yodo1U3dRewardAd.GetInstance().OnAdEarnedEvent += OnRewardAdEarnedEvent;
            Yodo1U3dRewardAd.GetInstance().OnAdPayRevenueEvent += OnRewardAdPayRevenueEvent;

            if (string.IsNullOrEmpty(placementID))
            {
                Yodo1U3dRewardAd.GetInstance().ShowAd();
            }
            else
            {
                Yodo1U3dRewardAd.GetInstance().ShowAd(placementID);
            }
        }
        else
        {
            Debug.Log(Yodo1U3dMas.TAG + "NoCode Reward video ad has not been cached.");
        }
    }

    private void LoadAd()
    {
        Yodo1U3dRewardAd.GetInstance().OnAdLoadedEvent -= OnRewardAdLoadedEvent;
        Yodo1U3dRewardAd.GetInstance().OnAdLoadFailedEvent -= OnRewardAdLoadFailedEvent;

        Yodo1U3dRewardAd.GetInstance().OnAdLoadedEvent += OnRewardAdLoadedEvent;
        Yodo1U3dRewardAd.GetInstance().OnAdLoadFailedEvent += OnRewardAdLoadFailedEvent;

        Yodo1U3dRewardAd.GetInstance().LoadAd();
    }

    private void OnRewardAdLoadedEvent(Yodo1U3dRewardAd ad)
    {
        Debug.Log(Yodo1U3dMas.TAG + "NoCode Rewarded ad loaded");
        OnRewardedAdLoaded.Invoke();
    }

    private void OnRewardAdLoadFailedEvent(Yodo1U3dRewardAd ad, Yodo1U3dAdError adError)
    {
        Debug.Log(Yodo1U3dMas.TAG + "NoCode Rewarded ad load failed");
        OnRewardedAdLoadFailed.Invoke();
        //OnRewardedAdError.Invoke();

        LoadAd();
    }

    private void OnRewardAdOpenedEvent(Yodo1U3dRewardAd ad)
    {
        Debug.Log(Yodo1U3dMas.TAG + "NoCode Rewarded ad opened");
        OnRewardedAdOpened.Invoke();
    }

    private void OnRewardAdOpenFailedEvent(Yodo1U3dRewardAd ad, Yodo1U3dAdError adError)
    {
        Debug.Log(Yodo1U3dMas.TAG + "NoCode Rewarded ad open failed");
        OnRewardedAdOpenFailed.Invoke();
        //OnRewardedAdError.Invoke();

        LoadAd();
    }

    private void OnRewardAdClosedEvent(Yodo1U3dRewardAd ad)
    {
        Debug.Log(Yodo1U3dMas.TAG + "NoCode Rewarded ad closed");
        OnRewardedAdClosed.Invoke();

        Yodo1U3dRewardAd.GetInstance().OnAdOpenedEvent -= OnRewardAdOpenedEvent;
        Yodo1U3dRewardAd.GetInstance().OnAdOpenFailedEvent -= OnRewardAdOpenFailedEvent;
        Yodo1U3dRewardAd.GetInstance().OnAdClosedEvent -= OnRewardAdClosedEvent;
        Yodo1U3dRewardAd.GetInstance().OnAdEarnedEvent -= OnRewardAdEarnedEvent;
        Yodo1U3dRewardAd.GetInstance().OnAdPayRevenueEvent -= OnRewardAdPayRevenueEvent;

        LoadAd();
    }

    private void OnRewardAdEarnedEvent(Yodo1U3dRewardAd ad)
    {
        Debug.Log(Yodo1U3dMas.TAG + "NoCode Rewarded ad received reward");
        OnAdReceivedReward.Invoke();
    }

    private void OnRewardAdPayRevenueEvent(Yodo1U3dRewardAd ad, Yodo1U3dAdValue adValue)
    {
        Debug.Log(Yodo1U3dMas.TAG + "NoCode Rewarded ad pay revenue");
        OnRewardedAdPayRevenue.Invoke();
    }
}
