package pddapi

import (
	"bufio"
	"fmt"
	"net"
	"time"
)

// 定义一个客户端结构体，保存每个客户端的信息
type Client struct {
	conn       net.Conn
	lastActive time.Time // 记录最后活跃时间，用于心跳检测
}

// 处理客户端消息的函数
func (c *Client) handleConnection() {
	defer c.conn.Close()

	reader := bufio.NewReader(c.conn)
	for {
		// 检查是否超时
		if time.Since(c.lastActive) > 30*time.Second {
			fmt.Printf("Client %s timed out\n", c.conn.RemoteAddr())
			return
		}

		message, err := reader.ReadString('\n')
		if err != nil {
			fmt.Printf("Error reading from %s: %v\n", c.conn.RemoteAddr(), err)
			return
		}
		fmt.Printf("Received from %s: %s", c.conn.RemoteAddr(), message)

		// 更新最后活跃时间
		c.lastActive = time.Now()

		// 发送响应给客户端
		c.conn.Write([]byte("Message received\n"))
	}
}

// 心跳检测函数
func (c *Client) heartbeat() {
	ticker := time.NewTicker(10 * time.Second)
	defer ticker.Stop()
	for {
		select {
		case <-ticker.C:
			// 发送心跳包
			_, err := c.conn.Write([]byte("heartbeat\n"))
			if err != nil {
				fmt.Printf("Error sending heartbeat to %s: %v\n", c.conn.RemoteAddr(), err)
				return
			}
			// 更新最后活跃时间
			c.lastActive = time.Now()
		}
	}
}

func main() {
	listener, err := net.Listen("tcp", ":8080")
	if err != nil {
		fmt.Println("Error starting server:", err)
		return
	}
	defer listener.Close()
	fmt.Println("Server listening on :8080")

	for {
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("Error accepting connection:", err)
			continue
		}

		client := &Client{
			conn:       conn,
			lastActive: time.Now(),
		}

		// 启动一个新的goroutine处理每个连接
		go client.handleConnection()

		// 启动心跳检测goroutine
		go client.heartbeat()
	}
}
