package model

import (
	"testing"
)

func TestIdentifyTxType(t *testing.T) {
	// 测试数据：24 36 F3 02 96 37 06 01 00 04 00 00 00 04 9C D3 9A 01 88 F5 7E 00 2A 9C F6
	data := []byte{0x24, 0x36, 0xF3, 0x02, 0x96, 0x37, 0x06, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x9C, 0xD3, 0x9A, 0x01, 0x88, 0xF5, 0x7E, 0x00, 0x2A, 0x9C, 0xF6}

	protocol := NewProtocol(data)
	binary, hex, dec := protocol.IdentifyTxType()

	// 预期结果
	expectedBinary := "00100100" // 24 的二进制表示
	expectedHex := "24"          // 第一个字节的十六进制表示
	expectedDec := uint8(36)     // 24 的十进制表示

	// 验证二进制结果
	if binary != expectedBinary {
		t.Errorf("Binary representation incorrect. Got %s, want %s", binary, expectedBinary)
	}

	// 验证十六进制结果
	if hex != expectedHex {
		t.Errorf("Hex representation incorrect. Got %s, want %s", hex, expectedHex)
	}

	// 验证十进制结果
	if dec != expectedDec {
		t.Errorf("Decimal representation incorrect. Got %d, want %d", dec, expectedDec)
	}
}

func TestGetCompleteID(t *testing.T) {
	// 测试数据：24 36 F3 02 96 37 06 01 00 04 00 00 00 04 9C D3 9A 01 88 F5 7E 00 2A 9C F6
	data := []byte{0x24, 0x36, 0xF3, 0x02, 0x96, 0x37, 0x06, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x9C, 0xD3, 0x9A, 0x01, 0x88, 0xF5, 0x7E, 0x00, 0x2A, 0x9C, 0xF6}

	protocol := NewProtocol(data)
	result, err := protocol.GetCompleteID()

	if err != nil {
		t.Fatalf("Unexpected error: %v", err)
	}

	// 测试 HSB (应该是 00)
	expectedHSBBinary := "00000000" // 00 的二进制
	expectedHSBHex := "00"          // 00 的十六进制
	expectedHSBDec := uint8(0)      // 00 的十进制

	if result.HSB.Binary != expectedHSBBinary {
		t.Errorf("HSB Binary incorrect. Got %s, want %s", result.HSB.Binary, expectedHSBBinary)
	}
	if result.HSB.Hex != expectedHSBHex {
		t.Errorf("HSB Hex incorrect. Got %s, want %s", result.HSB.Hex, expectedHSBHex)
	}
	if result.HSB.Dec != expectedHSBDec {
		t.Errorf("HSB Dec incorrect. Got %d, want %d", result.HSB.Dec, expectedHSBDec)
	}

	// 测试 MSB (应该是 2A)
	expectedMSBBinary := "00101010" // 2A 的二进制
	expectedMSBHex := "2A"          // 2A 的十六进制
	expectedMSBDec := uint8(42)     // 2A 的十进制

	if result.MSB.Binary != expectedMSBBinary {
		t.Errorf("MSB Binary incorrect. Got %s, want %s", result.MSB.Binary, expectedMSBBinary)
	}
	if result.MSB.Hex != expectedMSBHex {
		t.Errorf("MSB Hex incorrect. Got %s, want %s", result.MSB.Hex, expectedMSBHex)
	}
	if result.MSB.Dec != expectedMSBDec {
		t.Errorf("MSB Dec incorrect. Got %d, want %d", result.MSB.Dec, expectedMSBDec)
	}

	// 测试 LSB (应该是 36)
	expectedLSBBinary := "00110110" // 36 的二进制
	expectedLSBHex := "36"          // 36 的十六进制
	expectedLSBDec := uint8(54)     // 36 的十进制

	if result.LSB.Binary != expectedLSBBinary {
		t.Errorf("LSB Binary incorrect. Got %s, want %s", result.LSB.Binary, expectedLSBBinary)
	}
	if result.LSB.Hex != expectedLSBHex {
		t.Errorf("LSB Hex incorrect. Got %s, want %s", result.LSB.Hex, expectedLSBHex)
	}
	if result.LSB.Dec != expectedLSBDec {
		t.Errorf("LSB Dec incorrect. Got %d, want %d", result.LSB.Dec, expectedLSBDec)
	}

	// 测试完整的24位ID (应该是 00 2A 36)
	expectedCompleteBinary := "000000000010101000110110" // 完整24位二进制
	expectedCompleteHex := "002A36"                      // 完整24位十六进制
	expectedCompleteDec := uint32(0x002A36)              // 完整24位十进制

	if result.Complete.Binary != expectedCompleteBinary {
		t.Errorf("Complete Binary incorrect. Got %s, want %s", result.Complete.Binary, expectedCompleteBinary)
	}
	if result.Complete.Hex != expectedCompleteHex {
		t.Errorf("Complete Hex incorrect. Got %s, want %s", result.Complete.Hex, expectedCompleteHex)
	}
	if result.Complete.Dec != expectedCompleteDec {
		t.Errorf("Complete Dec incorrect. Got %d, want %d", result.Complete.Dec, expectedCompleteDec)
	}
}

func TestGetWindDirection(t *testing.T) {
	tests := []struct {
		name           string
		data           []byte
		expectedValue  uint16
		expectedValid  bool
		expectedDegree float64
	}{
		{
			name:           "Valid Direction",
			data:           []byte{0x24, 0x36, 0xF3, 0x02, 0x96}, // 原始数据，方向值为243
			expectedValue:  0xF3,
			expectedValid:  true,
			expectedDegree: 243,
		},
		{
			name:           "Invalid Direction",
			data:           []byte{0x24, 0x36, 0xFF, 0x03, 0x96}, // 设置一个大于359的值
			expectedValue:  0x1FF,
			expectedValid:  false,
			expectedDegree: 0,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			protocol := NewProtocol(tt.data)
			result, err := protocol.GetWindDirection()

			if err != nil {
				t.Fatalf("Unexpected error: %v", err)
			}

			if result.Complete.Value != tt.expectedValue {
				t.Errorf("Value incorrect. Got %X, want %X", result.Complete.Value, tt.expectedValue)
			}

			if result.Complete.IsValid != tt.expectedValid {
				t.Errorf("IsValid incorrect. Got %v, want %v", result.Complete.IsValid, tt.expectedValid)
			}

			if result.Complete.Degree != tt.expectedDegree {
				t.Errorf("Degree incorrect. Got %v, want %v", result.Complete.Degree, tt.expectedDegree)
			}
		})
	}
}

func TestGetTemperature(t *testing.T) {
	tests := []struct {
		name          string
		data          []byte
		expectedRaw   uint16
		expectedTemp  float64
		expectedValid bool
	}{
		{
			name: "Temperature 10.5°C",
			// 0x1F9 = 505 -> (505-400)/10 = 10.5
			// TMP_H = 1 (001)
			// TMP_M = F (1111)
			// TMP_L = 9 (1001)
			data:          []byte{0x24, 0x36, 0xF3, 0x20, 0xF9}, // 设置byte3的bit29-31为001，byte4为0xF9
			expectedRaw:   0x1F9,
			expectedTemp:  10.5,
			expectedValid: true,
		},
		{
			name: "Temperature -10.5°C",
			// 0x127 = 295 -> (295-400)/10 = -10.5
			// TMP_H = 1 (001)
			// TMP_M = 2 (0010)
			// TMP_L = 7 (0111)
			data:          []byte{0x24, 0x36, 0xF3, 0x20, 0x27}, // 设置byte3的bit29-31为001，byte4为0x27
			expectedRaw:   0x127,
			expectedTemp:  -10.5,
			expectedValid: true,
		},
		{
			name: "Invalid Temperature",
			// 0x7FF = 2047 (超出范围)
			// TMP_H = 7 (111)
			// TMP_M = F (1111)
			// TMP_L = F (1111)
			data:          []byte{0x24, 0x36, 0xF3, 0xE0, 0xFF}, // 设置byte3的bit29-31为111，byte4为0xFF
			expectedRaw:   0x7FF,
			expectedTemp:  0,
			expectedValid: false,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			protocol := NewProtocol(tt.data)
			result, err := protocol.GetTemperature()

			if err != nil {
				t.Fatalf("Unexpected error: %v", err)
			}

			if result.Complete.RawValue != tt.expectedRaw {
				t.Errorf("Raw value incorrect. Got %X, want %X", result.Complete.RawValue, tt.expectedRaw)
			}

			if result.Complete.Value != tt.expectedTemp {
				t.Errorf("Temperature value incorrect. Got %.1f, want %.1f", result.Complete.Value, tt.expectedTemp)
			}

			if result.Complete.IsValid != tt.expectedValid {
				t.Errorf("Validity incorrect. Got %v, want %v", result.Complete.IsValid, tt.expectedValid)
			}
		})
	}
}

func TestGetHumidity(t *testing.T) {
	tests := []struct {
		name          string
		data          []byte
		expectedRaw   uint8
		expectedValue uint8
		expectedValid bool
	}{
		{
			name: "Valid Humidity 55%",
			// 0x37 = 3*16 + 7 = 55%
			data:          []byte{0x24, 0x36, 0xF3, 0x02, 0x96, 0x37},
			expectedRaw:   0x37,
			expectedValue: 55,
			expectedValid: true,
		},
		{
			name: "Valid Humidity 1%",
			// 0x01 = 0*16 + 1 = 1%
			data:          []byte{0x24, 0x36, 0xF3, 0x02, 0x96, 0x01},
			expectedRaw:   0x01,
			expectedValue: 1,
			expectedValid: true,
		},
		{
			name: "Valid Humidity 99%",
			// 0x63 = 6*16 + 3 = 99%
			data:          []byte{0x24, 0x36, 0xF3, 0x02, 0x96, 0x63},
			expectedRaw:   0x63,
			expectedValue: 99,
			expectedValid: true,
		},
		{
			name: "Invalid Humidity (Too High)",
			// 0x64 = 6*16 + 4 = 100% (无效)
			data:          []byte{0x24, 0x36, 0xF3, 0x02, 0x96, 0x64},
			expectedRaw:   0xFF,
			expectedValue: 0,
			expectedValid: false,
		},
		{
			name: "Invalid Humidity (Zero)",
			// 0x00 = 0% (无效)
			data:          []byte{0x24, 0x36, 0xF3, 0x02, 0x96, 0x00},
			expectedRaw:   0xFF,
			expectedValue: 0,
			expectedValid: false,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			protocol := NewProtocol(tt.data)
			result, err := protocol.GetHumidity()

			if err != nil {
				t.Fatalf("Unexpected error: %v", err)
			}

			if result.Complete.RawValue != tt.expectedRaw {
				t.Errorf("Raw value incorrect. Got %X, want %X", result.Complete.RawValue, tt.expectedRaw)
			}

			if result.Complete.Value != tt.expectedValue {
				t.Errorf("Humidity value incorrect. Got %d%%, want %d%%", result.Complete.Value, tt.expectedValue)
			}

			if result.Complete.IsValid != tt.expectedValid {
				t.Errorf("Validity incorrect. Got %v, want %v", result.Complete.IsValid, tt.expectedValid)
			}
		})
	}
}

func TestGetWindSpeed(t *testing.T) {
	// 测试数据：24 36 F3 02 96 37 06 01 00 04 00 00 00 04 9C D3 9A 01 88 F5 7E 00 2A 9C F6
	data := []byte{0x24, 0x36, 0xF3, 0x02, 0x96, 0x37, 0x06, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x9C, 0xD3, 0x9A, 0x01, 0x88, 0xF5, 0x7E, 0x00, 0x2A, 0x9C, 0xF6}

	protocol := NewProtocol(data)
	result, err := protocol.GetWindSpeed()

	if err != nil {
		t.Fatalf("Unexpected error: %v", err)
	}

	// 验证 WSP_FLAG (bit 25)
	if !result.WspFlag.Value {
		t.Error("WSP_FLAG should be 1")
	}

	// 验证 WIND_H 和 WIND_L
	if result.WspH.Value != 0x0 {
		t.Errorf("WIND_H incorrect. Got %X, want 0", result.WspH.Value)
	}
	if result.WspL.Value != 0x6 {
		t.Errorf("WIND_L incorrect. Got %X, want 6", result.WspL.Value)
	}

	// 验证完整值（9bit模式：000 + bit27 + WIND_H + WIND_L）
	expectedRaw := uint16(0x006)
	if result.Complete.RawValue != expectedRaw {
		t.Errorf("Raw value incorrect. Got %X, want %X", result.Complete.RawValue, expectedRaw)
	}

	// 验证实际风速值：6/8*0.51 = 0.38250 m/s
	expectedValue := float64(0x006) / 8.0 * 0.51
	if result.Complete.Value != expectedValue {
		t.Errorf("Wind speed value incorrect. Got %.5f m/s, want %.5f m/s",
			result.Complete.Value, expectedValue)
	}
}

func TestGetGustSpeed(t *testing.T) {
	// 测试数据：24 36 F3 02 96 37 06 01 00 04 00 00 00 04 9C D3 9A 01 88 F5 7E 00 2A 9C F6
	data := []byte{0x24, 0x36, 0xF3, 0x02, 0x96, 0x37, 0x06, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x9C, 0xD3, 0x9A, 0x01, 0x88, 0xF5, 0x7E, 0x00, 0x2A, 0x9C, 0xF6}

	protocol := NewProtocol(data)
	result, err := protocol.GetGustSpeed()

	if err != nil {
		t.Fatalf("Unexpected error: %v", err)
	}

	// 验证 GUST_H (0x0)
	expectedGustHBinary := "0000"
	if result.GustH.Binary != expectedGustHBinary {
		t.Errorf("GUST_H Binary incorrect. Got %s, want %s", result.GustH.Binary, expectedGustHBinary)
	}
	if result.GustH.Value != 0x0 {
		t.Errorf("GUST_H Value incorrect. Got %X, want 0", result.GustH.Value)
	}

	// 验证 GUST_L (0x1)
	expectedGustLBinary := "0001"
	if result.GustL.Binary != expectedGustLBinary {
		t.Errorf("GUST_L Binary incorrect. Got %s, want %s", result.GustL.Binary, expectedGustLBinary)
	}
	if result.GustL.Value != 0x1 {
		t.Errorf("GUST_L Value incorrect. Got %X, want 1", result.GustL.Value)
	}

	// 验证完整值
	expectedBinary := "00000001" // 0x01
	if result.Complete.Binary != expectedBinary {
		t.Errorf("Complete Binary incorrect. Got %s, want %s", result.Complete.Binary, expectedBinary)
	}
	if result.Complete.RawValue != 0x01 {
		t.Errorf("Raw value incorrect. Got %X, want 01", result.Complete.RawValue)
	}

	// 验证实际阵风速度值：0x01 = 1, 1*0.51 = 0.51 m/s
	expectedValue := float64(0x01) * 0.51
	if result.Complete.Value != expectedValue {
		t.Errorf("Gust speed value incorrect. Got %.5f m/s, want %.5f m/s", result.Complete.Value, expectedValue)
	}
}

func TestGetRainfall(t *testing.T) {
	// 测试数据：24 36 F3 02 96 37 06 01 00 04 00 00 00 04 9C D3 9A 01 88 F5 7E 00 2A 9C F6
	data := []byte{0x24, 0x36, 0xF3, 0x02, 0x96, 0x37, 0x06, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x9C, 0xD3, 0x9A, 0x01, 0x88, 0xF5, 0x7E, 0x00, 0x2A, 0x9C, 0xF6}

	protocol := NewProtocol(data)
	result, err := protocol.GetRainfall()

	if err != nil {
		t.Fatalf("Unexpected error: %v", err)
	}

	// 验证 RAIN_HH (0x0)
	expectedRainHHBinary := "0000"
	if result.RainHH.Binary != expectedRainHHBinary {
		t.Errorf("RAIN_HH Binary incorrect. Got %s, want %s", result.RainHH.Binary, expectedRainHHBinary)
	}
	if result.RainHH.Value != 0x0 {
		t.Errorf("RAIN_HH Value incorrect. Got %X, want 0", result.RainHH.Value)
	}

	// 验证 RAIN_HL (0x0)
	expectedRainHLBinary := "0000"
	if result.RainHL.Binary != expectedRainHLBinary {
		t.Errorf("RAIN_HL Binary incorrect. Got %s, want %s", result.RainHL.Binary, expectedRainHLBinary)
	}
	if result.RainHL.Value != 0x0 {
		t.Errorf("RAIN_HL Value incorrect. Got %X, want 0", result.RainHL.Value)
	}

	// 验证 RAIN_LH (0x0)
	expectedRainLHBinary := "0000"
	if result.RainLH.Binary != expectedRainLHBinary {
		t.Errorf("RAIN_LH Binary incorrect. Got %s, want %s", result.RainLH.Binary, expectedRainLHBinary)
	}
	if result.RainLH.Value != 0x0 {
		t.Errorf("RAIN_LH Value incorrect. Got %X, want 0", result.RainLH.Value)
	}

	// 验证 RAIN_LL (0x4)
	expectedRainLLBinary := "0100"
	if result.RainLL.Binary != expectedRainLLBinary {
		t.Errorf("RAIN_LL Binary incorrect. Got %s, want %s", result.RainLL.Binary, expectedRainLLBinary)
	}
	if result.RainLL.Value != 0x4 {
		t.Errorf("RAIN_LL Value incorrect. Got %X, want 4", result.RainLL.Value)
	}

	// 验证完整值
	expectedBinary := "0000000000000100" // 0x0004
	if result.Complete.Binary != expectedBinary {
		t.Errorf("Complete Binary incorrect. Got %s, want %s", result.Complete.Binary, expectedBinary)
	}
	if result.Complete.RawValue != 0x0004 {
		t.Errorf("Raw value incorrect. Got %X, want 0004", result.Complete.RawValue)
	}

	// 验证实际降雨量值：0x0004 = 4, 4*0.254 = 1.016 mm
	expectedValue := float64(0x0004) * 0.254
	if result.Complete.Value != expectedValue {
		t.Errorf("Rainfall value incorrect. Got %.3f mm, want %.3f mm", result.Complete.Value, expectedValue)
	}
}

func TestGetUVIndex(t *testing.T) {
	tests := []struct {
		name          string
		data          []byte
		expectedRaw   uint16
		expectedValue float64
		expectedValid bool
	}{
		{
			name: "Valid UV Index",
			// 测试数据：24 36 F3 02 96 37 06 01 00 04 00 00 00 04 9C D3 9A 01 88 F5 7E 00 2A 9C F6
			data:          []byte{0x24, 0x36, 0xF3, 0x02, 0x96, 0x37, 0x06, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x9C, 0xD3, 0x9A, 0x01, 0x88, 0xF5, 0x7E, 0x00, 0x2A, 0x9C, 0xF6},
			expectedRaw:   0x0000, // byte10=0x00, byte11=0x00
			expectedValue: 0,      // 0 uW/c㎡
			expectedValid: true,
		},
		{
			name:          "Invalid UV Index (Too High)",
			data:          []byte{0x24, 0x36, 0xF3, 0x02, 0x96, 0x37, 0x06, 0x01, 0x00, 0x04, 0xFF, 0xFF}, // 设置一个超出范围的值
			expectedRaw:   0xFFFF,                                                                         // 无效值
			expectedValue: 0,                                                                              // 无效时返回0
			expectedValid: false,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			protocol := NewProtocol(tt.data)
			result, err := protocol.GetUVIndex()

			if err != nil {
				t.Fatalf("Unexpected error: %v", err)
			}

			if result.Complete.RawValue != tt.expectedRaw {
				t.Errorf("Raw value incorrect. Got %X, want %X", result.Complete.RawValue, tt.expectedRaw)
			}

			if result.Complete.Value != tt.expectedValue {
				t.Errorf("UV Index value incorrect. Got %.1f uW/c㎡, want %.1f uW/c㎡",
					result.Complete.Value, tt.expectedValue)
			}

			if result.Complete.IsValid != tt.expectedValid {
				t.Errorf("Validity incorrect. Got %v, want %v", result.Complete.IsValid, tt.expectedValid)
			}
		})
	}
}

func TestGetLight(t *testing.T) {
	// 测试数据：24 36 F3 02 96 37 06 01 00 04 00 00 00 04 9C D3 9A 01 88 F5 7E 00 2A 9C F6
	data := []byte{0x24, 0x36, 0xF3, 0x02, 0x96, 0x37, 0x06, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x9C, 0xD3, 0x9A, 0x01, 0x88, 0xF5, 0x7E, 0x00, 0x2A, 0x9C, 0xF6}

	protocol := NewProtocol(data)
	result, err := protocol.GetLight()

	if err != nil {
		t.Fatalf("Unexpected error: %v", err)
	}

	// 验证原始值 (byte13-15: 00 04 9C)
	expectedRaw := uint32(0x00049C)
	if result.Complete.RawValue != expectedRaw {
		t.Errorf("Raw value incorrect. Got %X, want %X", result.Complete.RawValue, expectedRaw)
	}

	// 验证实际光照值：0x00049C = 1180, 1180/10 = 118.0 lux
	expectedValue := float64(0x00049C) / 10.0
	if result.Complete.Value != expectedValue {
		t.Errorf("Light value incorrect. Got %.1f lux, want %.1f lux",
			result.Complete.Value, expectedValue)
	}

	if !result.Complete.IsValid {
		t.Error("Light value should be valid")
	}
}

func TestGetPressure(t *testing.T) {
	// 测试数据：24 36 F3 02 96 37 06 01 00 04 00 00 00 04 9C D3 9A 01 88 F5 7E 00 2A 9C F6
	data := []byte{0x24, 0x36, 0xF3, 0x02, 0x96, 0x37, 0x06, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x9C, 0xD3, 0x9A, 0x01, 0x88, 0xF5, 0x7E, 0x00, 0x2A, 0x9C, 0xF6}

	protocol := NewProtocol(data)
	result, err := protocol.GetPressure()

	if err != nil {
		t.Fatalf("Unexpected error: %v", err)
	}

	// 验证原始值 (01 88 F5)
	expectedRaw := uint32(0x0188F5)
	if result.Complete.RawValue != expectedRaw {
		t.Errorf("Raw value incorrect. Got %X, want %X", result.Complete.RawValue, expectedRaw)
	}

	// 验证实际气压值：0x0188F5 = 100597, 100597/100 = 1005.97 hPa
	expectedValue := float64(0x0188F5) / 100.0
	if result.Complete.Value != expectedValue {
		t.Errorf("Pressure value incorrect. Got %.2f hPa, want %.2f hPa",
			result.Complete.Value, expectedValue)
	}

	if !result.Complete.IsValid {
		t.Error("Pressure value should be valid")
	}
}

func TestParseNewData(t *testing.T) {
	// 新的测试数据：24 F2 30 02 AF 51 03 01 00 08 00 00 00 00 00 6E C2 01 82 D8 5B 00 29 87 EA
	//data := []byte{0x24, 0xF2, 0x30, 0x02, 0xAF, 0x51, 0x03, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xC2, 0x01, 0x82, 0xD8, 0x5B, 0x00, 0x29, 0x87, 0xEA}
	data := []byte{0x24, 0xF2, 0x10, 0x02, 0xC7, 0x48, 0x10, 0x03, 0x00, 0x6A, 0x03, 0xE8, 0x05, 0xF5, 0x96, 0x10, 0x3F, 0x01, 0x83, 0x2D, 0xB1, 0x00, 0x29, 0x9B, 0xA4}
	protocol := NewProtocol(data)

	// 1. 解析风速
	windSpeed, err := protocol.GetWindSpeed()
	if err != nil {
		t.Fatalf("Failed to parse wind speed: %v", err)
	}
	t.Logf("Wind Speed: %.5f m/s (raw: 0x%X)", windSpeed.Complete.Value, windSpeed.Complete.RawValue)

	// 2. 解析阵风速度
	gustSpeed, err := protocol.GetGustSpeed()
	if err != nil {
		t.Fatalf("Failed to parse gust speed: %v", err)
	}
	t.Logf("Gust Speed: %.5f m/s (raw: 0x%X)", gustSpeed.Complete.Value, gustSpeed.Complete.RawValue)

	// 3. 解析温度
	temp, err := protocol.GetTemperature()
	if err != nil {
		t.Fatalf("Failed to parse temperature: %v", err)
	}
	t.Logf("Temperature: %.2f °C (raw: 0x%X)", temp.Complete.Value, temp.Complete.RawValue)

	// 4. 解析湿度
	humidity, err := protocol.GetHumidity()
	if err != nil {
		t.Fatalf("Failed to parse humidity: %v", err)
	}
	t.Logf("Humidity: %d%% (raw: 0x%X)", humidity.Complete.Value, humidity.Complete.RawValue)

	// 5. 解析光照
	light, err := protocol.GetLight()
	if err != nil {
		t.Fatalf("Failed to parse light: %v", err)
	}
	t.Logf("Light: %.1f lux (raw: 0x%X)", light.Complete.Value, light.Complete.RawValue)

	// 6. 解析大气压
	pressure, err := protocol.GetPressure()
	if err != nil {
		t.Fatalf("Failed to parse pressure: %v", err)
	}
	t.Logf("Pressure: %.2f hPa (raw: 0x%X)", pressure.Complete.Value, pressure.Complete.RawValue)

	// 7. 解析UV指数
	uv, err := protocol.GetUVIndex()
	if err != nil {
		t.Fatalf("Failed to parse UV index: %v", err)
	}
	t.Logf("UV Index: %.1f uW/c㎡ (raw: 0x%X)", uv.Complete.Value, uv.Complete.RawValue)

	// 8. 解析降雨量
	rainfall, err := protocol.GetRainfall()
	if err != nil {
		t.Fatalf("Failed to parse rainfall: %v", err)
	}
	t.Logf("Rainfall: %.3f mm (raw: 0x%X)", rainfall.Complete.Value, rainfall.Complete.RawValue)
}

func TestParseNewDataWithDetails(t *testing.T) {
	// 新的测试数据：24 F2 09 02 BA 4F 13 03 00 6A 02 33 04 13 5C AC FE 01 83 93 17 00 29 35 88
	//data := []byte{0x24, 0xF2, 0x09, 0x02, 0xBA, 0x4F, 0x13, 0x03, 0x00, 0x6A, 0x02, 0x33, 0x04, 0x13, 0x5C, 0xAC, 0xFE, 0x01, 0x83, 0x93, 0x17, 0x00, 0x29, 0x35, 0x88}
	data := []byte{0x24, 0x36, 0xF3, 0x02, 0x96, 0x37, 0x06, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x9C, 0xD3, 0x9A, 0x01, 0x88, 0xF5, 0x7E, 0x00, 0x2A, 0x9C, 0xF6}
	protocol := NewProtocol(data)

	// 1. 风速解析
	t.Log("\n=== 风速解析 ===")
	windSpeed, _ := protocol.GetWindSpeed()
	t.Logf("风速: %.5f m/s (raw: 0x%X)", windSpeed.Complete.Value, windSpeed.Complete.RawValue)
	t.Logf("WSP_H: %s (0x%X), WSP_L: %s (0x%X)",
		windSpeed.WspH.Binary, windSpeed.WspH.Value,
		windSpeed.WspL.Binary, windSpeed.WspL.Value)
	if windSpeed.Extend.Value != 0 {
		t.Logf("WIND_Extend: %s (0x%X)", windSpeed.Extend.Binary, windSpeed.Extend.Value)
	}

	// 2. 温度解析
	t.Log("\n=== 温度解析 ===")
	temp, _ := protocol.GetTemperature()
	t.Logf("温度: %.2f °C (raw: 0x%X)", temp.Complete.Value, temp.Complete.RawValue)
	t.Logf("TMP_H: %s (0x%X), TMP_M: %s (0x%X), TMP_L: %s (0x%X)",
		temp.TmpH.Binary, temp.TmpH.Value,
		temp.TmpM.Binary, temp.TmpM.Value,
		temp.TmpL.Binary, temp.TmpL.Value)

	// 3. 湿度解析
	t.Log("\n=== 湿度解析 ===")
	humidity, _ := protocol.GetHumidity()
	t.Logf("湿度: %d%% (raw: 0x%X)", humidity.Complete.Value, humidity.Complete.RawValue)
	t.Logf("HM_H: %s (0x%X), HM_L: %s (0x%X)",
		humidity.HmH.Binary, humidity.HmH.Value,
		humidity.HmL.Binary, humidity.HmL.Value)

	// 4. 光照解析
	t.Log("\n=== 光照解析 ===")
	light, _ := protocol.GetLight()
	t.Logf("光照: %.1f lux (raw: 0x%X)", light.Complete.Value, light.Complete.RawValue)
	t.Logf("原始字节: %02X %02X %02X", data[12], data[13], data[14])

	// 5. 大气压解析
	t.Log("\n=== 大气压解析 ===")
	pressure, _ := protocol.GetPressure()
	t.Logf("大气压: %.2f hPa (raw: 0x%X)", pressure.Complete.Value, pressure.Complete.RawValue)
	t.Logf("原始字节: %02X %02X %02X", data[17], data[18], data[19])

	// 6. UV指数解析
	t.Log("\n=== UV指数解析 ===")
	uv, _ := protocol.GetUVIndex()
	t.Logf("UV指数: %.1f uW/c㎡ (raw: 0x%X)", uv.Complete.Value, uv.Complete.RawValue)
	t.Logf("原始字节: %02X %02X", data[10], data[11])

	// 7. 降雨量解析
	t.Log("\n=== 降雨量解析 ===")
	rainfall, _ := protocol.GetRainfall()
	t.Logf("降雨量: %.3f mm (raw: 0x%X)", rainfall.Complete.Value, rainfall.Complete.RawValue)
	t.Logf("原始字节: %02X %02X", data[8], data[9])

	// 8. 阵风速度解析
	t.Log("\n=== 阵风速度解析 ===")
	gust, _ := protocol.GetGustSpeed()
	t.Logf("阵风速度: %.2f m/s (raw: 0x%X)", gust.Complete.Value, gust.Complete.RawValue)
	t.Logf("原始字节: %02X", data[7])

	// 9. 风向解析
	t.Log("\n=== 风向解析 ===")
	windDir, _ := protocol.GetWindDirection()
	t.Logf("风向: %.1f° (raw: 0x%X)", windDir.Complete.Degree, windDir.Complete.Value)
	t.Logf("原始字节: %02X %02X", data[2], data[3])

	// 10. 设备ID解析
	t.Log("\n=== 设备ID解析 ===")
	id, _ := protocol.GetCompleteID()
	t.Logf("设备ID: %02X %02X %02X", id.HSB.Dec, id.MSB.Dec, id.LSB.Dec)
	t.Logf("原始字节: HSB=%02X, MSB=%02X, LSB=%02X", data[21], data[22], data[1])
}

func TestParseSpecificData(t *testing.T) {
	// 测试数据：24 F2 10 02 C7 48 10 03 00 6A 03 E8 05 F5 96 10 3F 01 83 2D B1 00 29 9B A4
	data := []byte{0x24, 0xF2, 0x10, 0x02, 0xC7, 0x48, 0x10, 0x03, 0x00, 0x6A, 0x03, 0xE8, 0x05, 0xF5, 0x96, 0x10, 0x3F, 0x01, 0x83, 0x2D, 0xB1, 0x00, 0x29, 0x9B, 0xA4}

	protocol := NewProtocol(data)

	t.Log("\n=== 特定数据解析测试 ===")

	// 1. 设备ID解析
	t.Log("\n=== 设备ID解析 ===")
	id, err := protocol.GetCompleteID()
	if err != nil {
		t.Fatalf("获取设备ID失败: %v", err)
	}
	t.Logf("设备ID: %s", id.Complete.Hex)
	t.Logf("原始字节: HSB=%02X, MSB=%02X, LSB=%02X", data[21], data[22], data[1])

	// 2. 温度解析
	t.Log("\n=== 温度解析 ===")
	temp, err := protocol.GetTemperature()
	if err != nil {
		t.Fatalf("获取温度失败: %v", err)
	}
	t.Logf("温度: %.2f °C (raw: 0x%X)", temp.Complete.Value, temp.Complete.RawValue)
	t.Logf("TMP_H: %s (0x%X), TMP_M: %s (0x%X), TMP_L: %s (0x%X)",
		temp.TmpH.Binary, temp.TmpH.Value,
		temp.TmpM.Binary, temp.TmpM.Value,
		temp.TmpL.Binary, temp.TmpL.Value)

	// 3. 湿度解析
	t.Log("\n=== 湿度解析 ===")
	humidity, err := protocol.GetHumidity()
	if err != nil {
		t.Fatalf("获取湿度失败: %v", err)
	}
	t.Logf("湿度: %d%% (raw: 0x%X)", humidity.Complete.Value, humidity.Complete.RawValue)
	t.Logf("HM_H: %s (0x%X), HM_L: %s (0x%X)",
		humidity.HmH.Binary, humidity.HmH.Value,
		humidity.HmL.Binary, humidity.HmL.Value)

	// 4. 风速解析
	t.Log("\n=== 风速解析 ===")
	windSpeed, err := protocol.GetWindSpeed()
	if err != nil {
		t.Fatalf("获取风速失败: %v", err)
	}
	t.Logf("风速: %.5f m/s (raw: 0x%X)", windSpeed.Complete.Value, windSpeed.Complete.RawValue)
	t.Logf("WSP_FLAG: %v", windSpeed.WspFlag.Value)
	t.Logf("WSP_H: %s (0x%X), WSP_L: %s (0x%X)",
		windSpeed.WspH.Binary, windSpeed.WspH.Value,
		windSpeed.WspL.Binary, windSpeed.WspL.Value)

	// 5. 风向解析
	t.Log("\n=== 风向解析 ===")
	windDir, err := protocol.GetWindDirection()
	if err != nil {
		t.Fatalf("获取风向失败: %v", err)
	}
	t.Logf("风向: %.1f° (raw: 0x%X)", windDir.Complete.Degree, windDir.Complete.Value)
	t.Logf("DirH: %s (0x%X), DirM: %s (0x%X), DirL: %s (0x%X)",
		windDir.DirH.Binary, windDir.DirH.Value,
		windDir.DirM.Binary, windDir.DirM.Value,
		windDir.DirL.Binary, windDir.DirL.Value)

	// 6. 降雨量解析
	t.Log("\n=== 降雨量解析 ===")
	rainfall, err := protocol.GetRainfall()
	if err != nil {
		t.Fatalf("获取降雨量失败: %v", err)
	}
	t.Logf("降雨量: %.3f mm (raw: 0x%X)", rainfall.Complete.Value, rainfall.Complete.RawValue)
	t.Logf("原始字节: %02X %02X", data[8], data[9])

	// 7. 光照解析
	t.Log("\n=== 光照解析 ===")
	light, err := protocol.GetLight()
	if err != nil {
		t.Fatalf("获取光照失败: %v", err)
	}
	t.Logf("光照: %.1f lux (raw: 0x%X)", light.Complete.Value, light.Complete.RawValue)
	t.Logf("原始字节: %02X %02X %02X", data[12], data[13], data[14])

	// 8. UV指数解析
	t.Log("\n=== UV指数解析 ===")
	uv, err := protocol.GetUVIndex()
	if err != nil {
		t.Fatalf("获取UV指数失败: %v", err)
	}
	t.Logf("UV指数: %.1f uW/c㎡ (raw: 0x%X)", uv.Complete.Value, uv.Complete.RawValue)
	t.Logf("原始字节: %02X %02X", data[10], data[11])

	// 9. 气压解析
	t.Log("\n=== 气压解析 ===")
	pressure, err := protocol.GetPressure()
	if err != nil {
		t.Fatalf("获取气压失败: %v", err)
	}
	t.Logf("气压: %.2f hPa (raw: 0x%X)", pressure.Complete.Value, pressure.Complete.RawValue)
	t.Logf("原始字节: %02X %02X %02X", data[17], data[18], data[19])

	// 10. 阵风速度解析
	t.Log("\n=== 阵风速度解析 ===")
	gust, err := protocol.GetGustSpeed()
	if err != nil {
		t.Fatalf("获取阵风速度失败: %v", err)
	}
	t.Logf("阵风速度: %.2f m/s (raw: 0x%X)", gust.Complete.Value, gust.Complete.RawValue)
	t.Logf("原始字节: %02X", data[7])

	// 11. 创建RS485协议解析器并解析数据
	t.Log("\n=== RS485协议解析 ===")
	rs485Protocol := NewRS485Protocol(data)
	rs485Data, err := rs485Protocol.ParseRS485Data()
	if err != nil {
		t.Fatalf("RS485数据解析失败: %v", err)
	}

	t.Logf("温度: %.2f°C", rs485Data.Temperature)
	t.Logf("湿度: %.1f%%", rs485Data.Humidity)
	t.Logf("风速: %.2f m/s", rs485Data.WindSpeed)
	t.Logf("风向: %.1f°", rs485Data.WindDirection)
	t.Logf("降雨量: %.3f mm", rs485Data.Rainfall)
	t.Logf("光照: %.1f lux", rs485Data.Light)
	t.Logf("紫外线: %.1f", rs485Data.UV)
	t.Logf("气压: %.2f hPa", rs485Data.Pressure)
}
