
package com.reactlibrary;

import android.os.Handler;
import android.os.Looper;

import com.adcolony.sdk.AdColony;
import com.adcolony.sdk.AdColonyAppOptions;
import com.adcolony.sdk.AdColonyInterstitial;
import com.adcolony.sdk.AdColonyInterstitialListener;
import com.adcolony.sdk.AdColonyReward;
import com.adcolony.sdk.AdColonyRewardListener;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.InterstitialAd;
import com.ironsource.mediationsdk.IronSource;
import com.ironsource.mediationsdk.logger.IronSourceError;
import com.ironsource.mediationsdk.model.Placement;
import com.ironsource.mediationsdk.sdk.RewardedVideoListener;

public class RNCoinspinnerLibModule extends ReactContextBaseJavaModule {

  private static final String TAG = "RNCoinspinnerLib";

  private final ReactApplicationContext mReactContext;
  private InterstitialAd mInterstitialAd = null;
  private AdColonyInterstitial mAdColonyAd = null;
  private String mAdColonyZoneId = null;

  private Callback mInterstitialCallback = null;
  private Callback mRewardCallback = null;

  public RNCoinspinnerLibModule(ReactApplicationContext reactContext) {
    super(reactContext);
    mReactContext = reactContext;
  }

  @ReactMethod
  public void init(
          final String userId,
          final String ironSourceAppKey,
          final String adMobInterstitialUnitId,
          final String adColonyAppId,
          final String adColonyZoneId) {
    new Handler(Looper.getMainLooper()).post(new Runnable() {
      @Override
      public void run() {
        IronSource.setRewardedVideoListener(new RewardedVideoListener() {
          @Override public void onRewardedVideoAdOpened() {}
          @Override public void onRewardedVideoAdClosed() {}
          @Override public void onRewardedVideoAvailabilityChanged(boolean b) {}
          @Override public void onRewardedVideoAdStarted() {}
          @Override public void onRewardedVideoAdEnded() {}

          @Override
          public void onRewardedVideoAdRewarded(Placement placement) {
            if (mRewardCallback != null) {
              mRewardCallback.invoke(null, placement.getRewardAmount(), placement.getRewardName());
              mRewardCallback = null;
            }
          }

          @Override
          public void onRewardedVideoAdShowFailed(IronSourceError ironSourceError) {
            if (mRewardCallback != null) {
              mRewardCallback.invoke("Ad Show Failed");
              mRewardCallback = null;
            }
          }
        });

        IronSource.setUserId(userId);
        IronSource.init(getCurrentActivity(), ironSourceAppKey);

        mAdColonyZoneId = adColonyZoneId;
        AdColonyAppOptions appOptions = new AdColonyAppOptions().setUserID(userId);
        AdColony.configure(getCurrentActivity(), appOptions, adColonyAppId, adColonyZoneId);

        AdColony.setRewardListener(new AdColonyRewardListener() {
          @Override
          public void onReward(AdColonyReward adColonyReward) {
            if (mRewardCallback != null) {
              mRewardCallback.invoke(null, adColonyReward.getRewardAmount(), adColonyReward.getRewardName());
              mRewardCallback = null;
            }
          }
        });
        loadAdColonyAd();

        mInterstitialAd = new InterstitialAd(mReactContext);
        mInterstitialAd.setAdUnitId(adMobInterstitialUnitId);
        mInterstitialAd.setAdListener(new AdListener() {
          @Override
          public void onAdClosed() {
            if (mInterstitialCallback != null) {
              mInterstitialCallback.invoke();
              mInterstitialCallback = null;
            }
            mInterstitialAd.loadAd(new AdRequest.Builder().build());
          }
        });

        mInterstitialAd.loadAd(new AdRequest.Builder().build());
      }
    });
  }

  private void loadAdColonyAd() {
    if (mAdColonyZoneId == null) return;
    AdColony.requestInterstitial(mAdColonyZoneId, new AdColonyInterstitialListener() {
      @Override
      public void onRequestFilled(AdColonyInterstitial adColonyInterstitial) {
        mAdColonyAd = adColonyInterstitial;
      }

      @Override
      public void onOpened(AdColonyInterstitial ad) {
        mAdColonyAd = null;
        AdColony.requestInterstitial(mAdColonyZoneId, this);
      }

      @Override
      public void onExpiring(AdColonyInterstitial ad) {
        mAdColonyAd = null;
        AdColony.requestInterstitial(mAdColonyZoneId, this);
      }
    });
  }

  @ReactMethod
  public void showInterstitialAd(final Callback callback) {
    new Handler(Looper.getMainLooper()).post(new Runnable() {
      @Override
      public void run() {
        if (mInterstitialAd.isLoaded()) {
          mInterstitialCallback = callback;
          mInterstitialAd.show();
        } else {
          callback.invoke("Ad Not Ready");
          if (!mInterstitialAd.isLoading()) {
            mInterstitialAd.loadAd(new AdRequest.Builder().build());
          }
        }
      }
    });
  }

  @ReactMethod
  public void showRewardAd(final Callback callback) {
    new Handler(Looper.getMainLooper()).post(new Runnable() {
      @Override
      public void run() {
        final boolean isIronSrcAvailable = IronSource.isRewardedVideoAvailable();
        final boolean isAdColonyAvailable = mAdColonyAd != null && !mAdColonyAd.isExpired();

        if (!isAdColonyAvailable) {
          loadAdColonyAd();
        }

        if (isIronSrcAvailable || isAdColonyAvailable) {
          mRewardCallback = callback;
        }

        if (Math.random() < 0.5 && isIronSrcAvailable) {
          IronSource.showRewardedVideo();
        } else if (isAdColonyAvailable) {
          mAdColonyAd.show();
        } else if (isIronSrcAvailable) {
          IronSource.showRewardedVideo();
        } else {
          callback.invoke("Not Available");
        }
      }
    });
  }

  @ReactMethod
  public void showOfferwall() {
    new Handler(Looper.getMainLooper()).post(new Runnable() {
      @Override
      public void run() {
        IronSource.showOfferwall();
      }
    });
  }

  @Override
  public String getName() {
    return "RNCoinspinnerLib";
  }
}