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

/**
 * 命令标识。GB/T 32960.3-2025 表 3 和附录 B 表 B.2 "命令标识定义"。
 *
 * <p>命令标识是发起方的唯一标识，区分数据传输的方向与种类。
 *
 * <p>方向约定：
 * <ul>
 *   <li>上行：车载终端 → 远程服务与管理平台
 *   <li>下行：远程服务与管理平台 → 车载终端
 *   <li>上行/下行：双向使用
 * </ul>
 */
public enum CommandType {
    /** 0x01：车辆登入（上行）—— 见表 6。 */
    VEHICLE_LOGIN(0x01),
    /** 0x02：实时信息上报（上行）—— 见表 7。 */
    REALTIME_REPORT(0x02),
    /** 0x03：补发信息上报（上行）—— 数据格式与实时上报一致，用于通信链路恢复后补发 7d 内存储的数据。 */
    RESEND_REPORT(0x03),
    /** 0x04：车辆登出（上行）—— 见表 28。 */
    VEHICLE_LOGOUT(0x04),
    /** 0x05：平台登入（上行）—— 见表 29；2025 版附录 B.2 中 0x05/0x06 改为"平台传输数据占用，自定义"。 */
    PLATFORM_LOGIN(0x05),
    /** 0x06：平台登出（上行）—— 见表 30。 */
    PLATFORM_LOGOUT(0x06),
    /** 0x07：心跳（上行）—— 数据单元为空，见 B.3.5.10。 */
    HEARTBEAT(0x07),
    /** 0x08：终端校时（上行）—— 信息标志及信息体为空，见 B.3.5.11。 */
    TIME_CALIBRATION(0x08),
    /** 0x09：激活（上行）—— 见表 B.3。 */
    ACTIVATION(0x09),
    /** 0x0A：激活应答（下行）—— 见表 B.4。 */
    ACTIVATION_RESPONSE(0x0A),
    /** 0x0B：数据单元加密密钥交换（上行/下行）—— 见表 31。 */
    KEY_EXCHANGE(0x0B),
    /** 0x80：查询命令（下行）—— 见表 B.5 ~ B.8。 */
    QUERY(0x80),
    /** 0x81：设置命令（下行）—— 见表 B.9。 */
    SET_PARAMS(0x81),
    /** 0x82：车载终端控制命令（下行）—— 见表 B.10 ~ B.13。 */
    TERMINAL_CONTROL(0x82);

    private final int code;

    CommandType(int code) {
        this.code = code;
    }

    public int code() {
        return code;
    }

    /** 按协议编码查找命令类型；未识别时抛异常以便 DLQ 路由。 */
    public static CommandType of(int code) {
        for (CommandType c : values()) if (c.code == code) return c;
        throw new IllegalArgumentException("unknown gb32960 command: 0x" + Integer.toHexString(code));
    }
}
