package com.volcengine.velive.rn.pull;

import androidx.annotation.Nullable;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.module.annotations.ReactModule;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.volcengine.VolcApiEngine.*;
import com.volcengine.velive.rn.pull.autogen.MethodSignature;

@ReactModule(name = VeLivePullImpl.NAME)
public class VeLivePullModule
    extends VeLivePullModuleSpec implements IEventReceiver {
  private VeLivePullImpl impl;

  VeLivePullModule(ReactApplicationContext context) {
    super(context);
//    MethodSignature.init();
//    ClassHelper.init();
    this.impl = new VeLivePullImpl(context, this);
  }

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

  @ReactMethod(isBlockingSynchronousMethod = true)
  public boolean newApiEngine() {
    return this.impl.newApiEngine();
  }

  @ReactMethod(isBlockingSynchronousMethod = true)
  public String callApiSync(ReadableMap arg) {
    String params = arg.getString("params");
    return this.impl.callApiSync(params);
  }

  @ReactMethod(isBlockingSynchronousMethod = false)
  public void callApi(ReadableMap arg, Callback callback) {
    String params = arg.getString("params");
    this.impl.callApi(params, args -> {
      callback.invoke(args);
    });
  }

  private int listenerCount = 0;

  @ReactMethod
  public void addListener(String eventName) {
    if (listenerCount == 0) {
      // Set up any upstream listeners or background tasks as necessary
    }

    listenerCount += 1;
  }

  @ReactMethod
  public void removeListeners(Integer count) {
    listenerCount -= count;
    if (listenerCount == 0) {
      // Remove upstream listeners, stop unnecessary background tasks
    }
  }

  private void sendEvent(ReactContext reactContext, String eventName,
                         @Nullable WritableMap params) {
    reactContext
        .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
        .emit(eventName, params);
  }

  @Override
  public void OnEvent(String event, String data) {
    final WritableMap map = Arguments.createMap();
    map.putString("event", event);
    map.putString("data", data);

    super.context
        .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
        .emit(VeLivePullModuleSpec.EVENT, map);
  }
}
