
package com.rnonfido;

import android.app.Activity;
import android.content.Intent;

import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.BaseActivityEventListener;
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.Callback;
import com.facebook.react.bridge.ReadableMap;

import com.onfido.android.sdk.capture.DocumentType;
import com.onfido.android.sdk.capture.Onfido;
import com.onfido.android.sdk.capture.ExitCode;
import com.onfido.android.sdk.capture.OnfidoConfig;
import com.onfido.android.sdk.capture.OnfidoFactory;
import com.onfido.android.sdk.capture.errors.OnfidoException;
import com.onfido.android.sdk.capture.ui.country_selection.CountryAlternatives;
import com.onfido.android.sdk.capture.ui.options.CaptureScreenStep;
import com.onfido.android.sdk.capture.ui.options.FlowStep;
import com.onfido.api.client.data.Applicant;
import com.onfido.android.sdk.capture.upload.Captures;
import android.widget.Toast;
import android.support.annotation.Nullable;


import java.util.GregorianCalendar;
import java.util.HashMap;

public class RNOnfidoSdkModule extends ReactContextBaseJavaModule {

    private static final String E_ACTIVITY_DOES_NOT_EXIST = "E_ACTIVITY_DOES_NOT_EXIST";
    private static final String E_FAILED_TO_SHOW_ONFIDO = "E_FAILED_TO_SHOW_ONFIDO";
    private final Onfido client;
    private Callback mSuccessCallback;
    private Callback mErrorCallback;
    private ReadableMap mParams;

    private final ActivityEventListener mActivityEventListener = new BaseActivityEventListener() {
        @Override
        public void onActivityResult(final Activity activity, int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            client.handleActivityResult(resultCode, data, new Onfido.OnfidoResultListener() {
                @Override
                public void onError(@Nullable OnfidoException e, Applicant applicant) {

                }

                @Override
                public void userCompleted(Applicant applicant, Captures captures) {
                    mSuccessCallback.invoke(applicant.getId());
                }

                @Override
                public void userExited(ExitCode exitCode, Applicant applicant) {
                    mErrorCallback.invoke(exitCode.toString());
                }
            });
        }
    };

  public RNOnfidoSdkModule(ReactApplicationContext reactContext) {
    super(reactContext);
    client = OnfidoFactory.create(reactContext).getClient();
    reactContext.addActivityEventListener(mActivityEventListener);
  }

  @Override
  public String getName() {
    return "RNOnfidoSdk";
  }
  
  @ReactMethod
    public void startSDK(ReadableMap params, String applicantId, Callback successCallback, Callback errorCallback) {

        Activity currentActivity = getCurrentActivity();
        mSuccessCallback = successCallback;
        mErrorCallback = errorCallback;

        final FlowStep[] flowStepsWithOptions = new FlowStep[]{
                new CaptureScreenStep(DocumentType.PASSPORT, CountryAlternatives.NO_COUNTRY),
                FlowStep.CAPTURE_FACE,
                FlowStep.FINAL
        };

        if (currentActivity == null) {
            mErrorCallback.invoke(E_ACTIVITY_DOES_NOT_EXIST);
            return;
        }

        try {
          HashMap paramsMap = params.toHashMap();

           // String OnfidoToken = getCurrentActivity().getResources().getString(R.string.onfido_token);
            String OnfidoToken = (String) paramsMap.get("token");
            OnfidoConfig onfidoConfig = OnfidoConfig.builder()
                    .withCustomFlow(flowStepsWithOptions)
                    .withApplicant(applicantId)
                    .withToken(OnfidoToken)
                    .build();
            client.startActivityForResult(currentActivity, 1, onfidoConfig);
        } catch (Exception e) {
            mErrorCallback.invoke(E_FAILED_TO_SHOW_ONFIDO);
            mErrorCallback = null;
        }
    }
}