using System;
using System.Collections.Generic;
using AnyThinkAds.Api;
using Runtime.ADAggregator;
using UnityEngine;

public class AwardVideoPlayer : ADPlayer , ATRewardedVideoListener
{
    private ATRewardedVideo      _atRewardedVideo;
    private Action<bool>         _onVideoComplete;
    private ADListenerAggregator _aggregator;

    public override void OnInit()
    {
        this._atRewardedVideo = ATRewardedVideo.Instance;
        // this._atRewardedVideo.client.setListener(this); //由于新版本广告sdk弃用该方式，通过以下方式重新桥接监听事件
        this._aggregator = new ADListenerAggregator();
        this._aggregator.BindAwardVideoListener(this._atRewardedVideo.client , this);
        // var adClient = this._atRewardedVideo.client;
        // adClient.on
    }

    
    public override void ShowAD(Action onClose, Action<bool> onVideoComplete)
    {
        if (this.IsReadly())
        {
            this.curState = 0;
            this._onVideoComplete = onVideoComplete;
            this.adListener.onClose = onClose;
            this.adListener.onVideoComplete = this.OnVideoComplete;
            var json = new Dictionary<string, string> { { AnyThinkAds.Api.ATConst.SCENARIO, this.AdScene } };
            this._atRewardedVideo.showAd(this.Key , json);
        }
    }
    
    private void OnVideoComplete(bool obj)
    {
        this._onVideoComplete?.Invoke(obj);
        this._onVideoComplete = null;
    }

    public override bool IsReadly()
    {
        return this.curState == 2;
    }

    public override void LoadAD()
    {
        if (curState == 0)
        {
            {
                Dictionary<string,string> jsonmap = new Dictionary<string,string>();
                //ATConst.USERID_KEY必传，用于标识每个用户;ATConst.USER_EXTRA_DATA为可选参数，传入后将透传到开发者的服务器
                jsonmap.Add(ATConst.USERID_KEY,      ADManager.Instance.UserId);
                jsonmap.Add(ATConst.USER_EXTRA_DATA, "user_extra_data");
                curState = 1;
                this._atRewardedVideo.loadVideoAd(this.Key, jsonmap);
            }
        }
    }

    #region SDK

    public void onRewardedVideoAdLoaded(string placementId)
    {
        this.curState = 2;
    }

    public void onRewardedVideoAdLoadFail(string placementId, string code, string message)
    {
        Debug.LogError($"激励视频加载失败: {message} , code:{code} , placementId: {placementId}");
        this.curState = 0;
    }

    public void onRewardedVideoAdPlayStart(string placementId, ATCallbackInfo callbackInfo)
    {
    }

    public void onRewardedVideoAdPlayEnd(string placementId, ATCallbackInfo callbackInfo)
    {
    }

    public void onRewardedVideoAdPlayFail(string placementId, string code, string message)
    {
        Debug.LogError($"激励视频播放失败: {message} , code:{code} , placementId: {placementId}");
        curState = 0;
        this.adListener.OnShowError();
    }

    public void onRewardedVideoAdPlayClosed(string placementId, bool isReward, ATCallbackInfo callbackInfo)
    {
        this.adListener.OnRewardVerify(isReward , 1 , "");
        this.adListener.OnAdClose();
    }

    public void onRewardedVideoAdPlayClicked(string placementId, ATCallbackInfo callbackInfo)
    {
    }

    public void onReward(string placementId, ATCallbackInfo callbackInfo)
    {
        this.adListener.OnRewardVerify(true , 1 , "");
        this.adListener.OnAdClose();
    }

    public void startLoadingADSource(string placementId, ATCallbackInfo callbackInfo)
    {
    }

    public void finishLoadingADSource(string placementId, ATCallbackInfo callbackInfo)
    {
    }

    public void failToLoadADSource(string placementId, ATCallbackInfo callbackInfo, string code, string message)
    {
        this.OnError(code , message);
    }

    public void startBiddingADSource(string placementId, ATCallbackInfo callbackInfo)
    {
    }

    public void finishBiddingADSource(string placementId, ATCallbackInfo callbackInfo)
    {
    }

    public void failBiddingADSource(string placementId, ATCallbackInfo callbackInfo, string code, string message)
    {
    }

    #endregion
    
}