package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"time"
)

// 这里使用通用的map类型表示请求和响应，避免与main.go中的结构体冲突

func main() {
	// 服务器地址
	serverURL := "http://localhost:8080"

	// 1. 测试健康检查
	testHealthCheck(serverURL)

	// 2. 测试获取当前时间（默认格式）
	testGetCurrentTime(serverURL, "")

	// 3. 测试获取当前时间（自定义格式）
	testGetCurrentTime(serverURL, "2006-01-02 15:04:05")

	// 4. 测试订阅时间流
	testSubscribeTimeStream(serverURL)
}

// 测试健康检查
func testHealthCheck(serverURL string) {
	url := fmt.Sprintf("%s/health", serverURL)
	resp, err := http.Get(url)
	if err != nil {
		fmt.Printf("健康检查请求失败: %v\n", err)
		return
	}
	defer resp.Body.Close()

	if resp.StatusCode == http.StatusOK {
		fmt.Println("✅ 健康检查成功: 服务器正常运行")
	} else {
		fmt.Printf("❌ 健康检查失败: 状态码 %d\n", resp.StatusCode)
	}
}

// 测试获取当前时间
func testGetCurrentTime(serverURL string, format string) {
	url := fmt.Sprintf("%s/mcp/v1/submit", serverURL)

	// 构建请求体
	requestBody := map[string]interface{}{
		"data": map[string]interface{}{},
		"type": "get_current_time",
		"timestamp": time.Now().Unix(),
	}

	// 添加格式参数（如果提供）
	if format != "" {
		data := requestBody["data"].(map[string]interface{})
		data["format"] = format
	}

	// 序列化请求体
	jsonData, err := json.Marshal(requestBody)
	if err != nil {
		fmt.Printf("序列化请求体失败: %v\n", err)
		return
	}

	// 发送POST请求
	resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData))
	if err != nil {
		fmt.Printf("发送请求失败: %v\n", err)
		return
	}
	defer resp.Body.Close()

	// 读取响应
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Printf("读取响应失败: %v\n", err)
		return
	}

	// 解析响应为map
	var response map[string]interface{}
	if err := json.Unmarshal(body, &response); err != nil {
		fmt.Printf("解析响应失败: %v\n", err)
		return
	}

	// 检查响应状态
	success, ok := response["success"].(bool)
	if !ok || !success {
		message := "未知错误"
		if msg, ok := response["message"].(string); ok {
			message = msg
		}
		fmt.Printf("❌ 获取当前时间失败: %s\n", message)
		return
	}

	// 提取数据
	data, ok := response["data"].(map[string]interface{})
	if !ok {
		fmt.Println("❌ 响应数据格式错误")
		return
	}

	// 获取时间信息
	currentTime, _ := data["current_time"].(string)
	timestamp, _ := data["timestamp"].(float64)
	fmt.Printf("✅ 获取当前时间成功 (格式: %s):\n", format)
	fmt.Printf("   时间: %s\n", currentTime)
	fmt.Printf("   时间戳: %.0f\n", timestamp)
}

// 测试订阅时间流
func testSubscribeTimeStream(serverURL string) {
	url := fmt.Sprintf("%s/mcp/v1/submit", serverURL)

	// 构建请求体
	requestBody := map[string]interface{}{
		"data": map[string]interface{}{
			"interval": 2, // 每2秒更新一次
			"format":   "2006-01-02 15:04:05",
		},
		"type": "subscribe_time_stream",
		"timestamp": time.Now().Unix(),
	}

	// 序列化请求体
	jsonData, err := json.Marshal(requestBody)
	if err != nil {
		fmt.Printf("序列化请求体失败: %v\n", err)
		return
	}

	// 发送POST请求
	resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData))
	if err != nil {
		fmt.Printf("发送请求失败: %v\n", err)
		return
	}
	defer resp.Body.Close()

	// 读取响应
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Printf("读取响应失败: %v\n", err)
		return
	}

	// 解析响应为map
	var response map[string]interface{}
	if err := json.Unmarshal(body, &response); err != nil {
		fmt.Printf("解析响应失败: %v\n", err)
		return
	}

	// 检查响应状态
	success, ok := response["success"].(bool)
	if !ok || !success {
		message := "未知错误"
		if msg, ok := response["message"].(string); ok {
			message = msg
		}
		fmt.Printf("❌ 订阅时间流失败: %s\n", message)
		return
	}

	// 提取数据
	data, ok := response["data"].(map[string]interface{})
	if !ok {
		fmt.Println("❌ 响应数据格式错误")
		return
	}

	// 获取流信息
	streamID, _ := data["stream_id"].(string)
	sseURL, _ := data["sse_url"].(string)
	interval, _ := data["interval"].(float64)
	fmt.Printf("✅ 订阅时间流成功:\n")
	fmt.Printf("   流ID: %s\n", streamID)
	fmt.Printf("   SSE URL: %s\n", sseURL)
	fmt.Printf("   更新间隔: %.0f秒\n", interval)
	fmt.Println("   提示: 可以使用curl或浏览器访问SSE URL来接收实时时间更新")
}