package ch.dsent.idnow;

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.ReadableMap;

import android.app.Activity;
import android.content.Intent;
import de.idnow.sdk.IDnowSDK;

public class RNIdnowModule extends ReactContextBaseJavaModule {

    private final ReactApplicationContext reactContext;
    private Promise idnowPromise;

    private final ActivityEventListener idnowActivityEventListener = new BaseActivityEventListener() {

        @Override
        public void onActivityResult(final Activity activity, final int requestCode, final int resultCode, final Intent intent) {

            if (requestCode == IDnowSDK.REQUEST_ID_NOW_SDK) {
                switch (resultCode) {

                case IDnowSDK.RESULT_CODE_SUCCESS:
                    ch.dsent.idnow.RNIdnowModule.this.idnowPromise.resolve(true);
                    break;

                case IDnowSDK.RESULT_CODE_CANCEL:
                    ch.dsent.idnow.RNIdnowModule.this.idnowPromise.reject("CANCELLED", "Identification canceled");
                    break;

                case IDnowSDK.RESULT_CODE_FAILED:
                    ch.dsent.idnow.RNIdnowModule.this.idnowPromise.reject("FAILED", "Identification failed");
                    break;

                default:
                    ch.dsent.idnow.RNIdnowModule.this.idnowPromise.reject("INTERNAL_ERROR", "Internal error: " + resultCode);
                }
            }
        }
    }

    public RNIdnowModule(final ReactApplicationContext reactContext) {

        super(reactContext);
        reactContext.addActivityEventListener(this.idnowActivityEventListener);
        this.reactContext = reactContext;
    }

    @Override
    public String getName() {

        return "RNIdnow";
    }

    @ReactMethod
    public void startVideoIdent(final ReadableMap options, final Promise promise) {

        final Activity currentActivity = getCurrentActivity();
        this.idnowPromise = promise;

        try {
            IDnowSDK.getInstance().initialize(currentActivity, options.getString("companyId"));
            IDnowSDK.setShowVideoOverviewCheck(options.getBoolean("showVideoOverviewCheck"), this.reactContext);
            IDnowSDK.setShowErrorSuccessScreen(options.getBoolean("showErrorSuccessScreen"), this.reactContext);

            IDnowSDK.setTransactionToken(options.getString("transactionToken"), this.reactContext);

            IDnowSDK.getInstance().start(IDnowSDK.getTransactionToken(this.reactContext));
        } catch (final Exception e) {
            promise.reject("ERR_UNEXPECTED_EXCEPTION", e);
        }
    }
}
