package handlers

import (
	"fmt"

	"github.com/gin-gonic/gin"
	"github.com/niangaodev/art-code/models"
	"github.com/niangaodev/art-code/repositories"
	"github.com/niangaodev/art-code/utils"
)

// 获取标签列表
func GetTags(c *gin.Context) {
	// 从数据库获取所有标签
	tags, err := repositories.GetTags()
	if err != nil {
		utils.ServerError(c, err)
		return
	}

	// 构建响应
	responses := repositories.BuildTagsResponse(tags)

	utils.Success(c, responses)
}

func GetTag(c *gin.Context) {
	// 解析标签ID
	idStr := c.Param("id")
	var id uint
	_, err := fmt.Sscanf(idStr, "%d", &id)
	if err != nil {
		utils.Error(c, 400, "Invalid tag ID")
		return
	}

	// 从数据库获取标签
	tag, err := repositories.GetTagByID(id)
	if err != nil {
		utils.ServerError(c, err)
		return
	}

	if tag == nil {
		utils.Error(c, 404, "Tag not found")
		return
	}

	// 构建响应
	response := repositories.BuildTagResponse(tag)

	utils.Success(c, response)
}

// 获取标签列表 (Admin)
func AdminGetTags(c *gin.Context) {
	// 从数据库获取所有标签
	tags, err := repositories.GetTags()
	if err != nil {
		utils.ServerError(c, err)
		return
	}

	utils.Success(c, repositories.BuildTagsResponse(tags))
}

// 创建标签
func AdminCreateTag(c *gin.Context) {
	var tag models.Tag
	if err := c.ShouldBindJSON(&tag); err != nil {
		utils.Error(c, 400, "Invalid request")
		return
	}

	// 创建标签
	if err := repositories.CreateTag(&tag); err != nil {
		utils.ServerError(c, err)
		return
	}

	utils.SuccessWithMsg(c, "Tag created successfully", nil)
}

// 更新标签
func AdminUpdateTag(c *gin.Context) {
	tagID := c.Param("id")
	var tag models.Tag
	if err := c.ShouldBindJSON(&tag); err != nil {
		utils.Error(c, 400, "Invalid request")
		return
	}

	// 转换标签ID为uint
	var idUint uint
	_, err := fmt.Sscanf(tagID, "%d", &idUint)
	if err != nil {
		utils.Error(c, 400, "Invalid tag ID")
		return
	}

	// 设置标签ID
	tag.ID = idUint

	// 更新标签
	if err := repositories.UpdateTag(&tag); err != nil {
		utils.ServerError(c, err)
		return
	}

	utils.SuccessWithMsg(c, "Tag updated successfully", nil)
}

// 删除标签
func AdminDeleteTag(c *gin.Context) {
	tagID := c.Param("id")

	// 转换标签ID为uint
	var idUint uint
	_, err := fmt.Sscanf(tagID, "%d", &idUint)
	if err != nil {
		utils.Error(c, 400, "Invalid tag ID")
		return
	}

	// 删除标签
	if err := repositories.DeleteTag(idUint); err != nil {
		utils.ServerError(c, err)
		return
	}

	utils.SuccessWithMsg(c, "Tag deleted successfully", nil)
}
