using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
using System;

public class MaioInitializer : MonoBehaviour
{
    /// maio から発行されるメディアIDに差し替えてください。
#if UNITY_IOS
    public const string MEDIA_ID = "DemoPublisherMedia";
    public const string ZONE_ID = "DemoPublisherZone";
#elif UNITY_ANDROID
    public const string MEDIA_ID = "DemoPublisherMediaForAndroid";
    public const string ZONE_ID = "DemoPublisherZoneForAndroid";
#else
    public const string MEDIA_ID = "DemoPublisherMedia";
    public const string ZONE_ID = "DemoPublisherZone";
#endif

    private readonly Queue<Action> _mainQueue = new Queue<Action>();

    [SerializeField] private Button showAdButton;
    [SerializeField] private Text showAdButtonText;

    void Start()
    {
        Debug.Log("Hello world!");
        Debug.Log(Maio.PluginVersion);

        // maio 用のイベントハンドラを設定します。
        Maio.OnInitialized += HandleOnInitialized;
        Maio.OnChangedCanShow += HandleOnChangedCanShow;
        Maio.OnStartAd += HandleOnStartAd;
        Maio.OnFinishedAd += HandleOnFinishedAd;
        Maio.OnClickedAd += HandleOnClickedAd;
        Maio.OnClosedAd += HandleOnClosedAd;
        Maio.OnFailed += HandleOnFailed;

        // 広告の配信テスト設定を行います。アプリをリリースする際にはコメントアウトして下さい。
        Maio.SetAdTestMode(true);

        // SDK のセットアップを開始します。
        Maio.Start(MEDIA_ID);

        showAdButtonText.text = "Loading Ad";
    }

    void Update()
    {
        while (_mainQueue.Count > 0)
        {
            Action action;
            lock (_mainQueue)
            {
                action = _mainQueue.Dequeue();
            }
            action();
        }
    }

    void OnDestroy()
    {
        // シーンが遷移する際にイベントハンドラを解除します。
        Maio.OnInitialized -= HandleOnInitialized;
        Maio.OnChangedCanShow -= HandleOnChangedCanShow;
        Maio.OnStartAd -= HandleOnStartAd;
        Maio.OnFinishedAd -= HandleOnFinishedAd;
        Maio.OnClickedAd -= HandleOnClickedAd;
        Maio.OnClosedAd -= HandleOnClosedAd;
        Maio.OnFailed -= HandleOnFailed;
    }

    /// <summary>
    /// 広告を流したい時に呼びます
    /// </summary>
    public void ShowAd()
    {
        if (Maio.CanShow(ZONE_ID))
        {
            Maio.Show(ZONE_ID);
        }
    }

    /// <summary>
    /// 初期化が完了した際に呼ばれます。
    /// </summary>
    public void HandleOnInitialized()
    {
        Debug.Log("Maio.OnInitialized()");
    }

    /// <summary>
    /// 表示が可否が変更された際に呼ばれます。
    /// </summary>
    /// <param name="zoneId"></param>
    /// <param name="newValue"></param>
    public void HandleOnChangedCanShow(string zoneId, bool newValue)
    {
        Debug.LogFormat("Maio.OnChangedCanShow('{0}', {1})", zoneId, newValue);
        lock (_mainQueue)
        {
            _mainQueue.Enqueue(() => {
                showAdButtonText.text = "Play Ad";
                showAdButton.interactable = newValue;
            });
        }
    }

    /// <summary>
    /// 広告の再生が開始された際に呼ばれます。
    /// </summary>
    /// <param name="zoneId"></param>
    public void HandleOnStartAd(string zoneId)
    {
        Debug.LogFormat("Maio.OnStartAd('{0}')", zoneId);
    }

    /// <summary>
    /// 広告の視聴が終了した際に呼ばれます。
    /// </summary>
    /// <param name="zoneId"></param>
    /// <param name="playtime"></param>
    /// <param name="skipped"></param>
    /// <param name="rewardParam"></param>
    public void HandleOnFinishedAd(string zoneId, int playtime, bool skipped, string rewardParam)
    {
        Debug.LogFormat("Maio.OnFinishedAd('{0}', {1}, {2}, '{3}')", zoneId, playtime, skipped, rewardParam);
        if (!skipped)
        {
            // ここで、ユーザーへのリワード処理を行う事ができます。
        }
    }

    /// <summary>
    /// 広告がクリックされた際に呼ばれます。
    /// </summary>
    /// <param name="zoneId"></param>
    public void HandleOnClickedAd(string zoneId)
    {
        Debug.LogFormat("Maio.OnClickedAd('{0}')", zoneId);
    }

    /// <summary>
    /// 広告が閉じられたときに呼ばれます
    /// </summary>
    /// <param name="zoneId"></param>
    public void HandleOnClosedAd(string zoneId)
    {
        Debug.LogFormat("Maio.OnClosedAd('{0}')", zoneId);
    }

    /// <summary>
    /// 広告の取得・表示などに失敗した際に呼ばれます。
    /// </summary>
    /// <param name="zoneId"></param>
    /// <param name="reason"></param>
    public void HandleOnFailed(string zoneId, Maio.FailReason reason)
    {
        Debug.LogFormat("Maio.OnFailed({0}, {1})", zoneId == null ? "null" : "'" + zoneId + "'", reason);
    }

}