using System;
using Unity.Services.LevelPlay;

public class LevelPlaySdkProvider : ISdkProvider
{
    public event EventHandler OnInitialized;

    private IBannerAdProvider _bannerAdProvider;
    private IRewardedAdProvider _rewardedAdProvider;
    private IInterstitialAdProvider _interstitialAdProvider;

    private string LevelPlayAppId = AdConfig.LevelPlayAppId;

    public void Initialize()
    {
        AdHelper.Log("[LevelPlaySdkProvider] [Method] Initialize()");

        LevelPlay.OnInitSuccess += OnInitializationCompleted;
        LevelPlay.OnInitFailed += OnInitializationFailed;

        LevelPlay.Init(LevelPlayAppId);
    }

    public IBannerAdProvider GetBannerAdProvider()
    {
        AdHelper.Log("[LevelPlaySdkProvider] [Method] GetBannerAdProvider()");

        return _bannerAdProvider ??= new LevelPlayBannerAdProvider(AdConfig.LevelPlayBannerAdUnitId);
    }

    public IRewardedAdProvider GetRewardedAdProvider()
    {
        AdHelper.Log("[LevelPlaySdkProvider] [Method] GetRewardedAdProvider()");

        return _rewardedAdProvider ??= new LevelPlayRewardedAdProvider(AdConfig.LevelPlayRewardedAdUnitId);
    }

    public IInterstitialAdProvider GetInterstitialAdProvider()
    {
        AdHelper.Log("[LevelPlaySdkProvider] [Method] GetInterstitialAdProvider()");

        return _interstitialAdProvider ??= new LevelPlayInterstitialAdProvider(AdConfig.LevelPlayInterstitialAdUnitId);
    }

    private void OnInitializationCompleted(LevelPlayConfiguration configuration)
    {
        AdHelper.Log("[LevelPlaySdkProvider] [Method] OnInitializationCompleted()");

        UnityMainThreadDispatcher.Post(_ => OnInitialized?.Invoke(this, EventArgs.Empty));
    }

    private void OnInitializationFailed(LevelPlayInitError error)
    {
        AdHelper.Log($"[LevelPlaySdkProvider] [Method] OnInitializationFailed(error: {error})");

        UnityMainThreadDispatcher.Post(_ => OnInitialized?.Invoke(this, EventArgs.Empty));
    }
}
