package com.ttstd.controlled.utils;

import android.os.Build;
import android.security.keystore.KeyGenParameterSpec;
import android.security.keystore.KeyProperties;

import java.security.KeyStore;
import java.security.SecureRandom;
import java.util.Base64;

import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

/**
 * Android Keystore 密钥助手。
 *
 * 在系统安全区（TEE / StrongBox）中生成并持有 AES 密钥，密钥明文不会进入应用进程内存。
 * 对外仅暴露 {@link #getCryptKey()}：把 Keystore 中的 AES 密钥材料编码为 MMKV 加密所需的字节。
 *
 * 兼容性说明：
 * - minSdk 21 起即支持 Android Keystore 的 AES 密钥（KeyProperties.BLOCK_MODE_GCM）。
 * - Android 9（28）起可选 StrongBox（部分机型有硬件安全芯片），不支持时自动降级到 TEE。
 * - 默认不要求用户认证（否则锁屏后无法在后台读取凭据），仅依赖安全硬件隔离。
 */
public final class KeystoreHelper {

    private static final String KEYSTORE_PROVIDER = "AndroidKeyStore";
    private static final String KEY_ALIAS = "ttstd_device_secret_key";
    private static final int KEY_SIZE = 256;

    private KeystoreHelper() {
    }

    /** 获取 MMKV 加密所需的密钥（源自 Keystore 中的 AES 密钥，Base64 编码字符串）。 */
    public static String getCryptKey() {
        try {
            SecretKey key = getOrCreateKey();
            return Base64.getEncoder().encodeToString(key.getEncoded());
        } catch (Exception e) {
            // Keystore 不可用（极端机型/系统异常）：回退到随机密钥仅驻留内存，不落盘。
            // 注意：此分支下加密 MMKV 的密钥不会持久化，进程重启后旧密文无法解密，
            // 调用方需感知“无法安全存储”并改为内存持有 + 重新激活。
            return Base64.getEncoder().encodeToString(fallbackInMemoryKey());
        }
    }

    private static SecretKey getOrCreateKey() throws Exception {
        KeyStore keyStore = KeyStore.getInstance(KEYSTORE_PROVIDER);
        keyStore.load(null);
        if (keyStore.containsAlias(KEY_ALIAS)) {
            return (SecretKey) keyStore.getKey(KEY_ALIAS, null);
        }
        return createKey();
    }

    private static SecretKey createKey() throws Exception {
        KeyGenerator generator = KeyGenerator.getInstance(
                KeyProperties.KEY_ALGORITHM_AES, KEYSTORE_PROVIDER);

        KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder(
                KEY_ALIAS,
                KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                .setKeySize(KEY_SIZE)
                .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                .setRandomizedEncryptionRequired(true);

        // StrongBox 仅在 Android 9+ 且设备支持时启用，否则回退 TEE。
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            builder.setIsStrongBoxBacked(false);
        }

        generator.init(builder.build());
        return generator.generateKey();
    }

    private static byte[] fallbackInMemoryKey() {
        byte[] key = new byte[KEY_SIZE / 8];
        new SecureRandom().nextBytes(key);
        return key;
    }

    /** 仅供测试/诊断：当前密钥是否由持久化 Keystore 提供。 */
    public static boolean isKeystoreBacked() {
        try {
            KeyStore keyStore = KeyStore.getInstance(KEYSTORE_PROVIDER);
            keyStore.load(null);
            return keyStore.containsAlias(KEY_ALIAS)
                    && keyStore.getKey(KEY_ALIAS, null) != null;
        } catch (Exception e) {
            return false;
        }
    }
}
