
package com.trustdevice;

import androidx.annotation.NonNull;

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.ReadableMap;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.Arguments; 
import com.trustdevice.utils.TDUniRiskUtils;

import java.util.HashMap;

import com.trustdecision.mobrisk.TDRisk;
import com.trustdecision.mobrisk.TDRiskCallback;
import com.trustdecision.mobrisk.TDAPISignResult;

import com.trustdecision.mobrisk.TDDeviceManager;
import com.trustdecision.mobrisk.TDDeviceInfoCallback;
import com.trustdecision.mobrisk.TDDeviceAPIStatus;

public class TrustdeviceSeModule extends ReactContextBaseJavaModule {
    private final ReactApplicationContext reactContext;

    public TrustdeviceSeModule(ReactApplicationContext reactContext) {
        super(reactContext);
        this.reactContext = reactContext;
    }

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

    @ReactMethod
    public void initWithOptions(ReadableMap readableMap, Promise promise) {
        if (readableMap != null) {
            HashMap<String, Object> options = readableMap.toHashMap();
            TDDeviceManager.Builder builder = TDUniRiskUtils.mapToBuilderSe(options);
            TDDeviceManager.initWithOptions(this.reactContext.getApplicationContext(), builder);
            promise.resolve(null);
        }
    }

    @ReactMethod
    public void getBlackBoxAsync(Promise promise) {
        try {
            TDRisk.getBlackBoxAsync(new TDRiskCallback() {
                @Override
                public void onEvent(String blackbox) {
                    promise.resolve(blackbox);
                }
            });
        } catch (Exception e) {
            promise.reject("getBlackBoxAsync Error", e);
        }
    }

    @ReactMethod
    public void getDeviceInfo(Promise promise) {
        try {

            TDDeviceManager.getDeviceInfo(new TDDeviceInfoCallback() {
                @Override
                public void onResult(String fpVersion,
                            String blackBox,
                            String anonymousId,
                            int deviceRiskScore,
                            TDDeviceAPIStatus apiStatus,
                            String sealedResult) {
                    // 注：回调在子线程中执行，请不要在此处操作UI
                    // fpVersion: SDK版本号
                    // blackBox: 本次采集的blackBox
                    // anonymousId: 当前设备的匿名ID
                    // deviceRiskScore: 设备风险分数
                    // apiStatus: API状态信息
                    // sealedResult: 密封结果
                    int code = apiStatus.getCode();
                    
                    // 创建 WritableMap 来返回结构化数据
                    WritableMap resultMap = Arguments.createMap();
                    
                    resultMap.putInt("code", apiStatus.getCode());
                    resultMap.putString("fpVersion", fpVersion);
                    resultMap.putString("blackBox", blackBox);
                    resultMap.putString("anonymousId", anonymousId);
                    resultMap.putInt("deviceRiskScore", deviceRiskScore);
                    resultMap.putString("sealedResult", sealedResult);
                    resultMap.putString("msg", apiStatus.getMessage());

                    promise.resolve(resultMap);   
                }
            });

        } catch (Exception e) {
            promise.reject("getDeviceInfo Error", e);
        }
    }

    @ReactMethod
    public void sign(String path, Promise promise) {
        try {
            TDAPISignResult signResult = TDRisk.sign(this.reactContext.getApplicationContext(), path);
            // 创建 WritableMap 来返回结构化数据
            WritableMap resultMap = Arguments.createMap();
            resultMap.putString("sign", signResult.signature());
            resultMap.putInt("code", signResult.code());
            resultMap.putString("msg", signResult.message());
            
            promise.resolve(resultMap);
            
        } catch (Exception e) {
            promise.reject("sign Error", e);
        }
    }

    @ReactMethod
    public void getSDKVersion(Promise promise) {
        String sdkVersion = TDRisk.getSDKVersion();
        promise.resolve(sdkVersion);
    }
}