package aicare.net.cn.iweightdemo;

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

import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.BaseActivityEventListener;
import com.facebook.react.bridge.LifecycleEventListener;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;

import javax.annotation.Nullable;

import aicare.net.cn.iweightdemo.utils.BLEProfileServiceManager;

public class WeighScaleModule extends ReactContextBaseJavaModule {

    private final ReactApplicationContext reactContext;
    private BLEProfileServiceManager bleProfileServiceManager;

    private static final int WEIGHT_DATA_REQUEST = 222;
    private static final String E_ACTIVITY_DOES_NOT_EXIST = "E_ACTIVITY_DOES_NOT_EXIST";
    private static final String E_PICKER_CANCELLED = "E_PICKER_CANCELLED";
    private static final String E_FAILED_TO_SHOW_WEIGHING_SCALE = "E_FAILED_TO_SHOW_WEIGHING_SCALE";
    private static final String E_NO_WEIGHT_DATA_FOUND = "E_NO_WEIGHT_DATA_FOUND";

    private Promise mWeightPromise;

    private final ActivityEventListener mActivityEventListener = new BaseActivityEventListener() {
        @Override
        public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent intent) {
            Log.i("WEIGHINGSCALE", "resultCode: " + resultCode + " requestCode: " + requestCode);

            if (requestCode == WEIGHT_DATA_REQUEST) {
                if (mWeightPromise != null) {
                    if (resultCode == Activity.RESULT_CANCELED) {
                        mWeightPromise.reject(E_PICKER_CANCELLED, "Image picker was cancelled");
                    } else if (resultCode == Activity.RESULT_OK) {
                        Log.i("WEIGHINGSCALE", intent.getStringExtra("Weight"));
                        String weight = intent.getStringExtra("Weight");
                        if(weight == null) {
                            mWeightPromise.reject(E_NO_WEIGHT_DATA_FOUND, "No weight data found.");
                        } else {
                            mWeightPromise.resolve(weight);
                        }
                    }
                    mWeightPromise = null;
                }
            }
        }
    };



    public WeighScaleModule(ReactApplicationContext reactContext) {
        super(reactContext);
        this.reactContext = reactContext;
        reactContext.addActivityEventListener(mActivityEventListener);
    }

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

    @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 navigateToWeighingScaleView(final Promise promise) {
        Activity currentActivity = getCurrentActivity();

        if(currentActivity == null) {
            promise.reject(E_ACTIVITY_DOES_NOT_EXIST, "Native Android Activity does not exist.");
            return;
        }

        //Store the promise to resolve/reject when weighing scale returns data
        mWeightPromise = promise;

        try {
            ReactApplicationContext context = getReactApplicationContext();
            final Intent intent = new Intent(context, MyActivity.class);

            currentActivity.startActivityForResult(intent, WEIGHT_DATA_REQUEST);

            Log.i("WEIGHINGSCALE", "Navigating to native view");
        } catch (Exception e) {
            mWeightPromise.reject("202", E_FAILED_TO_SHOW_WEIGHING_SCALE);
            mWeightPromise = null;
        }
    }

    private void sendEvent(ReactContext reactContext, String eventName, @Nullable WritableMap params) {
        reactContext
                .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit(eventName, params);
    }
}
