package domain

import "time"

// UserID is a typed user identifier with prefix "usr_".
type UserID string

// UserStatus represents the account state.
type UserStatus string

const (
	UserStatusActive      UserStatus = "active"
	UserStatusSuspended   UserStatus = "suspended"
	UserStatusDeactivated UserStatus = "deactivated"
)

// User is the full domain model for a registered user.
// This is the database-backed identity, separate from auth.User which is the
// lightweight JWT-derived identity carried in request context.
type User struct {
	ID            UserID
	Email         string
	EmailVerified bool
	Name          string
	AvatarURL     string
	Status        UserStatus
	Roles         []string
	LastLoginAt   *time.Time
	CreatedAt     time.Time
	UpdatedAt     time.Time
}

// Validation constants for user fields.
const (
	MaxNameLen  = 100
	MaxEmailLen = 254 // RFC 5321
)

// NewUser creates a new user with default values.
func NewUser(id UserID, email, name string) *User {
	now := time.Now()
	return &User{
		ID:            id,
		Email:         email,
		EmailVerified: false,
		Name:          name,
		Status:        UserStatusActive,
		Roles:         []string{"user"},
		CreatedAt:     now,
		UpdatedAt:     now,
	}
}
