// Copyright © 2022 BytePlusRTC All rights reserved.
// SPDX-License-Identifier: MIT

package com.volcengine.reactnative.vertc;

import android.util.Log;

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 VertcModule extends NativeVertcSpec implements IEventReceiver {

  public static final String TAG = "VertcModule";
  private VertcImpl impl;
  // unused yet.
  private int listenerCount = 0;
  public static ReactApplicationContext reactApplicationContext = null;

  public VertcModule(ReactApplicationContext reactContext) {
    super(reactContext);
    ScreenCaptureHelper.registerReactApplicationContext(reactContext);
    this.impl = new VertcImpl(reactContext, this);
    reactApplicationContext = reactContext;
    VertcApiEngineManager.instance.init(this.impl);
    Log.d(TAG, "VertcModule init");
  }
  
  @Override
  public boolean newApiEngine() {
    boolean res = this.impl.newApiEngine();
    NativeVariableManager.init(this.impl.apiEngine.msgClient, reactApplicationContext);
    Log.d(TAG, "ApiEngine init");
    return res;
  }

  @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(VertcImpl.EVENT_NAME, map);
  }

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

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

  @Override
  public void call(String params, Callback callback) {
    impl.callApi(params, callback);
  }

  @Override
  public void addListener(String eventType) {
    listenerCount += 1;
  }

  @Override
  public void removeListeners(double count) {
    listenerCount -= (int) count;
  }

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