package com.rnbiometrics;
import android.util.Base64;
import com.rnbiometrics.ReactNativeBiometrics;
import androidx.annotation.NonNull;
import androidx.biometric.BiometricPrompt;

import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.WritableNativeMap;

import java.nio.charset.StandardCharsets;
import java.security.PrivateKey;
import java.security.Signature;

public class CreateSignatureCallback extends BiometricPrompt.AuthenticationCallback {
    private final Promise promise;
    private final String payload;
    private final int type;
    private final PrivateKey privateKey;
    private final ReactNativeBiometrics biometricModule;

    public static final int TYPE_BASE64 = 1;
    public static final int TYPE_STRING = 0;

    public CreateSignatureCallback(Promise promise, String payload, int type, PrivateKey privateKey, ReactNativeBiometrics biometricModule) {
        super();
        this.promise = promise;
        this.payload = payload;
        this.type = type;
        this.privateKey = privateKey;
        this.biometricModule = biometricModule;
    }

    @Override
    public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) {
        super.onAuthenticationError(errorCode, errString);
        WritableMap resultMap = new WritableNativeMap();
        resultMap.putBoolean("success", false);
        resultMap.putString("message", errString.toString());
        resultMap.putInt("code", errorCode);
        promise.resolve(resultMap);
    }

    @Override
    public void onAuthenticationSucceeded(@NonNull BiometricPrompt.AuthenticationResult result) {
        super.onAuthenticationSucceeded(result);

        try {
            BiometricPrompt.CryptoObject cryptoObject = result.getCryptoObject();
            Signature cryptoSignature = cryptoObject.getSignature();

            // Cập nhật dữ liệu để ký
            byte[] dataToSign = (type == TYPE_BASE64)
                    ? Base64.decode(this.payload, Base64.DEFAULT)
                    : this.payload.getBytes(StandardCharsets.UTF_8);

            cryptoSignature.update(dataToSign);

            // Tạo chữ ký
            byte[] signed = cryptoSignature.sign();
            String signedString = Base64.encodeToString(signed, Base64.NO_WRAP);

            // ✅ Cache lại khóa và thời gian xác thực
            biometricModule.setCachedKey(privateKey, System.currentTimeMillis());

            // Trả kết quả về React Native
            WritableMap resultMap = new WritableNativeMap();
            resultMap.putBoolean("success", true);
            resultMap.putString("signature", signedString);
            resultMap.putString("message", "Success!");
            promise.resolve(resultMap);

        } catch (Exception e) {
            WritableMap resultMap = new WritableNativeMap();
            Throwable cause = e.getCause();
            if (cause != null && cause.getMessage() != null && cause.getMessage().contains("Key user not authenticated")) {
                resultMap.putBoolean("success", false);
                resultMap.putString("message", "Người dùng chưa xác thực. Vui lòng dùng vân tay hoặc khuôn mặt.");
                resultMap.putInt("code", -17);
            } else {
                resultMap.putBoolean("success", false);
                resultMap.putString("message", "Lỗi tạo chữ ký: " + e.getMessage());
                resultMap.putInt("code", -9);
            }
            promise.resolve(resultMap);
        }
    }
}
