package com.volcengine.velive.rn.pull;

import androidx.annotation.NonNull;
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.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.volcengine.VolcApiEngine.IEventReceiver;

public class VeLivePullModule extends NativeVeLivePullSpec implements IEventReceiver {
  private VeLivePullImpl impl;
  VeLivePullModule(ReactApplicationContext context) {
    super(context);
    this.impl = new VeLivePullImpl(context, this);
  }

  @Override
  public boolean newApiEngine() {
    return this.impl.newApiEngine();
  }

  @Override
  public String callSync(String params) {
    String result =  impl.callApiSync(params);
    return result;
  }

  @Override
  public void call(String params, Callback callback) {
    Callback myCallback = args -> {
      callback.invoke(args);
    };
    impl.callApi(params, myCallback);
  }

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

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

    super.getReactApplicationContext()
            .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
            .emit(VeLivePullImpl.EVENT_NAME, map);
  }


   private int listenerCount = 0;
  
   @Override
   public void addListener(String eventName) {
      if (listenerCount == 0) {
        // Set up any upstream listeners or background tasks as necessary
      }
  
      listenerCount += 1;
    }

    @Override
    public void removeListeners(double 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);
    }
}
