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

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

import java.nio.ByteBuffer;

/**
 * 车辆位置数据 (0x05) —— GB/T 32960.3-2016 表 22。固定 9 字节：
 * 状态位(1) + 经度(4,1e-6 度) + 纬度(4,1e-6 度)。
 *
 * <p>状态位 bit0 0=有效定位 / bit1 0=北纬 1=南纬 / bit2 0=东经 1=西经。
 */
public final class PositionV2016BlockParser implements InfoBlockParser {

    @Override public ProtocolVersion version() { return ProtocolVersion.V2016; }
    @Override public int typeCode() { return 0x05; }
    @Override public int fixedLength() { return 9; }

    @Override
    public InfoBlock parse(ByteBuffer buf) {
        int statusFlag = buf.get() & 0xFF;
        long lonRaw = buf.getInt() & 0xFFFFFFFFL;
        long latRaw = buf.getInt() & 0xFFFFFFFFL;
        double longitude = lonRaw / 1_000_000.0;
        double latitude = latRaw / 1_000_000.0;
        // 标准用状态位表达南纬/西经；原始经纬度本身始终按正数传输。
        if ((statusFlag & 0b100) != 0) longitude = -longitude;
        if ((statusFlag & 0b010) != 0) latitude = -latitude;
        return new InfoBlock.Gb32960V2016.Position(statusFlag, longitude, latitude);
    }
}
