// 从 gin.Context 提取中间件注入的数据 + 分页工具
package utils

import (
	"strconv"

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

// GetUserID 从 Context 获取用户 ID（支持 uint/float64/string 类型转换）
func GetUserID(c *gin.Context) uint {
	userID, exists := c.Get("user_id")
	if !exists {
		return 0
	}
	switch v := userID.(type) {
	case uint:
		return v
	case float64:
		return uint(v)
	case string:
		id, _ := strconv.ParseUint(v, 10, 64)
		return uint(id)
	default:
		return 0
	}
}

// GetRoleCode 获取主角色编码
func GetRoleCode(c *gin.Context) string {
	roleCode, exists := c.Get("role_code")
	if !exists {
		return ""
	}
	return roleCode.(string)
}

// HasRole 检查当前用户是否为指定角色
func HasRole(c *gin.Context, roleCode string) bool {
	return GetRoleCode(c) == roleCode
}

// ParsePagination 解析分页参数，默认 page=1, pageSize=10, 最大 1000
func ParsePagination(c *gin.Context) (page, pageSize int) {
	pageStr := c.DefaultQuery("page", "1")
	pageSizeStr := c.DefaultQuery("page_size", "10")
	page, _ = strconv.Atoi(pageStr)
	pageSize, _ = strconv.Atoi(pageSizeStr)
	if page < 1 {
		page = 1
	}
	if pageSize < 1 || pageSize > 1000 {
		pageSize = 10
	}
	return
}

// GetOffset 计算 SQL offset
func GetOffset(page, pageSize int) int {
	return (page - 1) * pageSize
}
