using Adplay.DataContainer;
using Adplay.Model;
using Adplay.Utility;
using Adplay.View;
using System;
using System.Threading.Tasks;
using UnityEngine;

namespace Adplay.Behaviours.Actions
{
    public class AdPlayPopUpButton : MonoBehaviour
    {
        [SerializeField] private ActiveAds activeAds;
        [SerializeField] private EngagementData engagementData;


        public async Task<AdRequestInfo> GetAd(AdPlayTemplate template, Action onClick)
        {
            if (template.ClickButton == null)
            {
                Debug.LogError($"Adplay popup button request failed: ClickButton is null");
                return new AdRequestInfo(AdRequestResultState.MissingRequiredComponent, "Adplay popup button request failed: ClickButton is null");
            }
            if (template.Image == null)
            {
                Debug.LogError($"Adplay popup button request failed: Image is null");
                return new AdRequestInfo(AdRequestResultState.MissingRequiredComponent, "Adplay popup button request failed: Image is null");
            }

            var popUpResult = activeAds.GetActiveAd(AdType.Popup);
            var popUpButtonResult = activeAds.GetActiveAd(AdType.PopupButton);
            int counter = 0;
            while (counter < 10)
            {
                counter++;
                if (popUpResult != null && popUpButtonResult != null)
                    break;
                await Task.Delay(AdPlayUtility.DelayMilliTime);
                popUpResult = activeAds.GetActiveAd(AdType.Popup);
                popUpButtonResult = activeAds.GetActiveAd(AdType.PopupButton);
            }
            if (popUpButtonResult == null && popUpResult == null)
                return new AdRequestInfo(AdRequestResultState.NoActiveAd);

            template.SetSprite(popUpButtonResult.Sprite);
            template.AddClick(() =>
            {
                onClick?.Invoke();
            });
            engagementData.CreateEngagement(IdGenerator.NewId(), EngagementType.IMP, popUpButtonResult.Creative);


            string extraOptionKey = AdExtraOptionType.PopUpButtonText.ToString();
            string buttonText = popUpButtonResult.Creative.Config.ContainsKey(extraOptionKey) ?
                    popUpButtonResult.Creative.Config[extraOptionKey].ToString() : "";
            if (template.ClickButtonText != null)
                template.ClickButtonText.text = buttonText;

            template.Show();
            return new AdRequestInfo(AdRequestResultState.Success);
        }

    }


}
