package com.base.scanqrclear.luma

import android.util.Base64
import com.base.scanqrclear.GlobalConfig.KEY_AES
import java.nio.charset.Charset
import java.security.SecureRandom
import javax.crypto.Cipher
import javax.crypto.spec.GCMParameterSpec
import javax.crypto.spec.SecretKeySpec

object AESHelps {

    private val AES_CIPHER_TRANSFORMATION = "AES/GCM/NoPadding" // 明确指定加密算法

    // 使用单例模式初始化Cipher，避免每次加密解密都重新创建
    private val cipher: Cipher by lazy {
        Cipher.getInstance(AES_CIPHER_TRANSFORMATION)
    }

    // 使用单例模式初始化SecretKeySpec，避免每次加密解密都重新创建
    private val secretKey: SecretKeySpec by lazy {
        SecretKeySpec(KEY_AES.toByteArray(Charset.defaultCharset()), "AES")
    }

    fun encrypt(content: String): String {
        try {
            // 初始化向量IV，确保每次加密都是随机的
            val iv = generateIv()
            // 初始化GCM参数规范
            val gcmParameterSpec = GCMParameterSpec(128, iv)
            // 初始化Cipher为加密模式
            cipher.init(Cipher.ENCRYPT_MODE, secretKey, gcmParameterSpec)
            // 加密内容
            val encryptedBytes = cipher.doFinal(content.toByteArray(Charset.defaultCharset()))
            // 将IV和加密数据合并，并进行Base64编码
            val message = iv + encryptedBytes
            return Base64.encodeToString(message, Base64.NO_WRAP)
        } catch (_: Exception) {
            return content
        }
    }

    fun decrypt(content: String): String {
        try {
            // 将Base64编码的字符串解码为字节数组
            val contentBytes = Base64.decode(content, Base64.NO_WRAP)
            // 提取IV
            val iv = contentBytes.copyOfRange(0, 12)
            // 提取加密数据
            val encryptedBytes = contentBytes.copyOfRange(12, contentBytes.size)
            // 初始化GCM参数规范
            val gcmParameterSpec = GCMParameterSpec(128, iv)
            // 初始化Cipher为解密模式
            cipher.init(Cipher.DECRYPT_MODE, secretKey, gcmParameterSpec)
            // 解密内容
            val decryptedBytes = cipher.doFinal(encryptedBytes)
            // 将解密后的字节数组转换为字符串
            return String(decryptedBytes, Charset.defaultCharset())
        } catch (_: Exception) {
            return content
        }
    }

    // 生成随机的初始化向量IV
    private fun generateIv(): ByteArray {
        val iv = ByteArray(12)
        SecureRandom().nextBytes(iv)
        return iv
    }
}