package com.narutohuo.xindazhou.ble.util

import com.narutohuo.xindazhou.ble.config.BLEConstants
import javax.crypto.Cipher
import javax.crypto.spec.SecretKeySpec

/**
 * BLE加密工具类
 * 
 * 实现AES-128 ECB PKCS7加密/解密
 * 根据新大洲本田蓝牙协议文档
 */
object BLECrypto {
    
    /**
     * 生成AES密钥
     * 
     * @param deviceMac 设备MAC地址（6字节）
     * @return AES密钥（16字节）
     */
    fun generateAESKey(deviceMac: ByteArray): ByteArray {
        val keyString = BLEConstants.AES_KEY_PREFIX + deviceMac.joinToString("") { 
            "%02X".format(it) 
        }
        // 取前16字节作为密钥
        val keyBytes = keyString.toByteArray(Charsets.UTF_8)
        return if (keyBytes.size >= BLEConstants.AES_KEY_LENGTH) {
            keyBytes.sliceArray(0 until BLEConstants.AES_KEY_LENGTH)
        } else {
            // 如果不足16字节，用0填充
            ByteArray(BLEConstants.AES_KEY_LENGTH) { 
                if (it < keyBytes.size) keyBytes[it] else 0x00
            }
        }
    }
    
    /**
     * 加密数据
     * 
     * @param data 原始数据
     * @param key AES密钥（16字节）
     * @return 加密后的数据
     */
    fun encrypt(data: ByteArray, key: ByteArray): ByteArray {
        try {
            val cipher = Cipher.getInstance(BLEConstants.AES_ALGORITHM)
            val secretKey = SecretKeySpec(key, "AES")
            cipher.init(Cipher.ENCRYPT_MODE, secretKey)
            return cipher.doFinal(data)
        } catch (e: Exception) {
            throw RuntimeException("BLE加密失败", e)
        }
    }
    
    /**
     * 解密数据
     * 
     * @param data 加密的数据
     * @param key AES密钥（16字节）
     * @return 解密后的数据
     */
    fun decrypt(data: ByteArray, key: ByteArray): ByteArray {
        try {
            val cipher = Cipher.getInstance(BLEConstants.AES_ALGORITHM)
            val secretKey = SecretKeySpec(key, "AES")
            cipher.init(Cipher.DECRYPT_MODE, secretKey)
            return cipher.doFinal(data)
        } catch (e: Exception) {
            throw RuntimeException("BLE解密失败", e)
        }
    }
}

