package suraj.tiwari.reactnativefbads;

import android.content.Context;
import android.util.Log;
import android.view.View;

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

import com.facebook.ads.NativeAdsManager;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.common.MapBuilder;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.ViewGroupManager;
import com.facebook.react.uimanager.annotations.ReactProp;

import java.util.Map;

public class NativeAdViewManager extends ViewGroupManager<NativeAdView> {
  private static String NAME = "CTKNativeAd";

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

  @NonNull
  @Override
  protected NativeAdView createViewInstance(@NonNull ThemedReactContext reactContext) {
    return new NativeAdView(reactContext);
  }

  @ReactProp(name = "adsManager")
  public void setAdsManager(NativeAdView view, String adsManagerId) {
    Context viewContext = view.getContext();
    if (viewContext instanceof ReactContext) {
      ReactContext reactContext = (ReactContext) viewContext;
      NativeAdManager adManager = reactContext.getNativeModule(NativeAdManager.class);
      NativeAdsManager adsManager = adManager.getFBAdsManager(adsManagerId);

      view.setNativeAd(adsManager.nextNativeAd());
    } else {
      Log.e("E_NOT_RCT_CONTEXT", "View's context is not a ReactContext, so it's not possible to get NativeAdManager.");
    }
  }

  @Override
  @Nullable
  public Map<String, Object> getExportedCustomDirectEventTypeConstants() {
    return MapBuilder.<String, Object>of(
        "onAdLoaded",
        MapBuilder.of("registrationName", "onAdLoaded"),
        "onAdFailed",
        MapBuilder.of("registrationName", "onAdFailed")
    );
  }

  @Override
  public void addView(NativeAdView parent, View child, int index) {
    parent.addView(child, index);
  }

  @Override
  public int getChildCount(NativeAdView parent) {
    return parent.getChildCount();
  }

  @Override
  public View getChildAt(NativeAdView parent, int index) {
    return parent.getChildAt(index);
  }

  @Override
  public void removeViewAt(NativeAdView parent, int index) {
    parent.removeViewAt(index);
  }
}
