using System.Runtime.InteropServices;
using UnityEngine;

public enum BannerAdPlacement
{
    TopLeft,
    TopCenter,
    TopRight,
    BottomLeft,
    BottomCenter,
    BottomRight
}

public class AdsterBannerAd : MonoBehaviour
{
    public static AdsterBannerAd Instance { get; private set; }

    public event System.Action<string> OnBannerAdLoadedEvent;
    public event System.Action<string> OnBannerAdLoadFailedEvent;
    public event System.Action<string> OnBannerAdShownEvent;
    public event System.Action<string> OnBannerAdHiddenEvent;
    public event System.Action<string> OnBannerAdClickedEvent;
    public event System.Action<string> OnBannerAdImpressionEvent;
    public event System.Action<string> OnBannerAdDestroyedEvent;

#if UNITY_IOS && !UNITY_EDITOR
    [DllImport("__Internal")] private static extern void load_banner_ad(string placementKey);
    [DllImport("__Internal")] private static extern void show_banner_ad(int placement);
    [DllImport("__Internal")] private static extern void hide_banner_ad();
    [DllImport("__Internal")] private static extern void destroy_banner_ad();
#endif

    [SerializeField] private BannerAdPlacement defaultPlacement = BannerAdPlacement.BottomCenter;
    private bool isLoaded = false;
    private bool isVisible = false;

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

    public void LoadBannerAd(string placementKey)
    {
        Debug.Log($"LoadBannerAd function with placement: {placementKey}");
#if UNITY_IOS && !UNITY_EDITOR
        load_banner_ad(placementKey);
#else
        Debug.Log($"load_banner_ad({placementKey}) (simulated in editor)");
        Invoke(nameof(SimulateBannerLoaded), 1f);
#endif
    }

    public void ShowBannerAd(BannerAdPlacement placement = BannerAdPlacement.BottomCenter)
    {
        if (!isLoaded) { Debug.LogWarning("Banner ad not loaded yet."); return; }
        Debug.Log($"ShowBannerAd function with placement: {placement}");
#if UNITY_IOS && !UNITY_EDITOR
        show_banner_ad((int)placement);
#else
        Debug.Log($"show_banner_ad({placement}) (simulated in editor)");
#endif
        isVisible = true;
    }

    public void HideBannerAd()
    {
        Debug.Log("HideBannerAd function...");
#if UNITY_IOS && !UNITY_EDITOR
        hide_banner_ad();
#else
        Debug.Log("hide_banner_ad (simulated in editor)");
#endif
        isVisible = false;
    }

    public void DestroyBannerAd()
    {
        Debug.Log("DestroyBannerAd function...");
#if UNITY_IOS && !UNITY_EDITOR
        destroy_banner_ad();
#else
        Debug.Log("destroy_banner_ad (simulated in editor)");
#endif
        isLoaded = false; isVisible = false;
    }

    public void HandleBannerAdLoaded(string result) { Debug.Log($"Banner ad loaded: {result}"); isLoaded = true; OnBannerAdLoadedEvent?.Invoke(result); }
    public void HandleBannerAdLoadFailed(string error) { Debug.LogError($"Banner ad load failed: {error}"); isLoaded = false; OnBannerAdLoadFailedEvent?.Invoke(error); }
    public void HandleBannerAdShowFailed(string error) { Debug.LogError($"Banner ad show failed: {error}"); isVisible = false; }
    public void HandleBannerAdShown(string result) { Debug.Log($"Banner ad shown: {result}"); isVisible = true; OnBannerAdShownEvent?.Invoke(result); }
    public void HandleBannerAdHidden(string result) { Debug.Log($"Banner ad hidden: {result}"); isVisible = false; OnBannerAdHiddenEvent?.Invoke(result); }
    public void HandleBannerAdClicked(string result) { Debug.Log($"Banner ad clicked: {result}"); OnBannerAdClickedEvent?.Invoke(result); }
    public void HandleBannerAdImpression(string result) { Debug.Log($"Banner ad impression: {result}"); OnBannerAdImpressionEvent?.Invoke(result); }
    public void HandleBannerAdDestroyed(string result) { Debug.Log($"Banner ad destroyed: {result}"); isLoaded = false; isVisible = false; OnBannerAdDestroyedEvent?.Invoke(result); }

    public bool IsLoaded => isLoaded;
    public bool IsVisible => isVisible;
    private void SimulateBannerLoaded() => HandleBannerAdLoaded("Success");
}

