// ReactNativeTmxProfilingModule.java

package com.rntp;

import android.util.Log;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.WritableNativeMap;
import com.threatmetrix.TrustDefender.TMXConfig;
import com.threatmetrix.TrustDefender.TMXEndNotifier;
import com.threatmetrix.TrustDefender.TMXProfiling;
import com.threatmetrix.TrustDefender.TMXProfilingConnections.TMXProfilingConnections;
import com.threatmetrix.TrustDefender.TMXProfilingHandle;
import com.threatmetrix.TrustDefender.TMXProfilingOptions;
import com.threatmetrix.TrustDefender.TMXStatusCode;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class ReactNativeTmxProfilingModule extends ReactContextBaseJavaModule {

  private final ReactApplicationContext reactContext;

  public ReactNativeTmxProfilingModule(ReactApplicationContext reactContext) {
    super(reactContext);
    this.reactContext = reactContext;
  }

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

  @ReactMethod
  public void sampleMethod(
    String stringArgument,
    int numberArgument,
    Callback callback
  ) {
    // TODO: Implement some actually useful functionality
    callback.invoke(
      "Received numberArgument: " +
      numberArgument +
      " stringArgument: " +
      stringArgument
    );
  }

  @ReactMethod
  public void profileDevice(
    String orgId,
    String fingerprintServer,
    // Callback callback,
    Promise promise
  ) {
    try {
      TMXProfilingConnections tmxConn = new TMXProfilingConnections();
      tmxConn.setConnectionTimeout(60, TimeUnit.SECONDS);
      tmxConn.setRetryTimes(3);
      TMXConfig tmxConfig = new TMXConfig();
      tmxConfig
        .setContext(this.reactContext)
        .setOrgId(orgId)
        .setFPServer(fingerprintServer)
        .setProfilingConnections(tmxConn)
        .setProfileTimeout(180, TimeUnit.SECONDS);

      List<String> m_customMobileList = new ArrayList<String>();
      m_customMobileList.add("React Native TMX libs 6.0");
      TMXProfiling.getInstance().init(tmxConfig);
      TMXProfiling
        .getInstance()
        .profile(
          (new TMXProfilingOptions()).setCustomAttributes(m_customMobileList),
          (
            new TMXEndNotifier() {
              @Override
              public void complete(TMXProfilingHandle.Result result) {
                WritableMap resultData = new WritableNativeMap();
                resultData.putString(
                  "profile_status",
                  String.valueOf(result.getStatus())
                );
                resultData.putString("session_id", result.getSessionID());
                resultData.putString("orgId", orgId);
                resultData.putString("fingerprintServer", fingerprintServer);
                promise.resolve(resultData);
                // Log.i(
                //   "ReactNative",
                //   "Profiling Status: " +
                //   result.getStatus() +
                //   "  session_id: " +
                //   result.getSessionID()
                // );

                // System.out.println(
                //   "Profiling Status: " +
                //   result.getStatus() +
                //   "  session_id: " +
                //   result.getSessionID()
                // );
              }
            }
          )
        );
    } catch (Exception e) {
      promise.reject("Create Event Error", e);
    }
  }
}
