package com.narutohuo.xindazhou.ble.util

import com.narutohuo.xindazhou.ble.config.BLEConstants
import com.narutohuo.xindazhou.ble.model.BLEEncryptedData

/**
 * BLE数据包解析器
 * 
 * 负责解析从设备接收的数据包
 * 处理解密、校验、数据提取等
 */
class BLEPacketParser {
    
    /**
     * 解析数据包
     * 
     * @param packet 接收到的数据包
     * @param encryptKey 解密密钥（16字节）
     * @return 解析后的数据加密区内容
     */
    fun parsePacket(packet: ByteArray, encryptKey: ByteArray): BLEEncryptedData? {
        // 1. 校验包头包尾
        if (packet.isEmpty() || packet[0] != BLEConstants.PACKET_HEAD) {
            return null
        }
        if (packet[packet.size - 1] != BLEConstants.PACKET_TAIL) {
            return null
        }
        
        // 2. 提取数据长度
        val dataLength = (packet[6].toInt() and 0xFF) or 
                        ((packet[7].toInt() and 0xFF) shl 8)
        
        // 3. 提取加密数据
        val encryptedData = packet.sliceArray(8 until 8 + dataLength)
        
        // 4. 校验校验位
        val checksum = packet[packet.size - 2]
        if (!verifyChecksum(packet, checksum)) {
            return null
        }
        
        // 5. 解密数据
        val decryptedData = BLECrypto.decrypt(encryptedData, encryptKey)
        
        // 6. 解析数据加密区
        return parseEncryptedData(decryptedData)
    }
    
    /**
     * 解析数据加密区
     */
    private fun parseEncryptedData(data: ByteArray): BLEEncryptedData {
        var offset = 0
        
        // 时间戳（4字节，小端序）
        val timestamp = (data[offset].toInt() and 0xFF) or
                       ((data[offset + 1].toInt() and 0xFF) shl 8) or
                       ((data[offset + 2].toInt() and 0xFF) shl 16) or
                       ((data[offset + 3].toInt() and 0xFF) shl 24)
        offset += 4
        
        // 功能码
        val functionCode = data[offset]
        offset += 1
        
        // 指令类型
        val instructionType = data[offset]
        offset += 1
        
        // 应用数据
        val applicationData = data.sliceArray(offset until data.size)
        
        return BLEEncryptedData(
            timestamp = timestamp.toLong(),
            functionCode = functionCode,
            instructionType = instructionType,
            applicationData = applicationData
        )
    }
    
    /**
     * 校验校验位
     */
    private fun verifyChecksum(packet: ByteArray, expectedChecksum: Byte): Boolean {
        var checksum = 0x00
        // 从地址开始（跳过包头），到校验位前一位
        for (i in 1 until packet.size - 2) {
            checksum = checksum xor packet[i].toInt()
        }
        return checksum.toByte() == expectedChecksum
    }
}

