package domain

import "time"

// StrPtr 将 string 转为 *string（空字符串返回 nil，用于可选的 unique 字段）
func StrPtr(s string) *string {
	if s == "" {
		return nil
	}
	return &s
}

// DerefStr 安全解引用 *string，nil 返回空字符串
func DerefStr(s *string) string {
	if s == nil {
		return ""
	}
	return *s
}

// Gender 性别
type Gender int

const (
	GenderUnknown Gender = iota // 未知
	GenderMale                  // 男
	GenderFemale                // 女
)

// UserStatus 用户状态
type UserStatus int

const (
	UserStatusInactive UserStatus = 0 // 未激活
	UserStatusActive   UserStatus = 1 // 已激活
	UserStatusLocked   UserStatus = 2 // 已锁定
	UserStatusDisabled UserStatus = 3 // 已禁用
)

// User 用户模型
type User struct {
	ID            int64      `gorm:"primaryKey;autoIncrement" json:"id"`
	Username      string     `gorm:"type:varchar(50);uniqueIndex;not null" json:"username"`
	// Email/Phone 使用指针类型：nil 存储为 NULL，允许多个用户没有邮箱/手机（唯一约束对 NULL 不生效）
	Email         *string    `gorm:"type:varchar(100);uniqueIndex" json:"email"`
	Phone         *string    `gorm:"type:varchar(20);uniqueIndex" json:"phone"`
	Nickname      string     `gorm:"type:varchar(50)" json:"nickname"`
	Avatar        string     `gorm:"type:varchar(255)" json:"avatar"`
	Password      string     `gorm:"type:varchar(255)" json:"-"`
	Gender        Gender     `gorm:"type:int;default:0" json:"gender"`
	Birthday      *time.Time `gorm:"type:date" json:"birthday,omitempty"`
	Region        string     `gorm:"type:varchar(50)" json:"region"`
	Bio           string     `gorm:"type:varchar(500)" json:"bio"`
	Status        UserStatus `gorm:"type:int;default:0;index" json:"status"`
	LastLoginTime *time.Time `json:"last_login_time,omitempty"`
	LastLoginIP   string     `gorm:"type:varchar(50)" json:"last_login_ip"`
	CreatedAt     time.Time  `gorm:"autoCreateTime" json:"created_at"`
	UpdatedAt     time.Time  `gorm:"autoUpdateTime" json:"updated_at"`
	DeletedAt     *time.Time `gorm:"index" json:"deleted_at,omitempty"`

	// 2FA / TOTP 字段
	TOTPEnabled       bool   `gorm:"default:false" json:"totp_enabled"`
	TOTPSecret        string `gorm:"type:varchar(64)" json:"-"`              // Base32 密钥，不返回给前端
	TOTPRecoveryCodes string `gorm:"type:text" json:"-"`                     // JSON 编码的恢复码列表
}

// TableName 指定表名
func (User) TableName() string {
	return "users"
}
