// AlipayModule.java

package com.goldstar.alipay;

import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import com.alipay.sdk.app.PayTask;
import com.facebook.react.bridge.ActivityEventListener;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.BaseActivityEventListener;
import com.facebook.react.bridge.Promise;
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 java.util.Map;

public class AlipayModule extends ReactContextBaseJavaModule {
    private static final String MODULE_NAME = "Alipay";
    private static final int SDK_PAY_FLAG = 1;
    private String appId;
    private ReactApplicationContext reactContext;
    private static final String NOT_REGISTERED = "registerApp required.";

    private final ActivityEventListener mActivityEventListener = new BaseActivityEventListener() {
        @Override
        public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent intent) {
            // 支付宝支付结果通过 PayResult 回调处理，这里不需要处理
        }
    };

    // 初始化支付宝模块
    public AlipayModule(ReactApplicationContext reactContext) {
        super(reactContext);
        this.reactContext = reactContext;
        reactContext.addActivityEventListener(mActivityEventListener);
        Log.i("Alipay", "支付宝模块初始化完成");
    }

    @Override
    public String getName() {
        return MODULE_NAME;
    }

    // 注册支付宝应用配置
    @ReactMethod
    public void registerApp(String appId, String universalLink, Promise promise) {
        this.appId = appId;
        Log.i("Alipay", "支付宝SDK配置完成 - AppId: " + appId);
        promise.resolve(true);
    }

    // 发起支付宝支付
    @ReactMethod
    public void pay(String orderInfo, Promise promise) {
        if (TextUtils.isEmpty(orderInfo)) {
            promise.reject("INVALID_PARAM", "orderInfo cannot be empty");
            return;
        }
        final Activity currentActivity = getCurrentActivity();
        if (currentActivity == null) {
            promise.reject("NO_ACTIVITY", "Current activity is null");
            return;
        }
        final Handler mHandler = new Handler() {
            @SuppressWarnings("unchecked")
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case SDK_PAY_FLAG: {
                        PayResult payResult = new PayResult((Map<String, String>) msg.obj);
                        String resultStatus = payResult.getResultStatus();
                        WritableMap resultMap = Arguments.createMap();
                        resultMap.putString("resultStatus", resultStatus);
                        resultMap.putString("result", payResult.getResult());
                        resultMap.putString("memo", payResult.getMemo());
                        resultMap.putString("type", "PayResult.Resp");
                        reactContext
                                .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                                .emit("Alipay_Resp", resultMap);
                        if (TextUtils.equals(resultStatus, "9000")) {
                            promise.resolve(resultMap);
                        } else {
                            promise.reject(resultStatus, payResult.getMemo());
                        }
                        break;
                    }
                    default:
                        break;
                }
            }
        };
        Runnable payRunnable = new Runnable() {
            @Override
            public void run() {
                PayTask alipay = new PayTask(currentActivity);
                Map<String, String> result = alipay.payV2(orderInfo, true);
                Log.i("Alipay", result.toString());
                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }

    // 获取支付宝SDK版本号
    @ReactMethod
    public void getVersion(Promise promise) {
        try {
            Activity currentActivity = getCurrentActivity();
            if (currentActivity == null) {
                promise.reject("NO_ACTIVITY", "Current activity is null");
                return;
            }
            PayTask payTask = new PayTask(currentActivity);
            String version = payTask.getVersion();
            promise.resolve(version);
        } catch (Exception e) {
            promise.reject("ERROR", e.getMessage());
        }
    }

    // 检查支付宝是否已安装
    @ReactMethod
    public void isAlipayInstalled(Promise promise) {
        try {
            PackageManager pm = reactContext.getPackageManager();
            boolean isInstalled = false;
            try {
                pm.getPackageInfo("com.eg.android.AlipayGphone", PackageManager.GET_ACTIVITIES);
                isInstalled = true;
            } catch (PackageManager.NameNotFoundException e) {
                isInstalled = false;
            }
            Log.i("Alipay", "支付宝安装状态: " + isInstalled);
            promise.resolve(isInstalled);
        } catch (Exception e) {
            Log.e("Alipay", "检查支付宝安装状态失败: " + e.getMessage());
            promise.reject("ERROR", e.getMessage());
        }
    }
}

