package handlers

import (
	"fmt"
	"net/http"
	"strconv"

	"sale/internal/utils"

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

type LogHandler struct{}

func NewLogHandler() *LogHandler {
	return &LogHandler{}
}

func (h *LogHandler) GetLogs(c *gin.Context) {
	lines := 500
	if l := c.Query("lines"); l != "" {
		if v, err := strconv.Atoi(l); err == nil && v > 0 {
			lines = v
		}
	}

	logs, err := utils.GetLogs(lines)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to read logs"})
		return
	}

	c.JSON(http.StatusOK, gin.H{"data": logs})
}

func (h *LogHandler) ClearLogs(c *gin.Context) {
	if err := utils.ClearLogs(); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to clear logs"})
		return
	}

	c.JSON(http.StatusOK, gin.H{"message": "Logs cleared successfully"})
}

func (h *LogHandler) GetLogInfo(c *gin.Context) {
	size, err := utils.GetLogSize()
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to get log info"})
		return
	}

	modTime, err := utils.GetLogModTime()
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to get log info"})
		return
	}

	var sizeStr string
	if size >= 1024*1024 {
		sizeStr = fmt.Sprintf("%.2f MB", float64(size)/(1024*1024))
	} else if size >= 1024 {
		sizeStr = fmt.Sprintf("%.2f KB", float64(size)/1024)
	} else {
		sizeStr = fmt.Sprintf("%d B", size)
	}

	c.JSON(http.StatusOK, gin.H{
		"data": gin.H{
			"size":     size,
			"size_str": sizeStr,
			"mod_time": modTime,
		},
	})
}
