// Package controller 控制器层
package controller

import (
	"strconv"

	"server/common"
	"server/modules/system/entity"
	"server/modules/system/service"

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

type SysUserController struct {
	service *service.SysUserService
}

func NewSysUserController() *SysUserController {
	return &SysUserController{service: service.NewSysUserService()}
}

func (ctrl *SysUserController) RegisterRoutes(r *gin.RouterGroup) {
	r.GET("/sys-users", ctrl.List)
	r.GET("/sys-users/:id", ctrl.GetByID)
	r.POST("/sys-users", ctrl.Create)
	r.PUT("/sys-users/:id", ctrl.Update)
	r.PATCH("/sys-users/:id", ctrl.UpdateFields)
	r.DELETE("/sys-users/:id", ctrl.Delete)
	r.PUT("/sys-users/:id/password", ctrl.UpdatePassword)
}

// @Summary      获取用户列表
// @Tags         用户管理
// @Param        page  query  int  false  "页码"
// @Param        size  query  int  false  "每页数量"
// @Success      200  {object}  common.Response
// @Router       /sys-users [get]
func (ctrl *SysUserController) List(c *gin.Context) {
	// var user *entity.LoginUser = common.GetLoginUser(c)
	// log.Printf(user.Username)
	page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
	size, _ := strconv.Atoi(c.DefaultQuery("size", "10"))
	items, total, err := ctrl.service.List(page, size)
	if err != nil {
		common.Error(c, 500, err.Error())
		return
	}
	common.SuccessPage(c, items, total, page, size)
}

// @Summary      获取单个用户
// @Tags         用户管理
// @Param        id   path  string  true  "用户ID"
// @Success      200  {object}  common.Response
// @Router       /sys-users/{id} [get]
func (ctrl *SysUserController) GetByID(c *gin.Context) {
	item, err := ctrl.service.GetByID(c.Param("id"))
	if err != nil {
		common.Error(c, 404, "未找到")
		return
	}
	common.Success(c, item)
}

// @Summary      创建用户
// @Tags         用户管理
// @Param        item  body  entity.SysUser  true  "用户信息"
// @Success      200  {object}  common.Response
// @Router       /sys-users [post]
func (ctrl *SysUserController) Create(c *gin.Context) {
	var item entity.SysUser
	if err := c.ShouldBindJSON(&item); err != nil {
		common.Error(c, 400, "参数错误")
		return
	}
	// 设置创建人
	item.CreateBy = common.GetLoginUserID(c)
	if err := ctrl.service.Create(&item); err != nil {
		common.Error(c, 500, err.Error())
		return
	}
	common.Success(c, item)
}

// @Summary      更新用户
// @Tags         用户管理
// @Param        id    path  string  true  "用户ID"
// @Param        item  body  entity.SysUser  true  "用户信息"
// @Success      200  {object}  common.Response
// @Router       /sys-users/{id} [put]
func (ctrl *SysUserController) Update(c *gin.Context) {
	var item entity.SysUser
	if err := c.ShouldBindJSON(&item); err != nil {
		common.Error(c, 400, "参数错误")
		return
	}
	item.ID = c.Param("id")
	item.UpdateBy = common.GetLoginUserID(c)
	if err := ctrl.service.Update(&item); err != nil {
		common.Error(c, 500, err.Error())
		return
	}
	common.Success(c, item)
}

// @Summary      动态字段更新
// @Tags         用户管理
// @Param        id      path  string  true  "用户ID"
// @Param        fields  body  map[string]interface{}  true  "要更新的字段"
// @Success      200  {object}  common.Response
// @Router       /sys-users/{id} [patch]
func (ctrl *SysUserController) UpdateFields(c *gin.Context) {
	var fields map[string]interface{}
	if err := c.ShouldBindJSON(&fields); err != nil {
		common.Error(c, 400, "参数错误")
		return
	}
	if err := ctrl.service.UpdateFields(c.Param("id"), fields); err != nil {
		common.Error(c, 500, err.Error())
		return
	}
	common.Success(c, nil)
}

// @Summary      删除用户
// @Tags         用户管理
// @Param        id   path  string  true  "用户ID"
// @Success      200  {object}  common.Response
// @Router       /sys-users/{id} [delete]
func (ctrl *SysUserController) Delete(c *gin.Context) {
	if err := ctrl.service.Delete(c.Param("id")); err != nil {
		common.Error(c, 500, err.Error())
		return
	}
	common.Success(c, nil)
}

// UpdatePasswordRequest 修改密码请求
type UpdatePasswordRequest struct {
	OldPassword string `json:"oldPassword" binding:"required"`
	NewPassword string `json:"newPassword" binding:"required"`
}

// @Summary      修改密码
// @Tags         用户管理
// @Param        id       path  string  true  "用户ID"
// @Param        request  body  UpdatePasswordRequest  true  "密码信息"
// @Success      200  {object}  common.Response
// @Router       /sys-users/{id}/password [put]
func (ctrl *SysUserController) UpdatePassword(c *gin.Context) {
	var req UpdatePasswordRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		common.Error(c, 400, "参数错误")
		return
	}
	if err := ctrl.service.UpdatePassword(c.Param("id"), req.OldPassword, req.NewPassword); err != nil {
		common.Error(c, 400, err.Error())
		return
	}
	common.Success(c, nil)
}
