package achievement

const (
	TypeOrdinary        = "ordinary"
	TypeActivityLimited = "activity_limited"

	CollectionOrdinary = "ordinary"
	CollectionEvent    = "event"
	CycleLifetime      = "lifetime"

	StatusDraft    = "draft"
	StatusActive   = "active"
	StatusPaused   = "paused"
	StatusArchived = "archived"

	ProgressStatusInProgress = "in_progress"
	ProgressStatusCompleted  = "completed"

	UnlockStatusUnlocked = "unlocked"

	EventStatusConsumed  = "consumed"
	EventStatusSkipped   = "skipped"
	EventStatusDuplicate = "duplicate"

	RewardStatusPending = "pending"
	RewardStatusRunning = "running"
	RewardStatusGranted = "granted"
	RewardStatusFailed  = "failed"

	BadgeFormStrip = "strip"
	BadgeFormTile  = "tile"

	BadgeSlotProfileStrip = "profile_strip"
	BadgeSlotProfileTile  = "profile_tile"
	BadgeSlotHonorWall    = "honor_wall"

	SourceAchievement = "achievement"
	SourceSystemGrant = "system_grant"
	SourceLevel       = "level"
	SourceVIP         = "vip"
	SourceIdentity    = "identity"

	AutoPinNone    = "none"
	AutoPinIfEmpty = "if_empty"
	AutoPinAlways  = "always"

	GrantSourceAchievement = "achievement"
)

// Definition is an achievement rule configured by operations.
type Definition struct {
	AppCode                string
	AchievementID          string
	CollectionID           string
	CollectionType         string
	AchievementType        string
	Title                  string
	Description            string
	Status                 string
	Version                int64
	PrimaryBadgeResourceID int64
	RewardResourceGroupID  int64
	AutoPinPolicy          string
	HonorVisibility        bool
	EffectiveFromMS        int64
	EffectiveToMS          int64
	SortOrder              int32
	DisplayConfigJSON      string
	CreatedByAdminID       int64
	UpdatedByAdminID       int64
	CreatedAtMS            int64
	UpdatedAtMS            int64
	Conditions             []Condition
}

// Condition is one AND condition of an achievement definition.
type Condition struct {
	AppCode             string
	ConditionID         string
	AchievementID       string
	Version             int64
	MetricType          string
	TargetValue         int64
	TargetUnit          string
	DimensionFilterJSON string
	CreatedAtMS         int64
}

// UserAchievement is the App read model for one achievement and user.
type UserAchievement struct {
	Definition
	CycleKey      string
	ProgressValue int64
	TargetValue   int64
	UserStatus    string
	UnlockedAtMS  int64
	RewardStatus  string
}

// Event is a server-side fact consumed by achievements.
type Event struct {
	EventID        string
	EventType      string
	SourceService  string
	UserID         int64
	MetricType     string
	Value          int64
	OccurredAtMS   int64
	DimensionsJSON string
}

// EventResult describes idempotent consumption outcome.
type EventResult struct {
	EventID                  string
	Status                   string
	MatchedAchievementCount  int32
	UnlockedAchievementCount int32
	RewardJobCount           int64
}

// RewardJob is an async wallet resource group grant for achievement rewards.
type RewardJob struct {
	AppCode         string
	RewardJobID     string
	UserID          int64
	AchievementID   string
	CycleKey        string
	ResourceGroupID int64
	WalletCommandID string
	WalletGrantID   string
	Status          string
	AttemptCount    int32
	FailureReason   string
	CreatedAtMS     int64
	UpdatedAtMS     int64
}

// BadgeDisplayItem is a badge slot item rendered on profile or honor surfaces.
type BadgeDisplayItem struct {
	UserID        int64
	Slot          string
	Position      int32
	BadgeForm     string
	ResourceID    int64
	EntitlementID string
	SourceType    string
	SourceID      string
	PinMode       string
	UpdatedAtMS   int64
}

// BadgeProfile groups badge display slots for App reads.
type BadgeProfile struct {
	StripBadges       []BadgeDisplayItem
	ProfileTileBadges []BadgeDisplayItem
	HonorBadges       []BadgeDisplayItem
	ServerTimeMS      int64
}

// DisplayCommand updates one user-controlled badge display slot.
type DisplayCommand struct {
	UserID    int64
	Slot      string
	Items     []BadgeDisplayItem
	CommandID string
}

// DefinitionCommand creates or updates one achievement definition.
type DefinitionCommand struct {
	AchievementID          string
	CollectionID           string
	CollectionType         string
	AchievementType        string
	Title                  string
	Description            string
	Status                 string
	PrimaryBadgeResourceID int64
	RewardResourceGroupID  int64
	AutoPinPolicy          string
	HonorVisibility        bool
	EffectiveFromMS        int64
	EffectiveToMS          int64
	SortOrder              int32
	DisplayConfigJSON      string
	OperatorAdminID        int64
	Conditions             []ConditionCommand
}

// ConditionCommand is the writable shape for achievement conditions.
type ConditionCommand struct {
	MetricType          string
	TargetValue         int64
	TargetUnit          string
	DimensionFilterJSON string
}

// ListQuery filters achievements for App/Admin reads.
type ListQuery struct {
	UserID         int64
	CollectionType string
	CollectionID   string
	Status         string
	Page           int32
	PageSize       int32
}
