package com.qianmi.shengpay;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.widget.Toast;
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.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.qianmi.mpos.R;

import java.util.List;

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

    private static final String _L3_RESULT = "sunmi.payment.L3.RESULT";

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

    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            Log.d(getClass().getSimpleName(), "action = " + action);
            if (action.equals(_L3_RESULT)) {
                WritableMap params = Arguments.createMap();
                params.putInt("resultCode", intent.getIntExtra("resultCode", -1));
                params.putDouble("amount", intent.getDoubleExtra("amount", 0));
                params.putString("voucherNo", intent.getStringExtra("voucherNo"));
                params.putString("referenceNo", intent.getStringExtra("referenceNo"));
                params.putString("transDate", intent.getStringExtra("transDate"));
                params.putString("transId", intent.getStringExtra("transId"));
                params.putString("batchNo", intent.getStringExtra("batchNo"));
                params.putString("cardNo", intent.getStringExtra("cardNo"));
                params.putString("cardType", intent.getStringExtra("cardType"));
                params.putString("issue", intent.getStringExtra("issue"));
                params.putString("terminalId", intent.getStringExtra("terminalId"));
                params.putString("merchantId", intent.getStringExtra("merchantId"));
                params.putString("merchantName", intent.getStringExtra("merchantName"));
                params.putString("merchantNameEn", intent.getStringExtra("merchantNameEn"));
                params.putInt("paymentType", intent.getIntExtra("paymentType", -2));

                params.putString("transTime", intent.getStringExtra("transTime"));
                params.putString("errorMsg", intent.getStringExtra("errorMsg"));
                params.putDouble("balance", intent.getDoubleExtra("balance", 0));
                params.putInt("errorCode", intent.getIntExtra("errorCode", 0));
                params.putInt("transNum", intent.getIntExtra("transNum", 0));
                params.putDouble("totalAmount", intent.getDoubleExtra("totalAmount", 0));

                SfPaymentModule.this.getReactApplicationContext()
                        .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(_L3_RESULT, params);
            }
        }
    };

    @ReactMethod
    public void create() {
        IntentFilter ift = new IntentFilter("sunmi.payment.L3.RESULT");
        getReactApplicationContext().registerReceiver(mBroadcastReceiver, ift);
    }

    @ReactMethod
    public void destroy() {
        getReactApplicationContext().unregisterReceiver(mBroadcastReceiver);
    }

    @ReactMethod
    public void consume(String transId, int paymentType, int transType, String amount) {
        Log.d(getClass().getSimpleName(), "start consume -> transId:" + transId + "  paymentType:" + paymentType + " transType:" + transType + " amount:" + amount);
        Intent intent = new Intent("sunmi.payment.L3");
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.putExtra("appId", getReactApplicationContext().getPackageName());
        intent.putExtra("transId", transId);
        intent.putExtra("transType", transType);
        intent.putExtra("paymentType", paymentType);
        intent.putExtra("amount", Long.valueOf(amount));
        if (exist(intent, getReactApplicationContext())) {
            getReactApplicationContext().startActivity(intent);
        } else {
            Toast.makeText(getCurrentActivity(), R.string.msg_l3_no_exist_app, Toast.LENGTH_SHORT).show();
        }
    }


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


    private boolean exist(Intent intent, Context context) {
        final PackageManager packageManager = context.getPackageManager();
        List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
        return !resolveInfo.isEmpty();
    }
}
