package main

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

// 单个传感器数据结构
type SensorReading struct {
	SerialNumber string  // 传感器序列号，如 8513343-01
	GroupID      int     // 组ID，如 1
	SensorID     int     // 传感器ID，如 1-16
	Temperature  float64 // 温度值，如 32.9
	X            float64 // X轴值，如 0.848
	Y            float64 // Y轴值，如 2.100
	Z            float64 // Z轴默认为0
}

// 解析批量传感器数据
func parseBatchData(data string) ([]SensorReading, error) {
	// 检查是否是批量数据格式
	if !strings.Contains(data, "#{") || !strings.Contains(data, "}!") {
		return nil, fmt.Errorf("不是批量数据格式")
	}

	// 提取批量数据部分 - 使用非贪婪匹配确保正确捕获内容
	batchPattern := regexp.MustCompile(`#\{([\s\S]*?)\}!`)
	batchMatches := batchPattern.FindStringSubmatch(data)
	if len(batchMatches) != 2 {
		return nil, fmt.Errorf("批量数据格式不正确")
	}

	// 获取批量数据内容
	batchContent := batchMatches[1]

	// 记录原始批量数据内容，用于调试
	log.Printf("解析批量数据内容: %s", batchContent)

	// 按行分割
	lines := strings.Split(batchContent, "\n")

	var readings []SensorReading

	// 行解析正则表达式 - 匹配格式如: 8513343-01,1,1,32.9,0.848,2.100
	linePattern := regexp.MustCompile(`([^,]+),(\d+),(\d+),([-]?\d+\.\d+),([-]?\d+\.\d+),([-]?\d+\.\d+)`)

	for _, line := range lines {
		// 清理行
		line = strings.TrimSpace(line)
		if line == "" {
			continue
		}

		// 处理可能存在的回车符
		line = strings.ReplaceAll(line, "\r", "")

		// 解析行
		matches := linePattern.FindStringSubmatch(line)
		if len(matches) != 7 {
			// 记录不匹配的行
			log.Printf("无法匹配行: %s", line)
			continue // 跳过不匹配的行
		}

		// 解析各个字段
		serialNumber := matches[1]
		groupID, err := strconv.Atoi(matches[2])
		if err != nil {
			continue
		}

		sensorID, err := strconv.Atoi(matches[3])
		if err != nil {
			continue
		}

		temperature, err := strconv.ParseFloat(matches[4], 64)
		if err != nil {
			continue
		}

		x, err := strconv.ParseFloat(matches[5], 64)
		if err != nil {
			continue
		}

		y, err := strconv.ParseFloat(matches[6], 64)
		if err != nil {
			continue
		}

		// 创建传感器读数对象
		reading := SensorReading{
			SerialNumber: serialNumber,
			GroupID:      groupID,
			SensorID:     sensorID,
			Temperature:  temperature,
			X:            x,
			Y:            y,
			Z:            0.0, // Z轴默认为0
		}

		readings = append(readings, reading)
	}

	if len(readings) == 0 {
		return nil, fmt.Errorf("未找到有效的传感器数据")
	}

	return readings, nil
}

// 保存批量传感器数据到数据库
func SaveBatchSensorData(readings []SensorReading) error {
	for _, reading := range readings {
		// 使用现有的SaveSensorData函数保存每个传感器的数据
		if err := SaveSensorData(reading.SensorID, reading.X, reading.Y, reading.Z, reading.Temperature); err != nil {
			return fmt.Errorf("保存传感器 %d 数据失败: %v", reading.SensorID, err)
		}
	}
	return nil
}
