package handler

import (
	"context"
	"strings"
	"time"

	"github.com/gofiber/fiber/v2"

	"gitee.ltd/lxh/wechat-robot/internal/docker"
)

// GetContainerLogs 获取容器日志
func GetContainerLogs(c *fiber.Ctx) error {
	containerID := c.Params("id")
	if containerID == "" {
		return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
			"success": false,
			"message": "容器ID不能为空",
		})
	}

	// 获取日志行数
	lines := c.Query("lines", "100")

	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()

	// 获取容器日志
	logs, err := docker.GetContainerLogs(ctx, containerID, lines)
	if err != nil {
		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
			"success": false,
			"message": "获取容器日志失败: " + err.Error(),
		})
	}

	// 处理日志输出，移除控制字符
	cleanLogs := cleanDockerLogs(logs)

	return c.JSON(fiber.Map{
		"success": true,
		"logs":    cleanLogs,
	})
}

// GetContainerStats 获取容器状态
func GetContainerStats(c *fiber.Ctx) error {
	containerID := c.Params("id")
	if containerID == "" {
		return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
			"success": false,
			"message": "容器ID不能为空",
		})
	}

	// 创建上下文，添加超时控制
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	// 获取真实的容器统计数据
	stats, err := docker.GetStats(ctx, containerID)
	if err != nil {
		return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
			"success": false,
			"message": "获取容器统计数据失败: " + err.Error(),
		})
	}

	return c.JSON(fiber.Map{
		"success": true,
		"stats":   stats,
	})
}

// cleanDockerLogs 移除Docker日志中的控制字符
func cleanDockerLogs(logs string) string {
	// Docker输出日志中可能包含控制字符，需要清理
	result := logs

	// 移除8字节头部
	lines := strings.Split(result, "\n")
	for i, line := range lines {
		if len(line) > 8 {
			// 跳过每行前8个字节的头部信息
			lines[i] = line[8:]
		}
	}
	result = strings.Join(lines, "\n")

	return result
}
