// Package message defines the App message tab inbox domain owned by activity-service.
package message

const (
	// SectionUser is sourced from Tencent IM SDK and never persisted by this service.
	SectionUser = "user"
	// SectionSystem stores account, wallet, room and application notifications.
	SectionSystem = "system"
	// SectionActivity stores activity, reward and operational campaign notifications.
	SectionActivity = "activity"

	SourceTencentIMSDK = "tencent_im_sdk"
	SourceBackend      = "backend"

	StatusVisible  = "visible"
	StatusRecalled = "recalled"
	StatusHidden   = "hidden"
	StatusExpired  = "expired"

	FanoutStatusPending  = "pending"
	FanoutStatusRunning  = "running"
	FanoutStatusRetrying = "retrying"
	FanoutStatusFailed   = "failed"
	FanoutStatusComplete = "completed"

	TargetScopeSingleUser     = "single_user"
	TargetScopeUserIDs        = "user_ids"
	TargetScopeRegion         = "region"
	TargetScopeCountry        = "country"
	TargetScopeAllActiveUsers = "all_active_users"
)

// TabSection is the message tab summary returned to App clients.
type TabSection struct {
	Section     string
	Title       string
	UnreadCount int64
	Source      string
}

// InboxMessage is the user-visible snapshot stored in user_inbox_messages.
type InboxMessage struct {
	AppCode           string
	MessageID         string
	UserID            int64
	MessageType       string
	Producer          string
	ProducerEventID   string
	ProducerEventType string
	AggregateType     string
	AggregateID       string
	TemplateID        string
	TemplateVersion   string
	Title             string
	Summary           string
	Body              string
	IconURL           string
	ImageURL          string
	ActionType        string
	ActionParam       string
	Priority          int32
	Status            string
	ReadAtMS          int64
	DeletedAtMS       int64
	SentAtMS          int64
	ExpireAtMS        int64
	MetadataJSON      string
	CreatedAtMS       int64
	UpdatedAtMS       int64
}

// Read reports whether the user has marked the message as read.
func (m InboxMessage) Read() bool {
	return m.ReadAtMS > 0
}

// MessageTemplate is an active server-owned content template snapshot source.
type MessageTemplate struct {
	AppCode         string
	TemplateID      string
	TemplateVersion string
	MessageType     string
	Locale          string
	Title           string
	Summary         string
	Body            string
	IconURL         string
	ImageURL        string
	ActionType      string
	ActionParam     string
	Status          string
	CreatedBy       string
	CreatedAtMS     int64
	UpdatedAtMS     int64
}

// ListQuery is the stable cursor query for system/activity inbox lists.
type ListQuery struct {
	UserID          int64
	Section         string
	Limit           int
	CursorSentAtMS  int64
	CursorMessageID string
	NowMS           int64
}

// CreateInput carries a validated single-user inbox creation command.
type CreateInput struct {
	TargetUserID      int64
	Producer          string
	ProducerEventID   string
	ProducerEventType string
	MessageType       string
	AggregateType     string
	AggregateID       string
	TemplateID        string
	TemplateVersion   string
	Title             string
	Summary           string
	Body              string
	IconURL           string
	ImageURL          string
	ActionType        string
	ActionParam       string
	Priority          int32
	SentAtMS          int64
	ExpireAtMS        int64
	MetadataJSON      string
}

// FanoutJob stores a background fanout command without executing user selection in the request path.
type FanoutJob struct {
	AppCode              string
	JobID                string
	CommandID            string
	MessageType          string
	TargetScope          string
	TargetFilterJSON     string
	TemplateSnapshotJSON string
	Status               string
	AttemptCount         int32
	CursorUserID         int64
	TotalCount           int64
	SuccessCount         int64
	FailureCount         int64
	BatchSize            int32
	NextRunAtMS          int64
	LockedBy             string
	LockedUntilMS        int64
	ErrorMessage         string
	CreatedBy            string
	CreatedAtMS          int64
	UpdatedAtMS          int64
}

// CreateFanoutInput is the validated admin or producer command for fanout job creation.
type CreateFanoutInput struct {
	CommandID            string
	MessageType          string
	TargetScope          string
	TargetFilterJSON     string
	TemplateSnapshotJSON string
	BatchSize            int32
	CreatedBy            string
}
