package main

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

// MCPRequest 定义MCP请求结构
type MCPRequest struct {
	Data      interface{}       `json:"data"`
	Type      string            `json:"type"`
	Metadata  map[string]string `json:"metadata,omitempty"`
	Timestamp int64             `json:"timestamp"`
}

// MCPResponse 定义MCP响应结构
type MCPResponse struct {
	Success   bool        `json:"success"`
	Message   string      `json:"message,omitempty"`
	Data      interface{} `json:"data,omitempty"`
	AIResult  interface{} `json:"ai_result,omitempty"`
	RequestID string      `json:"request_id,omitempty"`
	Timestamp int64       `json:"timestamp"`
}

func main() {
	// 准备测试数据
	diskData := map[string]interface{}{
		"disk_id": "sda",
		"smart_data": map[string]interface{}{
			"temperature":         38,
			"power_on_hours":      12345,
			"read_errors":         0,
			"write_errors":        0,
			"reallocated_sectors": 0,
		},
		"performance_data": map[string]interface{}{
			"read_speed":  120,
			"write_speed": 90,
			"io_wait":     0.5,
		},
	}

	// 创建MCP请求
	mcpRequest := MCPRequest{
		Data:      diskData,
		Type:      "disk_inspection",
		Metadata:  map[string]string{"server_id": "test-server", "location": "test-lab"},
		Timestamp: time.Now().Unix(),
	}

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

	// 发送HTTP请求到MCP服务器
	resp, err := http.Post("http://localhost:8080/mcp/v1/submit", "application/json", bytes.NewBuffer(jsonData))
	if err != nil {
		fmt.Printf("发送请求失败: %v\n", err)
		fmt.Println("请确保MCP服务器正在运行，并且监听在正确的端口上")
		return
	}
	defer resp.Body.Close()

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

	// 打印响应状态和内容
	fmt.Printf("响应状态码: %d\n", resp.StatusCode)

	// 如果响应成功，解析并显示详细信息
	if resp.StatusCode == http.StatusOK {
		var mcpResponse MCPResponse
		if err := json.Unmarshal(body, &mcpResponse); err != nil {
			fmt.Printf("解析响应数据失败: %v\n", err)
			fmt.Printf("原始响应内容: %s\n", string(body))
			return
		}

		// 格式化输出响应数据
		fmt.Println("\nMCP服务器响应:")
		fmt.Printf("  成功状态: %v\n", mcpResponse.Success)
		fmt.Printf("  消息: %s\n", mcpResponse.Message)
		fmt.Printf("  请求ID: %s\n", mcpResponse.RequestID)
		fmt.Printf("  时间戳: %d (%s)\n",
			mcpResponse.Timestamp,
			time.Unix(mcpResponse.Timestamp, 0).Format("2006-01-02 15:04:05"))

		// 输出AI分析结果（如果有）
		if mcpResponse.AIResult != nil {
			fmt.Println("\nAI分析结果:")
			aiResultJSON, _ := json.MarshalIndent(mcpResponse.AIResult, "  ", "  ")
			fmt.Println(string(aiResultJSON))
		}
	} else {
		fmt.Printf("请求失败，响应内容: %s\n", string(body))
	}

	// 测试健康检查接口
	testHealthCheck()
}

// 测试健康检查接口
func testHealthCheck() {
	fmt.Println("\n测试健康检查接口...")

	resp, err := http.Get("http://localhost:8080/health")
	if err != nil {
		fmt.Printf("健康检查失败: %v\n", err)
		return
	}
	defer resp.Body.Close()

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

	fmt.Printf("健康检查状态码: %d\n", resp.StatusCode)
	fmt.Printf("健康检查响应: %s\n", string(body))
}
