package com.omniretail.omnipay;

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

import java.util.HashMap;
import java.util.Map;

import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.BaseActivityEventListener;
import com.facebook.react.bridge.NativeModule;
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.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.facebook.react.bridge.WritableMap;

public class OmnipayActivityModule extends ReactContextBaseJavaModule {
    private static final String ERROR = "ERROR";
    private static final String ACTIVITY_DOES_NOT_EXIST = "ACTIVITY_DOES_NOT_EXIST";
    private static final int ACTIVITY_REQUEST_CODE = 1;
    private String returnKey = "";
    private final int RC_KEY_EXCHANGE = 52477;
    private final int RC_PURCHASE = 135689;

    private Promise mPromise;
    private Promise iPromise;

    private ReactApplicationContext reactContext;

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

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

    @Override
    public Map < String, Object > getConstants() {
        final Map < String, Object > constants = new HashMap < > ();
        constants.put("ERROR", ERROR);
        constants.put("ACTIVITY_DOES_NOT_EXIST", ACTIVITY_DOES_NOT_EXIST);
        return constants;
    }

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

    private int listenerCount = 0;

    @ReactMethod
    public void addListener(String eventName) {
        if (listenerCount == 0) {
            // Set up any upstream listeners or background tasks as necessary
        }

        listenerCount += 1;
    }

    @ReactMethod
    public void removeListeners(Integer count) {
        listenerCount -= count;
        if (listenerCount == 0) {
            // Remove upstream listeners, stop unnecessary background tasks
        }
    }


    @ReactMethod
    public void isPackageInstalled(String packageName, Promise promise) {
        try {
            iPromise = promise;
            Intent intent = this.reactContext.getPackageManager().getLaunchIntentForPackage(packageName);
            if (intent != null) {
                iPromise.resolve(true);
            } else {
                iPromise.resolve(false);
            }
            iPromise = null;
        } catch (Exception e) {
            iPromise.resolve(false);
            iPromise = null;
        }
    }

    @ReactMethod
    public void initiateHorizonTransaction(double amt, String tranType, String colour, boolean print, String rrn, String stan, String terminalId, Promise promise) {
        try {
            mPromise = promise;
            Activity currentActivity = getCurrentActivity();

            String purchase = "{" +
                "\"transType\": \"" + tranType + "\",\n" +
                "\"amount\": \"" + amt + "\",\n" +
                "\"colour\": \"" + "234567" + "\",\n" +
                "\"TID\": \"" + terminalId + "\",\n" +
                "\"rrn\": \"" + rrn + "\",\n" +
                "\"stan\": \"" + stan + "\",\n" +
                "\"print\": \"" + print + "\"\n" +
                "}";

            Intent fmIntent = this.reactContext.getPackageManager().getLaunchIntentForPackage("com.horizonpay.sample");
            fmIntent.setFlags(0);

            fmIntent.putExtra("requestData", purchase);

            if (tranType == "PURCHASE") {
                currentActivity.startActivityForResult(fmIntent, RC_PURCHASE);
            } else {
                currentActivity.startActivityForResult(fmIntent, RC_KEY_EXCHANGE);
            }

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }



    private final ActivityEventListener mActivityEventListener = new BaseActivityEventListener() {
        @Override
        public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
            try {
                if (data != null) {
                    String statusMessage = data.getStringExtra("statusMessage");
                    String status = data.getStringExtra("status");
                    String datax = data.getStringExtra("data");
                    String result = "-status-" + status + "-data-" + datax + "-message-" + statusMessage;

                    try {
                        WritableMap params = Arguments.createMap();
                        params.putString("data", datax);
                        sendEvent(reactContext, "OmnipayEvent", params);
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }

                    // String returnValue = data.getStringExtra(returnKey);
                    if (mPromise != null) {
                        mPromise.resolve(result);
                    }

                    mPromise = null;
                } else {
                    if(mPromise != null) {
                         mPromise.resolve("no data");
                    }
                    mPromise = null;
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }

        }
    };
}