package model

import "time"

// User 用户模型
type User struct {
	BaseModel

	Email        string `gorm:"type:varchar(255);not null" json:"email"`
	PasswordHash string `gorm:"type:varchar(255);not null" json:"-"`
	Username     string `gorm:"type:varchar(16);uniqueIndex;not null" json:"username"`
	Avatar       string `gorm:"type:varchar(500);default:''" json:"avatar"`
	Bio          string `gorm:"type:text" json:"bio"`

	Role   string `gorm:"type:varchar(20);default:user;index;not null" json:"role"`
	Status string `gorm:"type:varchar(20);default:active;index;not null" json:"status"`

	// 安全与审计
	RegIP        string `gorm:"type:varchar(45);default:''" json:"-"`          // 注册 IP
	LastLoginIP  string `gorm:"type:varchar(45);default:''" json:"-"`          // 最后登录 IP
	LastLoginAt  *time.Time `gorm:"default:null" json:"last_login_at,omitempty"` // 最后登录时间
	DeleteReason string `gorm:"type:text;default:''" json:"-"`                 // 注销原因
}

// 角色常量（仅用作字符串标识符，层级和权限由配置驱动）
const (
	RoleUser      = "user"
	RoleModerator = "moderator"
	RoleAdmin     = "admin"
	RoleOwner     = "owner"
)

// 状态常量
const (
	StatusActive  = "active"
	StatusBanned  = "banned"
	StatusDeleted = "deleted" // 用户主动注销（7 天内登录可恢复）
	StatusLocked  = "locked"  // 永久锁定（管理员删除或注销满 7 天）
)

// --- 以下由 InitRoles 从配置初始化，无硬编码默认值 ---
var roleLevel map[string]int
var operableRoles map[string][]string
var RoleDisplayNames map[string]string

// InitRoles 从配置初始化角色系统（唯一数据源）
// 必须在服务启动前调用，不提供默认值
func InitRoles(levels map[string]int, names map[string]string, operRoles map[string][]string) {
	roleLevel = levels
	RoleDisplayNames = names
	operableRoles = operRoles
}

// HasMinRole 检查 role 是否达到 minRole 的权限级别
func HasMinRole(role, minRole string) bool {
	return roleLevel[role] >= roleLevel[minRole]
}

// CanOperateRole 检查操作者是否可以操作目标角色
// 未在 operableRoles 中声明的角色默认可操作所有角色
func CanOperateRole(operatorRole, targetRole string) bool {
	allowed, hasRule := operableRoles[operatorRole]
	if !hasRule {
		return true
	}
	for _, r := range allowed {
		if r == targetRole {
			return true
		}
	}
	return false
}

// StatusDisplayNames 状态 → 中文名（服务端唯一数据源）
var StatusDisplayNames = map[string]string{
	StatusActive:  "正常",
	StatusBanned:  "已封禁",
	StatusDeleted: "已注销",
	StatusLocked:  "已锁定",
}
