package com.qianmi.mpos;

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

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.BaseActivityEventListener;
import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.google.gson.Gson;
import com.newland.jsums.paylib.NLPay;
import com.newland.jsums.paylib.model.ConsumeRequest;
import com.newland.jsums.paylib.model.NLResult;
import com.newland.jsums.paylib.model.OrderInfo;

/**
 * Created by xiayinglin on 2017/6/26.
 */
class NLPaymentModule extends ReactContextBaseJavaModule {

    private static final String _NL_RESULT_CODE = "NlCode";

    NLPaymentModule(ReactApplicationContext reactContext) {
        super(reactContext);
    }

    @ReactMethod
    public void create() {
        getReactApplicationContext().addActivityEventListener(mActivityEventListener);
    }

    @ReactMethod
    public void destroy() {
        getReactApplicationContext().removeActivityEventListener(mActivityEventListener);
    }

    @ReactMethod
    public void pay(String json) {
        Gson gson = new Gson();
        BalanceRechargeBill billInfo = gson.fromJson(json, BalanceRechargeBill.class);//将json数据转换成类实体
        try {
            NLPay pay = NLPay.getInstance(); // 取一个支付实例
            ConsumeRequest request = new ConsumeRequest(); // 支付交易请求对象
            request.setAppAccessKeyId(billInfo.getAppAccessKeyId()); // 设置appSecretKey
            request.setMrchNo(billInfo.getMrchNo()); // 设置商户号
            request.setCurrency(billInfo.getCurrency()); // 设置货币代码
            request.setAmount(billInfo.getAmount()); // 设置金额
            request.setExtOrderNo(billInfo.getExtOrderNo()); // 设置外部订单号
            request.setExt01(billInfo.getExt01());
            request.setExt02(billInfo.getExt02());
            request.setExt03(billInfo.getExt03());
            request.setSignature(billInfo.getSignData());// 传入私钥生成签名数据,这个要放在最后
            Log.i(getName(), "----------request:" + gson.toJson(request));

            Activity ac = getCurrentActivity();
            if (null != ac) {
                pay.consume(ac, request);
            }
        } catch (Exception e) {
            Log.e(getName(), e.getLocalizedMessage());
        }

    }

    private final ActivityEventListener mActivityEventListener = new BaseActivityEventListener() {
//        String SUCCESS = "1";

        @Override
        public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
            if (null == data) return;
            NLResult result = data.getParcelableExtra("result");
            if (null == result) return;
            WritableMap params = Arguments.createMap();

//            int rCode = result.getResultCode();
//            String resultMsg = result.getResultMsg(); //根据返回对象强转为子类对象
            if (null != result.getData() && result.getResultCode() == 6000) {
                //有订单信息返回的时候需对期进行验签，防止数据被篡改
                OrderInfo orderInfo = (OrderInfo) result.getData();
                //1代表支付成功
//                if (SUCCESS.equals(orderInfo.getOrderStatus())) {
                params.putString("orderNo", orderInfo.getOrderNo());
                params.putString("amount", orderInfo.getAmount());
                params.putString("extOrderNo", orderInfo.getExtOrderNo());
                params.putString("currency", orderInfo.getCurrency());
                params.putString("flowNo", orderInfo.getFlowNo());
                params.putString("issBankCode", orderInfo.getIssBankCode());
                params.putString("mrchName", orderInfo.getMrchName());
                params.putString("mrchName", orderInfo.getMrchNo());
                params.putString("mrchOrderNo", orderInfo.getMrchOrderNo());
                params.putString("orderStatus", orderInfo.getOrderStatus());
                params.putString("orderTime", orderInfo.getOrderTime());
                params.putString("mrchOrderNo", orderInfo.getMrchOrderNo());
                NLPaymentModule.this.getReactApplicationContext()
                        .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(_NL_RESULT_CODE, params);
//                }
            }else {
                NLPaymentModule.this.getReactApplicationContext()
                        .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(_NL_RESULT_CODE, params);
            }
        }
    };

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