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

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-2025。固定 10 字节，
 * 比 2016 版多一个坐标系字节：
 * 状态位(1) + 坐标系(1) + 经度(4) + 纬度(4)。
 *
 * <p>坐标系：0x01=WGS84 / 0x02=GCJ-02 / 0x03=其他。
 */
public final class PositionV2025BlockParser implements InfoBlockParser {

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

    @Override
    public InfoBlock parse(ByteBuffer buf) {
        int statusFlag = buf.get() & 0xFF;
        int coordSystem = 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.Gb32960V2025.Position(statusFlag, coordSystem, longitude, latitude);
    }
}
