using System.Text;
namespace langguanApi.Common.Gps
{
    /// 
    /// gps 协议解析器
    /// 
    public class ProtocolParser
    {
        /// 
        /// 解析消息头
        /// 
        /// 
        /// 
        /// 
        public static MessageHeader ParseHeader(byte[] data, ref int offset)
        {
            var header = new MessageHeader
            {
                MessageId = BitConverter.ToUInt16(data, offset),
                MessageBodyProperty = BitConverter.ToUInt16(data, offset + 2),
                TerminalId = Encoding.ASCII.GetString(data, offset + 4, 6),
                MessageSerialNumber = BitConverter.ToUInt16(data, offset + 10)
            };
            offset += 12;
            return header;
        }
        public struct Position
        {
            public double Latitude;
            public double Longitude;
            public double Altitude;
        }
        /// 
        /// 解析位置信息
        /// 
        /// 
        /// 
        public static Position ParsePosition(byte[] data)
        {
            // 根据协议中的位置信息的偏移量和长度进行解析
            int positionOffset = 21; // 位置信息在数据中的偏移量
            int latitudeOffset = positionOffset + 0;
            int longitudeOffset = positionOffset + 8;
            int altitudeOffset = positionOffset + 16;
            double latitude = BitConverter.ToDouble(data, latitudeOffset);
            double longitude = BitConverter.ToDouble(data, longitudeOffset);
            double altitude = BitConverter.ToDouble(data, altitudeOffset);
            return new Position
            {
                Latitude = latitude,
                Longitude = longitude,
                Altitude = altitude
            };
        }
        /// 
        /// 解析终端注册消息
        /// 
        /// 
        /// 
        /// 
        public static TerminalRegisterMessage ParseTerminalRegisterMessage(byte[] data, ref int offset)
        {
            var message = new TerminalRegisterMessage
            {
                ProvinceId = BitConverter.ToUInt16(data, offset),
                CityId = BitConverter.ToUInt16(data, offset + 2),
                ManufacturerId = data.Skip(offset + 4).Take(5).ToArray(),
                TerminalType = data.Skip(offset + 9).Take(8).ToArray(),
                TerminalId = data.Skip(offset + 17).Take(7).ToArray(),
                LicensePlateColor = data[offset + 24],
                LicensePlate = Encoding.ASCII.GetString(data, offset + 25, data.Length - offset - 25)
            };
            offset += 25 + message.LicensePlate.Length;
            return message;
        }
        /// 
        /// 解析位置上报消息
        /// 
        /// 
        /// 
        /// 
        public static LocationReportMessage ParseLocationReportMessage(byte[] data, ref int offset)
        {
            var message = new LocationReportMessage
            {
                AlarmFlag = BitConverter.ToUInt32(data, offset),
                Status = BitConverter.ToUInt32(data, offset + 4),
                Latitude = BitConverter.ToUInt32(data, offset + 8),
                Longitude = BitConverter.ToUInt32(data, offset + 12),
                Altitude = BitConverter.ToUInt16(data, offset + 16),
                Speed = BitConverter.ToUInt16(data, offset + 18),
                Direction = BitConverter.ToUInt16(data, offset + 20),
                Time = DateTime.ParseExact(
                    Encoding.ASCII.GetString(data, offset + 22, 6),
                    "yyMMddHHmmss",
                    null
                )
            };
            offset += 28;
            return message;
        }
    }
}