// Filename: internal/webhandlers/page_handler.go (测试前版本)

package webhandlers

import (
	"encoding/json"
	"gemini-balancer/internal/service"
	"net/http"

	"github.com/gin-gonic/gin"
)

// PageHandler
type PageHandler struct {
	queryService *service.DashboardQueryService
}

// 构造函数注入新依赖
func NewPageHandler(queryService *service.DashboardQueryService) *PageHandler {
	return &PageHandler{queryService: queryService}
}

// ShowDashboardPage 渲染现代化的监控面板页面
func (h *PageHandler) ShowDashboardPage(c *gin.Context) {
	// [核心改造] 调用高速缓存读取方法，为模板准备数据
	overviewData, err := h.queryService.GetDashboardOverviewData()
	if err != nil {
		// 在SSR模式下，如果缓存未就绪，我们可以传递一个空对象或默认值
		// 这样页面至少可以渲染出骨架，而不是直接报错
		c.HTML(http.StatusOK, "dashboard.html", gin.H{
			"PageID":    "dashboard",
			"pageTitle": "监控面板",
			"overview":  nil, // 或者一个默认的空结构体实例
			"error":     "Dashboard data is currently being generated. Please refresh in a moment.",
			"ssr_error": err.Error(),
		})
		return
	}
	c.HTML(http.StatusOK, "dashboard.html", gin.H{
		"PageID":    "dashboard",
		"pageTitle": "监控面板",
		"overview":  overviewData,
		"ssr_error": nil,
	})
}

// ShowConfigEditorPage 渲染配置编辑页面。
func (h *PageHandler) ShowConfigEditorPage(c *gin.Context) {
	c.HTML(http.StatusOK, "settings.html", gin.H{
		"PageID":      "settings",
		"pageTitle":   "配置编辑",
		"currentPage": "settings",
	})
}

// ShowErrorLogsPage 渲染错误日志页面。
func (h *PageHandler) ShowErrorLogsPage(c *gin.Context) {
	c.HTML(http.StatusOK, "logs.html", gin.H{
		"PageID":    "logs",
		"pageTitle": "错误日志",
	})
}

// ShowKeysPage 渲染密钥管理页面。
func (h *PageHandler) ShowKeysPage(c *gin.Context) {
	c.HTML(http.StatusOK, "keys.html", gin.H{
		"PageID":    "keys",
		"pageTitle": "密钥管理",
	})
}

// ShowTasksPage renders the M:N testing page.
func (h *PageHandler) ShowTasksPage(c *gin.Context) {
	c.HTML(http.StatusOK, "tasks.html", gin.H{
		"PageID":    "tasks",
		"pageTitle": "计划任务",
	})
}

// ShowTasksPage renders the M:N testing page.
func (h *PageHandler) ShowChatPage(c *gin.Context) {
	c.HTML(http.StatusOK, "chat.html", gin.H{
		"PageID":    "chat",
		"pageTitle": "Webchat",
	})
}

// 它只负责从 DashboardQueryService 获取数据，并将其作为JSON字符串渲染出来。
func (h *PageHandler) ShowDashboardDebugPage(c *gin.Context) {
	// 1. 调用与正式Dashboard完全相同的数据获取方法
	overviewData, err := h.queryService.GetDashboardOverviewData()
	if err != nil {
		// 如果出错，直接将错误信息打印出来
		c.HTML(http.StatusInternalServerError, "dashboard_debug.html", gin.H{
			"PageID":        "dashboard_debug",
			"pageTitle":     "Dashboard 诊断 - 错误",
			"overview_json": "获取数据时发生错误: " + err.Error(),
		})
		return
	}
	// 2. 将获取到的Go数据结构，格式化（美化）成JSON字符串
	// 使用 MarshalIndent 是为了让输出的JSON带缩进，便于阅读
	jsonData, err := json.MarshalIndent(overviewData, "", "  ")
	if err != nil {
		// 如果JSON序列化出错，也直接打印错误
		c.HTML(http.StatusInternalServerError, "dashboard_debug.html", gin.H{
			"PageID":        "dashboard_debug",
			"pageTitle":     "Dashboard 诊断 - 错误",
			"overview_json": "序列化JSON时发生错误: " + err.Error(),
		})
		return
	}
	// 3. 将这个JSON字符串，直接传递给一个极简的HTML模板
	c.HTML(http.StatusOK, "dashboard_debug.html", gin.H{
		"PageID":        "dashboard-debug",
		"pageTitle":     "Dashboard 诊断 - 成功",
		"overview_json": string(jsonData), // 将 []byte 转换为 string
	})
}
