// Package dto 定义数据传输对象，用于 Controller 层的请求/响应参数绑定
package dto

// RegisterRequest 用户注册请求参数
type RegisterRequest struct {
	Username string `json:"username" binding:"required,min=3,max=50"` // 用户名，3-50 字符
	Email    string `json:"email" binding:"required,email"`          // 邮箱地址，必须符合邮箱格式
	Password string `json:"password" binding:"required,min=6,max=50"` // 密码，6-50 字符
	Nickname string `json:"nickname" binding:"max=50"`               // 昵称，可选，最多 50 字符
}

// LoginRequest 用户登录请求参数
type LoginRequest struct {
	Account  string `json:"account" binding:"required"`  // 登录账号，支持用户名或邮箱
	Password string `json:"password" binding:"required"` // 登录密码
}

// LoginResponse 登录成功响应数据
type LoginResponse struct {
	Token        string   `json:"token"`         // Access Token，用于接口认证
	RefreshToken string   `json:"refresh_token"` // Refresh Token，用于刷新 Access Token
	ExpiresIn    int64    `json:"expires_in"`    // Access Token 有效期（秒）
	User         UserInfo `json:"user"`          // 当前登录用户基本信息
}

// UserInfo 用户基本信息（用于响应返回，不含敏感字段）
type UserInfo struct {
	ID        int64    `json:"id"`                    // 用户 ID
	Username  string   `json:"username"`              // 用户名
	Email     string   `json:"email"`                 // 邮箱
	Nickname  string   `json:"nickname"`              // 昵称
	Avatar    string   `json:"avatar"`                // 头像 URL
	Gender    int      `json:"gender"`                // 性别：0=未知, 1=男, 2=女
	Phone     string   `json:"phone,omitempty"`       // 手机号（可能为空）
	Roles     []string `json:"roles"`                 // 角色代码列表
	CreatedAt string   `json:"created_at,omitempty"`  // 注册时间（格式：yyyy-MM-dd HH:mm:ss）
}

// RefreshTokenRequest 刷新 Token 请求参数
type RefreshTokenRequest struct {
	RefreshToken string `json:"refresh_token" binding:"required"` // 原 Refresh Token
}

// UpdateProfileRequest 更新个人资料请求参数
type UpdateProfileRequest struct {
	Nickname string `json:"nickname" binding:"max=50"`  // 新昵称
	Avatar   string `json:"avatar" binding:"max=500"`   // 新头像 URL
	Gender   *int   `json:"gender" binding:"omitempty,oneof=0 1 2"` // 新性别，指针类型区分「未传」和「传 0」
	Phone    string `json:"phone" binding:"max=20"`     // 新手机号
}

// ChangePasswordRequest 修改密码请求参数
type ChangePasswordRequest struct {
	OldPassword string `json:"old_password" binding:"required"`         // 旧密码
	NewPassword string `json:"new_password" binding:"required,min=6,max=50"` // 新密码，6-50 字符
}
