package net.northking.cctp.upperComputer.driver.ios.packet;

/**
 * 指令数据包
 * <br>
 * 用于处理发送和接收
 */
public interface ICommandPacket {
    /**
     * 指令ID，应为常量
     *
     * @return 指令ID
     */
    int commandId();

    /**
     * 获得请求ID
     *
     * @return 请求ID
     */
    int getRequestId();

    /**
     * 设置请求ID
     * <br>
     * 仅在发送和接收时调用
     *
     * @param id 请求ID
     */
    void setRequestId(int id);

    /**
     * 获得指令携带的数据
     *
     * @return 指令携带数据
     */
    byte[] getCarryingData();

    /**
     * 设置指令携带的数据
     *
     * @param data 指令携带的数据
     */
    void setCarryingData(byte[] data);

    /**
     * 创建指令的回复指令
     *
     * @param carryingData 回复的数据
     * @return 新的指令对象
     */
    ICommandPacket createResponse(byte[] carryingData);

    /**
     * 将此CommandPacket编码为ByteArray
     *
     * @return 此CommandPacket编码为的ByteArray
     */
    byte[] toByteArray();

    /**
     * 将数据填充至ICommandData对象
     *
     * @param commandData 要填充的对象
     * @param <T>         ICommandData的具体实现类型
     * @return 是否填充成功
     */
    <T extends ICommandData> boolean fillICommandData(T commandData);
}
