package com.example.m20_gamepad.network

import com.example.m20_gamepad.network.models.ApduMessage
import com.example.m20_gamepad.network.models.Header
import java.util.concurrent.atomic.AtomicInteger

/**
 * 报文编码器。管理 MsgId 自增，将 ASDU JSON 字符串编码为完整 APDU 字节数组。
 */
class PacketEncoder {

    private val msgIdCounter = AtomicInteger(0)

    /**
     * 生成下一个 MsgId（u16，从 0 递增，65535 后回绕到 0）
     */
    fun nextMsgId(): Int = msgIdCounter.getAndIncrement().and(0xFFFF)

    /**
     * 将 ASDU JSON 字符串编码为完整 APDU 字节数组。
     * 自动生成 MsgId 并设置 Header Length。
     */
    fun encode(asduJson: String): ByteArray {
        val msgId = nextMsgId()
        val header = Header(length = 0, msgId = msgId) // length will be set by ApduMessage
        val message = ApduMessage(header = header, asdu = asduJson)
        return message.toBytes()
    }

    /**
     * 使用指定 MsgId 编码（用于测试或重发场景）
     */
    fun encodeWithMsgId(asduJson: String, msgId: Int): ByteArray {
        val header = Header(length = 0, msgId = msgId and 0xFFFF)
        val message = ApduMessage(header = header, asdu = asduJson)
        return message.toBytes()
    }
}