package com.njzscloud.common.localizer.jt808.message;

import cn.hutool.core.util.CharsetUtil;
import io.netty.buffer.ByteBuf;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;

/**
 * 终端注册消息
 */
@Slf4j
@Getter
@Setter
@ToString
@Accessors(chain = true)
public class TerminalRegisterMessage {
    /**
     * 标示终端安装车辆所在的省域，0 保留，由平台取默认值。省域
     * ID 采用 GB/T 2260 中规定的行政区划代码六位中前两位
     */
    private int province;
    /**
     * 标示终端安装车辆所在的市域，0 保留，由平台取默认值。市县
     * 域 ID 采用 GB/T 2260 中规定的行政区划代码六位中后四位
     */
    private int city;
    /**
     * 五个字节，终端制造商编号
     */
    private String manufacturerId;
    /**
     * 八个字节，此终端型号由制造商自行定义，位数不足八位的，补
     * 空格,(注:补充说明中要求为 20 字节,不足后补 0x00)
     */
    private String terminalModel;
    /**
     * 七个字节，有大写字母和数字组成，此终端 ID 由制造商自行定义,
     * 位数不足后面补 0x00
     */
    private String terminalId;
    /**
     * 车牌颜色，按照 JT/T 415—2006 中 5.4.12 的规定,未上牌时,取
     * 值为 0
     */
    private byte plateColor;
    /**
     * 公安交通管理部门颁发的机动车号牌
     * (注:补充说明中要求如车牌颜色为 0 时,这里表示车辆 VIN 号)
     */
    private String plate;

    public TerminalRegisterMessage(ByteBuf body) {
        // 读取省域ID（WORD，2字节，大端序）
        this.province = body.readUnsignedShort();

        // 读取市县域ID（WORD，2字节，大端序）
        this.city = body.readUnsignedShort();

        // 读取制造商ID（BYTE[5]，5字节，转为字符串）
        byte[] manufacturerIdBytes = new byte[5];
        body.readBytes(manufacturerIdBytes);
        this.manufacturerId = new String(manufacturerIdBytes).trim();

        // 读取终端型号（BYTE[8]，8字节，转为字符串）
        byte[] terminalModelBytes = new byte[8];
        body.readBytes(terminalModelBytes);
        this.terminalModel = new String(terminalModelBytes).trim();

        // 读取终端ID（BYTE[7]，7字节，转为字符串）
        byte[] terminalIdBytes = new byte[7];
        body.readBytes(terminalIdBytes);
        this.terminalId = new String(terminalIdBytes).trim();

        // 读取车牌颜色（BYTE，1字节）
        this.plateColor = body.readByte();

        // 读取车牌（STRING，剩余字节，转为字符串）
        // 假设剩余所有字节都是车牌内容，实际可根据协议确定长度
        byte[] plateBytes = new byte[body.readableBytes()];
        body.readBytes(plateBytes);
        this.plate = new String(plateBytes, CharsetUtil.CHARSET_GBK);
    }

}
