package com.narutohuo.xindazhou.ble.util

import com.narutohuo.xindazhou.ble.config.BLEConstants
import com.narutohuo.xindazhou.ble.model.BLECommand
import com.narutohuo.xindazhou.ble.model.BLEEncryptedData
import java.util.TimeZone

/**
 * BLE数据包构建器
 * 
 * 负责构建符合新大洲本田蓝牙协议的数据包
 * 封装数据包结构、加密、校验等细节
 */
class BLEPacketBuilder {
    
    /**
     * 构建数据包
     * 
     * @param command BLE指令
     * @param encryptKey 加密密钥（16字节）
     * @return 完整的数据包（ByteArray）
     */
    fun buildPacket(command: BLECommand, encryptKey: ByteArray): ByteArray {
        // 1. 构建数据加密区
        val timestamp = System.currentTimeMillis() / 1000 // 秒级时间戳
        val encryptedData = BLEEncryptedData(
            timestamp = timestamp,
            functionCode = command.functionCode,
            instructionType = command.instructionType,
            applicationData = command.applicationData
        )
        
        // 2. 序列化数据加密区
        val encryptedDataBytes = serializeEncryptedData(encryptedData)
        
        // 3. 加密数据
        val encryptedBytes = BLECrypto.encrypt(encryptedDataBytes, encryptKey)
        
        // 4. 构建完整数据包
        val packet = mutableListOf<Byte>()
        
        // 包头
        packet.add(BLEConstants.PACKET_HEAD)
        
        // 地址
        packet.add(BLEConstants.ADDRESS_APP)
        
        // 协议版本
        packet.add(BLEConstants.PROTOCOL_VERSION)
        
        // 时区
        val timezone = (TimeZone.getDefault().rawOffset / (1000 * 60 * 60)).toByte()
        packet.add(timezone)
        
        // 加密标志
        packet.add(BLEConstants.ENCRYPT_FLAG_ENCRYPTED)
        
        // 操作系统
        packet.add(BLEConstants.OS_ANDROID)
        
        // 数据长度（2字节，小端序）
        val dataLength = encryptedBytes.size
        packet.add((dataLength and 0xFF).toByte())
        packet.add(((dataLength shr 8) and 0xFF).toByte())
        
        // 数据加密区
        packet.addAll(encryptedBytes.toList())
        
        // 校验（异或校验，包头至校验前一位）
        val checksum = calculateChecksum(packet)
        packet.add(checksum)
        
        // 包尾
        packet.add(BLEConstants.PACKET_TAIL)
        
        return packet.toByteArray()
    }
    
    /**
     * 序列化数据加密区
     */
    private fun serializeEncryptedData(data: BLEEncryptedData): ByteArray {
        val result = mutableListOf<Byte>()
        
        // 时间戳（4字节，小端序）
        val timestamp = data.timestamp.toInt()
        result.add((timestamp and 0xFF).toByte())
        result.add(((timestamp shr 8) and 0xFF).toByte())
        result.add(((timestamp shr 16) and 0xFF).toByte())
        result.add(((timestamp shr 24) and 0xFF).toByte())
        
        // 功能码
        result.add(data.functionCode)
        
        // 指令类型
        result.add(data.instructionType)
        
        // 应用数据
        result.addAll(data.applicationData.toList())
        
        return result.toByteArray()
    }
    
    /**
     * 计算异或校验
     */
    private fun calculateChecksum(packet: List<Byte>): Byte {
        var checksum = 0x00
        // 从地址开始（跳过包头），到校验位前一位
        for (i in 1 until packet.size) {
            checksum = checksum xor packet[i].toInt()
        }
        return checksum.toByte()
    }
}

