using System.Runtime.InteropServices;
using UnityEngine;

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

    public event System.Action<string> OnLoaded;
    public event System.Action<string> OnLoadFailed;
    public event System.Action<string> OnShowFailed;
    public event System.Action<string> OnWillShow;
    public event System.Action<string> OnClosed;
    public event System.Action<string> OnClicked;
    public event System.Action<string> OnImpression;
    public event System.Action<string> OnVideoStarted;
    public event System.Action<string> OnVideoEnded;
    public event System.Action<string> OnUserEarnedReward;

#if UNITY_IOS && !UNITY_EDITOR
    [DllImport("__Internal")] private static extern void load_rewarded_ad(string placementKey);
    [DllImport("__Internal")] private static extern void show_rewarded_ad();
#endif

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

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

    public void ShowRewardedAd()
    {
        Debug.Log("ShowRewardedAd function...");
#if UNITY_IOS && !UNITY_EDITOR
        show_rewarded_ad();
#else
        Debug.Log("show_rewarded_ad (simulated in editor)");
        Invoke(nameof(SimulateUserRewarded), 3f);
#endif
    }

    public void HandleRewardedAdLoaded(string result) { Debug.Log($"Rewarded ad loaded: {result}"); OnLoaded?.Invoke(result); }
    public void HandleRewardedAdLoadFailed(string error) { Debug.LogError($"Rewarded ad load failed: {error}"); OnLoadFailed?.Invoke(error); }
    public void HandleRewardedAdShowFailed(string error) { Debug.LogError($"Rewarded ad show failed: {error}"); OnShowFailed?.Invoke(error); }
    public void HandleRewardedAdWillShow(string result) { Debug.Log($"Rewarded ad will show: {result}"); OnWillShow?.Invoke(result); }
    public void HandleRewardedAdClosed(string result) { Debug.Log($"Rewarded ad closed: {result}"); OnClosed?.Invoke(result); }
    public void HandleRewardedAdClicked(string result) { Debug.Log($"Rewarded ad clicked: {result}"); OnClicked?.Invoke(result); }
    public void HandleRewardedAdImpression(string result) { Debug.Log($"Rewarded ad impression: {result}"); OnImpression?.Invoke(result); }
    public void HandleRewardedAdVideoStarted(string result) { Debug.Log($"Rewarded ad video started: {result}"); OnVideoStarted?.Invoke(result); }
    public void HandleRewardedAdVideoEnded(string result) { Debug.Log($"Rewarded ad video ended: {result}"); OnVideoEnded?.Invoke(result); }
    public void HandleUserEarnedReward(string rewardData) { Debug.Log($"User earned reward: {rewardData}"); OnUserEarnedReward?.Invoke(rewardData); }

    private void SimulateRewardedLoaded() => HandleRewardedAdLoaded("Success");
    private void SimulateUserRewarded() { HandleUserEarnedReward("100:coins"); HandleRewardedAdClosed("Success"); }
}

