package com.reactlibrary;

import android.annotation.SuppressLint;
import android.util.Log;

import com.facebook.react.bridge.Arguments;
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.facebook.react.bridge.WritableMap;
import com.reactlibrary.vishwamdkyclib.APICompletionCallback;
import com.reactlibrary.vishwamdkyclib.Activities.VishwamDocActivity;
import com.reactlibrary.vishwamdkyclib.Activities.VishwamFaceActivity;
import com.reactlibrary.vishwamdkyclib.DocCaptureCompleteHandler;
import com.reactlibrary.vishwamdkyclib.FaceCaptureCompleteHandler;
import com.reactlibrary.vishwamdkyclib.Networking.VishwamNetworkHelper;
import com.reactlibrary.vishwamdkyclib.VishwamError;

import org.json.JSONException;
import org.json.JSONObject;

import static com.reactlibrary.ReactConversions.convertJsonToMap;
import static com.reactlibrary.ReactConversions.convertMapToJson;

public class VishwamDkycLibReactModule extends ReactContextBaseJavaModule {

    private final ReactApplicationContext reactContext;
    private Callback faceCallback, docCallback, docApiCallback, fmApiCallback;
    private VishwamNetworkHelper vishwamNetworkHelper;

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

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

    @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 initSDK(String appId, int env, String secureKey){
        vishwamNetworkHelper = new VishwamNetworkHelper(reactContext,appId,env,secureKey);
    }

    ////////================ Doc capture ============================///////

    private WritableMap docCaptureResponse = Arguments.createMap();
    @ReactMethod
    public void startDocCapture(ReadableMap params, Callback callback) {
        this.docCallback = callback;
        JSONObject docParams = null;

        try {
            docParams = convertMapToJson(params);
            VishwamDocActivity.start(reactContext, docParams, docCaptureCompleteHandler);
        } catch (JSONException e) {
            e.printStackTrace();
            docCaptureResponse = Arguments.createMap();
            docCaptureResponse.putString("capture_error","Input params are missing");
            docCallback.invoke(docCaptureResponse);
        }
    }


    private DocCaptureCompleteHandler docCaptureCompleteHandler = new DocCaptureCompleteHandler() {
        @Override
        public void onResult(VishwamError error, JSONObject jsonDocResult) {

            docCaptureResponse = Arguments.createMap();
            if (error == null) {
//                Log.e("vishwamReactD",jsonDocResult.toString());
                docCaptureResponse.putString("capture_response",jsonDocResult.toString());
                docCallback.invoke(docCaptureResponse);
            }else {
//                Log.e("vishwamReactD",error.getErrorMsg());
                docCaptureResponse.putString("capture_error",error.getErrorMsg());
                docCallback.invoke(docCaptureResponse);
            }
        }
    };
    ///////================ Doc capture ============================///////

    ///////================ Doc OCR call ============================///////

//    private WritableMap ocrApiResponse = new WritableNativeMap();

    private WritableMap ocrApiResponse = Arguments.createMap();
    @ReactMethod
    public void makeOCRCall(int env, String docimg, ReadableMap params,ReadableMap docHeader,Callback callback){

        this.docApiCallback = callback;
        JSONObject apiDocParams = null;
        JSONObject header = null;
        try {
            apiDocParams = convertMapToJson(params);
            header = convertMapToJson(docHeader);

            vishwamNetworkHelper.makeOCRCall(env, docimg, apiDocParams, header,docApiCompletionCallback);
        } catch (JSONException e) {
            e.printStackTrace();
            ocrApiResponse = Arguments.createMap();
            ocrApiResponse.putString("doc_error","Input params are missing");
            docApiCallback.invoke(ocrApiResponse);
        }

    }

    private APICompletionCallback docApiCompletionCallback = new APICompletionCallback() {
        @SuppressLint("SetTextI18n")
        @Override
        public void onResponse(final VishwamError error, final JSONObject jsonObjectApiResponse, JSONObject header) {

            ocrApiResponse = Arguments.createMap();

            if (error == null){
//                Log.e("vishwamApiRes", String.valueOf(jsonObjectApiResponse));

                String resultString = jsonObjectApiResponse.toString();
//                Log.e("resultString",resultString);

                ocrApiResponse.putString("doc_response",resultString);
                ocrApiResponse.putString("doc_header",header.toString());

                docApiCallback.invoke( ocrApiResponse);

//                    docApiCallback.invoke( ocrApiResponse, ocrApiHeader);
            }else {
//                Log.e("apiCompletionError",error.errorMsg);
                ocrApiResponse.putString("doc_error",error.errorMsg);
                docApiCallback.invoke(ocrApiResponse);
            }
        }
    };

    ///////================ Doc OCR call ============================///////

    //////================ Face capture ============================///////

    //    private WritableMap livenessApiResponse = new WritableNativeMap();
    private WritableMap livenessApiResponse = Arguments.createMap();

    @ReactMethod
    public void startFaceCapture(ReadableMap params,Callback callback){
        this.faceCallback = callback;
        JSONObject faceParams;
        try {
            faceParams = convertMapToJson(params);
            VishwamFaceActivity.start(reactContext,faceParams,faceCaptureCompleteHandler);
        } catch (JSONException e) {
            e.printStackTrace();
//            Log.e("vishwamReactF",e.getMessage());

            livenessApiResponse.putString("live_error","Input params are missing");
            faceCallback.invoke(livenessApiResponse);

        }
    }

    private FaceCaptureCompleteHandler faceCaptureCompleteHandler = new FaceCaptureCompleteHandler() {
        @Override
        public void onResult(final VishwamError vishwamError, final JSONObject jsonObject, final JSONObject header) {

            livenessApiResponse = Arguments.createMap();
            if (vishwamError==null) {

//                Log.e("vishwamReactF",jsonObject.toString()+","+header.toString());

//                    WritableMap livenessApiResponse = convertJsonToMap(jsonObject);
//                    WritableMap livenessApiHeader = convertJsonToMap(header);

                livenessApiResponse.putString("live_response",jsonObject.toString());
                livenessApiResponse.putString("live_header",header.toString());

                faceCallback.invoke(livenessApiResponse);

            }else {
//                Log.e("vishwamReactF",vishwamError.getErrorMsg());

                livenessApiResponse.putString("live_error",vishwamError.getErrorMsg());
                faceCallback.invoke(livenessApiResponse);

            }

        }
    };

    ///////================ Face capture ============================///////


    ///////================ Face Match call ============================///////

    //    private WritableMap fmApiResponse = new WritableNativeMap();
    private WritableMap fmApiResponse = Arguments.createMap();
    @ReactMethod
    public void makeFaceMatchCall(int env, String img, String docimg ,ReadableMap params,ReadableMap header,Callback callback){

        this.fmApiCallback = callback;
        JSONObject fmParams = null;
        JSONObject fmHeader = null;

        try {
            fmParams = convertMapToJson(params);
            fmHeader = convertMapToJson(header);
            vishwamNetworkHelper.makeFaceMatchCall(env, img, docimg, fmParams, fmHeader, fmApiCompletionCallback);
        } catch (JSONException e) {
            e.printStackTrace();
            fmApiResponse = Arguments.createMap();
            fmApiResponse.putString("fm_error","Input params are missing");
            fmApiCallback.invoke(fmApiResponse);
        }
    }

    private APICompletionCallback fmApiCompletionCallback = new APICompletionCallback() {
        @SuppressLint("SetTextI18n")
        @Override
        public void onResponse(final VishwamError error, final JSONObject jsonObjectApiResponse, JSONObject header) {

            fmApiResponse = Arguments.createMap();
            if (error == null){
//                Log.e("vishwamApiRes", String.valueOf(jsonObjectApiResponse));

                //    WritableMap fmApiResponse = convertJsonToMap(jsonObjectApiResponse);
//                    WritableMap fmApiHeader = convertJsonToMap(header);
                fmApiResponse.putString("fm_response",jsonObjectApiResponse.toString());
                fmApiResponse.putString("fm_header",header.toString());
                fmApiCallback.invoke(fmApiResponse);

            }else {
//                Log.e("apiCompletionError",error.errorMsg);
                fmApiResponse.putString("fm_error",error.getErrorMsg());
                fmApiCallback.invoke(fmApiResponse);
            }
        }
    };

    ///////================ Face Match call ============================///////

}
