package main

import (
	"fmt"
	"net"
)

// StartUDPServer 启动UDP服务器
func StartUDPServer(address string) error {
	addr, err := net.ResolveUDPAddr("udp", address)
	if err != nil {
		return fmt.Errorf("解析UDP地址失败: %v", err)
	}

	conn, err := net.ListenUDP("udp", addr)
	if err != nil {
		return fmt.Errorf("监听UDP地址失败: %v", err)
	}
	defer conn.Close()

	startClientCleanup()

	Logger.Printf("UDP服务器已启动，正在监听 %s\n", address)

	buffer := make([]byte, 1024)

	for {
		n, remoteAddr, err := conn.ReadFromUDP(buffer)
		if err != nil {
			Logger.Printf("从UDP客户端读取失败: %v", err)
			continue
		}

		go handleUDPPacket(conn, remoteAddr, buffer[:n])
	}
}

// handleUDPPacket 处理UDP数据包
func handleUDPPacket(conn *net.UDPConn, addr *net.UDPAddr, data []byte) {
	remoteAddr := addr.String()

	addClient(remoteAddr)

	rawData := string(data)
	TCPDataLogger.Printf("从UDP客户端 %s 接收到原始数据: %s", remoteAddr, rawData)

	sensorID, x, y, z, err := parseData(rawData)

	if err == nil {
		TCPDataLogger.Printf("解析成功 - UDP客户端: %s, 传感器ID: %d, 值: X=%.3f, Y=%.3f, Z=%.3f",
			remoteAddr, sensorID, x, y, z)

		if err := SaveSensorData(sensorID, x, y, z); err != nil {
			Logger.Printf("保存传感器数据失败: %v", err)
		}
	} else {
		TCPDataLogger.Printf("无法解析从UDP客户端 %s 接收到的数据: %s, 错误: %v", remoteAddr, rawData, err)
	}

	resp := "OK\n"
	if _, err := conn.WriteToUDP([]byte(resp), addr); err != nil {
		Logger.Printf("发送响应到UDP客户端 %s 失败: %v", remoteAddr, err)
	}

	updateClientLastSeen(remoteAddr)
}
