package com.reactnativeunityads;

import android.util.Log;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.module.annotations.ReactModule;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.unity3d.ads.IUnityAdsInitializationListener;
import com.unity3d.ads.IUnityAdsLoadListener;
import com.unity3d.ads.IUnityAdsShowListener;
import com.unity3d.ads.UnityAds;
import com.unity3d.ads.UnityAdsShowOptions;

@ReactModule(name = UnityadsModule.NAME)
public class UnityadsModule extends ReactContextBaseJavaModule {
    public static final String NAME = "Unityads";

    ReactApplicationContext reactContext;

    public UnityadsModule(ReactApplicationContext reactContext) {
      super(reactContext);
      this.reactContext = reactContext;
    }

    @Override
    @NonNull
    public String getName() {
        return NAME;
    }

    private void sendEvent(String eventName, String value) {

      WritableMap params = Arguments.createMap();
      params.putString("value", value);

      getReactApplicationContext()
        .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
        .emit(eventName, params);
    }

    private IUnityAdsInitializationListener initializationListener = new IUnityAdsInitializationListener(){
      @Override
      public void onInitializationComplete() {
        sendEvent("onInitializationComplete", "");
        Log.v("log", "onInitializationComplete");
      }

      @Override
      public void onInitializationFailed(UnityAds.UnityAdsInitializationError unityAdsInitializationError, String s) {
        sendEvent("onInitializationFailed", s);
        Log.v("log", s);
      }
    };

    private IUnityAdsShowListener showListener = new IUnityAdsShowListener() {
    @Override
    public void onUnityAdsShowFailure(String placementId, UnityAds.UnityAdsShowError error, String message) {
      sendEvent("onUnityAdsShowFailure", message);
      Log.e("log", "Unity Ads failed to show ad for " + placementId + " with error: [" + error + "] " + message);
    }

    @Override
    public void onUnityAdsShowStart(String placementId) {
      sendEvent("onUnityAdsShowStart", "onUnityAdsShowStart: " + placementId);
      Log.v("log", "onUnityAdsShowStart: " + placementId);
    }

    @Override
    public void onUnityAdsShowClick(String placementId) {
      sendEvent("onUnityAdsShowClick", "onUnityAdsShowClick: " + placementId);
      Log.v("log", "onUnityAdsShowClick: " + placementId);
    }

    @Override
    public void onUnityAdsShowComplete(String placementId, UnityAds.UnityAdsShowCompletionState state) {
      sendEvent("onUnityAdsShowComplete", String.valueOf(state));
      Log.v("log", "onUnityAdsShowComplete: " + placementId);
    }
  };

    private IUnityAdsLoadListener loadListener = new IUnityAdsLoadListener() {
    @Override
    public void onUnityAdsAdLoaded(String placementId) {
      sendEvent("onUnityAdsAdLoaded", "onUnityAdsAdLoaded: " + placementId);
      Log.v("log", "onUnityAdsAdLoaded: " + placementId);
    }

    @Override
    public void onUnityAdsFailedToLoad(String placementId, UnityAds.UnityAdsLoadError error, String message) {
      sendEvent("onUnityAdsFailedToLoad", message);
      Log.e("log", "Unity Ads failed to load ad for " + placementId + " with error: [" + error + "] " + message);
    }
  };

    @ReactMethod
    public void initialize(String unityGameID, Boolean testMode) {
      UnityAds.initialize(reactContext.getApplicationContext(),unityGameID, testMode, initializationListener);
    }

    @ReactMethod
    public void load(String placementId) {
      UnityAds.load(placementId, loadListener);
    }

    @ReactMethod
    public void show(String placementId) {
      UnityAds.show((getCurrentActivity()), placementId, new UnityAdsShowOptions(), showListener);
    }
}
