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

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

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 双键策略注册中心：按 {@code (ProtocolVersion, typeCode)} 索引解析器。
 *
 * <p>同一 typeCode 在 2016 / 2025 版本可能语义不同（如 0x07 在 2016 是报警，在 2025 是
 * 动力蓄电池最小并联单元电压），必须按版本分派。
 */
public final class InfoBlockParserRegistry {

    private final Map<Key, InfoBlockParser> parsers = new HashMap<>();

    public InfoBlockParserRegistry(List<InfoBlockParser> list) {
        for (InfoBlockParser p : list) {
            // 后注册覆盖前注册：vendor profile 可以用同一 typeCode 替换默认解析器。
            parsers.put(new Key(p.version(), p.typeCode()), p);
        }
    }

    public InfoBlockParser find(ProtocolVersion version, int typeCode) {
        return parsers.get(new Key(version, typeCode));
    }

    public int size() {
        return parsers.size();
    }

    private record Key(ProtocolVersion version, int typeCode) {}
}
