package main

import (
	"fmt"
	"regexp"
	"strconv"
	"strings"
)

// parseData 使用正则表达式解析传感器数据，支持新格式 #{1602301014-01,1,1,28.4,-6.884,1.540}!
func parseData(data string) (int, float64, float64, float64, float64, error) {
	// 尝试解析新格式: #{1602301014-01,1,1,28.4,-6.884,1.540}!
	newPattern := regexp.MustCompile(`#\{[^,]+-(\d+),\d+,(\d+),([-]?\d+\.\d+),([-]?\d+\.\d+),([-]?\d+\.\d+)\}!`)
	matches := newPattern.FindStringSubmatch(data)

	if len(matches) == 6 {
		// 新格式解析
		sensorID, err := strconv.Atoi(matches[2]) // 使用传感器地址编号
		if err != nil {
			return 0, 0, 0, 0, 0, fmt.Errorf("解析传感器ID失败: %v", err)
		}

		temperature, err := strconv.ParseFloat(strings.TrimSpace(matches[3]), 64)
		if err != nil {
			return 0, 0, 0, 0, 0, fmt.Errorf("解析温度值失败: %v", err)
		}

		x, err := strconv.ParseFloat(strings.TrimSpace(matches[4]), 64)
		if err != nil {
			return 0, 0, 0, 0, 0, fmt.Errorf("解析X值失败: %v", err)
		}

		y, err := strconv.ParseFloat(strings.TrimSpace(matches[5]), 64)
		if err != nil {
			return 0, 0, 0, 0, 0, fmt.Errorf("解析Y值失败: %v", err)
		}

		z := 0.0 // 新格式没有Z值，设为0

		return sensorID, x, y, z, temperature, nil
	}

	// 尝试解析无包装符号的格式: 1602301014-01,1,1,31.1,-6.781,1.542
	plainPattern := regexp.MustCompile(`([^,]+)-(\d+),\d+,(\d+),([-]?\d+\.\d+),([-]?\d+\.\d+),([-]?\d+\.\d+)`)
	matches = plainPattern.FindStringSubmatch(data)

	if len(matches) == 7 {
		// 无包装符号格式解析
		sensorID, err := strconv.Atoi(matches[3]) // 使用传感器地址编号
		if err != nil {
			return 0, 0, 0, 0, 0, fmt.Errorf("解析传感器ID失败: %v", err)
		}

		temperature, err := strconv.ParseFloat(strings.TrimSpace(matches[4]), 64)
		if err != nil {
			return 0, 0, 0, 0, 0, fmt.Errorf("解析温度值失败: %v", err)
		}

		x, err := strconv.ParseFloat(strings.TrimSpace(matches[5]), 64)
		if err != nil {
			return 0, 0, 0, 0, 0, fmt.Errorf("解析X值失败: %v", err)
		}

		y, err := strconv.ParseFloat(strings.TrimSpace(matches[6]), 64)
		if err != nil {
			return 0, 0, 0, 0, 0, fmt.Errorf("解析Y值失败: %v", err)
		}

		z := 0.0 // 这种格式没有Z值，设为0

		return sensorID, x, y, z, temperature, nil
	}

	// 尝试解析旧格式: 1:1.000, 2.000, 3.000
	oldPattern := regexp.MustCompile(`(\d+):([-]?\d+\.\d+),\s*([-]?\d+\.\d+),\s*([-]?\d+\.\d+)`)
	matches = oldPattern.FindStringSubmatch(data)

	if len(matches) == 5 {
		// 旧格式解析
		sensorID, err := strconv.Atoi(matches[1])
		if err != nil {
			return 0, 0, 0, 0, 0, fmt.Errorf("解析传感器ID失败: %v", err)
		}

		x, err := strconv.ParseFloat(strings.TrimSpace(matches[2]), 64)
		if err != nil {
			return 0, 0, 0, 0, 0, fmt.Errorf("解析X值失败: %v", err)
		}

		y, err := strconv.ParseFloat(strings.TrimSpace(matches[3]), 64)
		if err != nil {
			return 0, 0, 0, 0, 0, fmt.Errorf("解析Y值失败: %v", err)
		}

		z, err := strconv.ParseFloat(strings.TrimSpace(matches[4]), 64)
		if err != nil {
			return 0, 0, 0, 0, 0, fmt.Errorf("解析Z值失败: %v", err)
		}

		temperature := 0.0 // 旧格式没有温度值，设为0

		return sensorID, x, y, z, temperature, nil
	}

	return 0, 0, 0, 0, 0, fmt.Errorf("数据格式不正确: %s", data)
}
