using UnityEngine;

public class AdsterManager : AdsterBase
{
    private AdsterInterstitialAd interstitialAd;
    private AdsterRewardedAd rewardedAd;
    private AdsterRewardedInterstitialAd rewardedInterstitialAd;
    private AdsterBannerAd bannerAd;

    public new static AdsterManager Instance { get; private set; }
    public event System.Action<string> OnInitialized;
    public event System.Action<string> OnInitializeFailed;
    
    private bool isInitialized = false;

    protected override void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else { Destroy(gameObject); return; }

        if (gameObject.name != "AdsterManager")
        {
            Debug.LogWarning($"[AdsterManager] GameObject renamed from '{gameObject.name}' to 'AdsterManager' to receive native callbacks.");
            gameObject.name = "AdsterManager";
        }

        if (interstitialAd == null)
        {
            var go = new GameObject("AdsterInterstitialAd"); go.transform.SetParent(transform);
            interstitialAd = go.AddComponent<AdsterInterstitialAd>();
        }
        if (rewardedAd == null)
        {
            var go = new GameObject("AdsterRewardedAd"); go.transform.SetParent(transform);
            rewardedAd = go.AddComponent<AdsterRewardedAd>();
        }
        if (rewardedInterstitialAd == null)
        {
            var go = new GameObject("AdsterRewardedInterstitialAd"); go.transform.SetParent(transform);
            rewardedInterstitialAd = go.AddComponent<AdsterRewardedInterstitialAd>();
        }
        if (bannerAd == null)
        {
            var go = new GameObject("AdsterBannerAd"); go.transform.SetParent(transform);
            bannerAd = go.AddComponent<AdsterBannerAd>();
        }
    }

    public void HandleInitialized(string status)
    {
        Debug.Log($"[AdsterManager] Initialize callback: {status}");
        isInitialized = true;
        OnInitialized?.Invoke(status);
    }
    
    public void HandleInitializeFailed(string error)
    {
        Debug.LogError($"[AdsterManager] Initialize failed: {error}");
        OnInitializeFailed?.Invoke(error);
    }

    public void LoadInterstitialAd(string placementKey) => interstitialAd?.LoadInterstitialAd(placementKey);
    public void ShowInterstitialAd() => interstitialAd?.ShowInterstitialAd();
    public void LoadRewardedAd(string placementKey) => rewardedAd?.LoadRewardedAd(placementKey);
    public void ShowRewardedAd() => rewardedAd?.ShowRewardedAd();
    public void LoadRewardedInterstitialAd(string placementKey) => rewardedInterstitialAd?.LoadRewardedInterstitialAd(placementKey);
    public void ShowRewardedInterstitialAd() => rewardedInterstitialAd?.ShowRewardedInterstitialAd();
    public void LoadBannerAd(string placementKey) => bannerAd?.LoadBannerAd(placementKey);
    public void ShowBannerAd(BannerAdPlacement placement = BannerAdPlacement.BottomCenter) => bannerAd?.ShowBannerAd(placement);
    public void HideBannerAd() => bannerAd?.HideBannerAd();
    public void DestroyBannerAd() => bannerAd?.DestroyBannerAd();

    public AdsterInterstitialAd GetInterstitialAd() => interstitialAd;
    public AdsterRewardedAd GetRewardedAd() => rewardedAd;
    public AdsterRewardedInterstitialAd GetRewardedInterstitialAd() => rewardedInterstitialAd;
    public AdsterBannerAd GetBannerAd() => bannerAd;
    public bool IsInitialized => isInitialized;
}
