package com.cybersourcefingerprintsdk;

import androidx.annotation.NonNull;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.Promise;
import com.facebook.react.module.annotations.ReactModule;
import com.threatmetrix.TrustDefender.RL.*;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.WritableNativeMap;

@ReactModule(name = CybersourceFingerprintSdkModule.NAME)

public class CybersourceFingerprintSdkModule extends ReactContextBaseJavaModule {
    private final android.content.Context applicationContext;
    private TMXProfiling _profiling = null;
    public static final String NAME = "CybersourceFingerprintSdk";

    public CybersourceFingerprintSdkModule(ReactApplicationContext reactContext,
            android.content.Context androidContext) {
        super(reactContext);
        applicationContext = androidContext;
    }

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

    @ReactMethod
    public void initialize(String orgId, String serverUrl, Promise promise) {
        if (_profiling != null) {
            promise.reject("CybersourceModule", "SDK has been initialized already");
        }

        _profiling = TMXProfiling.getInstance(); // Set instance on class to keep as reference

        TMXConfig config = new TMXConfig()
                .setOrgId(orgId)
                .setFPServer(serverUrl)
                .setContext(applicationContext);

        _profiling.init(config);

        promise.resolve(true);
    }

    @ReactMethod
    public void setSessionID(String sessionId, Promise promise) {
        if (_profiling == null) {
            promise.reject("CybersourceModule", "SDK has not been initialized");
        }
        TMXProfilingOptions options = new TMXProfilingOptions().setCustomAttributes(null);
        options.setSessionID(sessionId);
        TMXProfilingHandle profilingHandle = TMXProfiling.getInstance().profile(options,
                new CompletionNotifier(promise));
    }

    class CompletionNotifier implements TMXEndNotifier {
        private final Promise resultPromise;

        CompletionNotifier(Promise promise) {
            super();
            resultPromise = promise;
        }

        @Override
        public void complete(TMXProfilingHandle.Result result) {
            // Log.i("Profiling result", result.getStatus().getDesc());
            // Log.i("PROFILE COMPLETED", "Profile completed with: " +
            // result.getSessionID()+ " - " + result.getStatus().getDesc());

            WritableMap map = new WritableNativeMap();
            map.putString("sessionId", result.getSessionID());
            map.putInt("status", result.getStatus().ordinal());
            map.putString("statusDesc", result.getStatus().getDesc());
            resultPromise.resolve(map);
        }
    }

}