package domain

import "time"

// UserID is a strongly-typed identifier for users.
type UserID string

// String returns the string representation of the UserID.
func (id UserID) String() string {
	return string(id)
}

// Preferences holds the user's preference settings.
type Preferences struct {
	Theme         string               `json:"theme"`
	Language      string               `json:"language"`
	Notifications NotificationSettings `json:"notifications"`
}

// NotificationSettings holds notification-related preferences.
type NotificationSettings struct {
	Email  bool   `json:"email"`
	Push   bool   `json:"push"`
	Digest string `json:"digest"`
}

// UserPreferences is the domain entity representing a user's full preference record.
type UserPreferences struct {
	UserID      UserID
	Preferences Preferences
	UpdatedAt   time.Time
}

// DefaultPreferences returns the default preference values.
func DefaultPreferences() Preferences {
	return Preferences{
		Theme:    "system",
		Language: "en",
		Notifications: NotificationSettings{
			Email:  true,
			Push:   true,
			Digest: "weekly",
		},
	}
}

// Allowed values.
var (
	allowedThemes  = map[string]bool{"light": true, "dark": true, "system": true}
	allowedDigests = map[string]bool{"daily": true, "weekly": true, "never": true}
)

// Validate checks that all preference values are valid.
func (p *Preferences) Validate() error {
	if !allowedThemes[p.Theme] {
		return ErrInvalidTheme
	}
	if p.Language == "" {
		return ErrInvalidLanguage
	}
	if !allowedDigests[p.Notifications.Digest] {
		return ErrInvalidDigest
	}
	return nil
}
