package role

import (
	"github.com/veypi/vbase/cfg"
	"github.com/veypi/vbase/models"
	"github.com/veypi/vigo"
)

type updateOpts struct {
	RoleID string  `src:"path@role_id" desc:"角色ID"`     // 角色 ID
	Name   *string `json:"name" src:"json" desc:"角色名称"` // 可选，角色名称
	Des    *string `json:"des" src:"json" desc:"角色描述"`  // 可选，角色描述
}

var _ = Router.Patch("/{role_id}", "更新角色", updateRole)

func updateRole(x *vigo.X, opts *updateOpts) (*models.Role, error) {
	// 查找角色
	role := &models.Role{}
	if err := cfg.DB().Where("id = ?", opts.RoleID).First(role).Error; err != nil {
		return nil, vigo.NewError("role not found").WithCode(404)
	}

	// 准备更新字段
	updates := map[string]interface{}{}

	if opts.Name != nil {
		updates["name"] = *opts.Name
	}

	if opts.Des != nil {
		updates["des"] = *opts.Des
	}

	// 如果没有更新字段，直接返回
	if len(updates) == 0 {
		return role, nil
	}

	// 执行更新
	if err := cfg.DB().Model(role).Updates(updates).Error; err != nil {
		return nil, err
	}

	// 重新查询以获取最新数据
	if err := cfg.DB().Where("id = ?", opts.RoleID).First(role).Error; err != nil {
		return nil, err
	}

	return role, nil
}
