package com.molpayxdk;

import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.molpay.molpayxdk.MOLPayActivity;
import com.molpay.molpayxdk.googlepay.ActivityGP;
import android.content.Intent;

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

import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.BaseActivityEventListener;

import org.json.JSONObject;
import org.json.JSONArray;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;

import javax.annotation.Nullable;

public class MOLPayReact extends ReactContextBaseJavaModule {
    public static HashMap<String, Object> paymentDetails;
    public static Callback successCallback;
    public static Callback errorCallback;

    private final ActivityEventListener mActivityEventListener = new BaseActivityEventListener() {
    @Override
    public void onActivityResult(final Activity activity,int requestCode, int resultCode, Intent data) {
        if (requestCode == MOLPayActivity.MOLPayXDK) {
            if (resultCode == Activity.RESULT_OK && data != null) {
                // Payment success
                String transactionResult = data.getStringExtra(com.molpay.molpayxdk.MOLPayActivity.MOLPayTransactionResult);
                if (successCallback != null) {
                    successCallback.invoke(transactionResult);
                }
            } else if (resultCode == Activity.RESULT_CANCELED) {
                // Payment failed or canceled
                if (errorCallback != null) {
                    errorCallback.invoke("Transaction canceled or failed. Please try again.");
                }
            }
        }
    }
  };

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


    public MOLPayReact(ReactApplicationContext reactContext) {
        super(reactContext);
        reactContext.addActivityEventListener(mActivityEventListener);
    }

    @ReactMethod
    public void setPaymentDetails(String str,@Nullable Callback successCallback, @Nullable Callback errorCallback){
        paymentDetails = new HashMap<>();
        if(successCallback != null){
            this.successCallback = successCallback;
        }
        if(errorCallback != null){
            this.errorCallback = errorCallback;
        }
        try{
            JSONObject obj = new JSONObject(str);
            Iterator<String> iter = obj.keys();
            while (iter.hasNext()) {
                String key = iter.next();
                Object value = obj.get(key);

                if (value instanceof Boolean) {
                    paymentDetails.put(key, (Boolean) value);
                } else if (value instanceof JSONArray) {
                    JSONArray array = (JSONArray) value;
                    String[] stringArray = new String[array.length()];
                    for (int i = 0; i < array.length(); i++) {
                        stringArray[i] = array.getString(i);
                    }
                    paymentDetails.put(key, stringArray);
                } else if (value instanceof String) {
                    paymentDetails.put(key, (String) value);
                } else {
                    paymentDetails.put(key, value.toString());
                }
            }
            paymentDetails.put("is_submodule", true);
            paymentDetails.put("module_id", "molpay-mobile-xdk-reactnative-beta-android");
            paymentDetails.put("wrapper_version", "0");
            Intent intent = new Intent(getCurrentActivity(), MOLPayActivity.class);

            if ((paymentDetails != null && paymentDetails.containsKey("mp_channel"))) {
                // Start normal payment
                intent = new Intent(getCurrentActivity(), MOLPayActivity.class);
            } else {
                // Start Google Pay
                intent = new Intent(getCurrentActivity(), com.molpay.molpayxdk.googlepay.ActivityGP.class);
            }
            intent.putExtra(com.molpay.molpayxdk.MOLPayActivity.MOLPayPaymentDetails, this.paymentDetails);
            getCurrentActivity().startActivityForResult(intent, com.molpay.molpayxdk.MOLPayActivity.MOLPayXDK);
        }catch(Exception e){
            if (this.errorCallback != null) {
                this.errorCallback.invoke(e.getMessage());
            }
        }
    }


}
