package com.lingniu.ingest.protocol.gb32960.codec;

import com.lingniu.ingest.protocol.gb32960.model.InfoBlock;
import com.lingniu.ingest.protocol.gb32960.model.ProtocolVersion;

import java.nio.ByteBuffer;

/**
 * 单一信息体解析器 SPI。
 *
 * <p>替代旧代码里 2500 行 {@code informationReporting()} 巨方法。每个
 * {@code (ProtocolVersion, typeCode)} 组合对应一个独立实现。同一个协议 typeCode
 * 在 2016 / 2025 可能语义不同（如 0x07），因此需要两个 Parser 分别声明 version。
 *
 * <p>实现约定：
 * <ul>
 *   <li>{@link #parse(ByteBuffer)} 被调用时 buffer 的 position 已指向信息体第一个字节（不含 1 字节类型前缀）
 *   <li>解析完成后 position 应恰好移动到信息体末尾
 *   <li>实现应无状态，可被单例复用
 * </ul>
 */
public interface InfoBlockParser {

    /** 本 Parser 适用的协议版本（{@link ProtocolVersion#V2016} 或 {@link ProtocolVersion#V2025}）。 */
    ProtocolVersion version();

    /** 本 Parser 对应的协议信息类型标志字节（表 9）。 */
    int typeCode();

    /** 信息体固定长度；变长类型返回 -1 并自行在 parse 中读取长度字段。 */
    int fixedLength();

    InfoBlock parse(ByteBuffer buffer);
}
