// Package broadcast 定义 activity-service 拥有的 IM 播报领域事实。
// 这里的对象只描述“需要向哪个腾讯群投递什么消息”，不承载红包金额扣减或房间状态事实。
package broadcast

const (
	// ScopeGlobal 表示 App 内全局群；使用频率低，适合全服运营公告或极少数全服事件。
	ScopeGlobal = "global"
	// ScopeRegion 表示用户所在区域群；贵重礼物、区域红包、区域运营通知默认走这个范围。
	ScopeRegion = "region"
	// ScopeRoom 表示当前语音房 IM 群。
	ScopeRoom = "room"

	// TypeSuperGift 是贵重礼物播报，来源于 room-service 已提交的 RoomGiftSent 事实。
	TypeSuperGift = "super_gift"
	// TypeRedPacket 是红包入口播报，资金事实必须由 wallet/red-packet 领域持久化。
	TypeRedPacket = "red_packet"
	// TypeRoomRocket 是语音房火箭燃料满后的发射倒计时播报。
	TypeRoomRocket = "room_rocket"
	// TypeRoomRocketReward 是语音房火箭发射后中奖明细房间播报。
	TypeRoomRocketReward = "room_rocket_reward_granted"
	// TypeRoomPasswordChanged 是锁房状态变化的区域通知，客户端用它刷新房间锁状态入口。
	TypeRoomPasswordChanged = "room_password_changed"
	// TypeLuckyGiftBigWin 是幸运礼物中奖区域飘屏；当前只让 10 倍及以上大奖进入播报 outbox。
	TypeLuckyGiftBigWin = "lucky_gift_big_win"
	// TypeGameWin 是游戏返奖达到运营阈值后的区域飘屏，来源只能是 game-service 已提交的结算事实。
	TypeGameWin = "game_win"
	// TypeVIPOnlineNotice 是 VIP 用户进入 App 时的全局飘屏。是否允许发送必须由 gateway
	// 先向 wallet-service 校验 effective benefit，activity-service 只负责持久化和 IM 投递。
	TypeVIPOnlineNotice = "vip_online_notice"

	// StatusPending 表示消息已持久化，尚未被 worker claim。
	StatusPending = "pending"
	// StatusDelivering 表示某个 worker 已抢占该记录，锁过期后允许其他 worker 接管。
	StatusDelivering = "delivering"
	// StatusRetryable 表示上次腾讯 REST 失败，但未超过最大重试次数。
	StatusRetryable = "retryable"
	// StatusDelivered 表示腾讯 REST 已接受消息，不代表每个客户端都已展示。
	StatusDelivered = "delivered"
	// StatusFailed 表示达到最大重试次数，需要人工或后台补偿介入。
	StatusFailed = "failed"
	// StatusSkipped 表示消费了上游事件但不满足播报策略，例如礼物价值未达阈值。
	StatusSkipped = "skipped"
)

// OutboxRecord 是一条持久化播报投递记录。
// event_id 是幂等键，group_id 是最终腾讯群目标，payload_json 是客户端渲染和点击跳转所需的完整业务负载。
type OutboxRecord struct {
	AppCode       string
	EventID       string
	Scope         string
	GroupID       string
	BroadcastType string
	PayloadJSON   string
	Status        string
	AttemptCount  int
	NextRetryAtMS int64
	LastError     string
	LockedBy      string
	LockedUntilMS int64
	CreatedAtMS   int64
	UpdatedAtMS   int64
}

// PublishResult 描述一次幂等入队结果；Created=false 表示重复 event_id 命中已有记录。
type PublishResult struct {
	EventID string
	GroupID string
	Status  string
	Created bool
}

// ProcessResult 汇总一次 worker 批处理结果，用于 cron/日志/监控判断是否需要继续拉下一批。
type ProcessResult struct {
	ClaimedCount int
	SuccessCount int
	FailureCount int
	HasMore      bool
}

// ConsumeRoomEventResult 描述 room outbox 事实是否生成播报；跳过也是一种可观测消费结果。
type ConsumeRoomEventResult struct {
	EventID          string
	Status           string
	BroadcastEventID string
	BroadcastCreated bool
}

// ConsumeLuckyGiftEventResult 描述 lucky-gift owner fact 是否生成区域播报；
// EventID 保留来源事实，BroadcastEventID 是 activity-service 自己的幂等投影键。
type ConsumeLuckyGiftEventResult struct {
	EventID          string
	Status           string
	BroadcastEventID string
	BroadcastCreated bool
}

// ConsumeGameEventResult 描述 GameOrderSettled 是否生成 game_win 区域飘屏。
// 来源 event_id 与播报投影 event_id 分开保存，便于定位 MQ 已消费但被阈值跳过的情况。
type ConsumeGameEventResult struct {
	EventID          string
	Status           string
	BroadcastEventID string
	BroadcastCreated bool
}

// GameWinConfig 是 activity-service 按 App 持久化的游戏中奖展示策略。
// 金额单位与 GameOrderSettled.coin_amount 一致，都是整数 COIN 最小展示单位。
type GameWinConfig struct {
	Enabled          bool
	MinWinCoins      int64
	UpdatedByAdminID int64
	CreatedAtMS      int64
	UpdatedAtMS      int64
}

// RedPacketWalletEvent 是 wallet-service 已提交的红包资金事实。
type RedPacketWalletEvent struct {
	AppCode         string
	EventID         string
	EventType       string
	TransactionID   string
	CommandID       string
	PayloadJSON     string
	PacketID        string
	PacketType      string
	RoomID          string
	RegionID        int64
	RegionCode      string
	RoomLocked      bool
	OwnerUserID     int64
	SenderUserID    int64
	SenderAccount   string
	SenderNickname  string
	SenderAvatar    string
	TotalAmount     int64
	TotalCount      int32
	RemainingAmount int64
	RemainingCount  int32
	RefundedAmount  int64
	Status          string
	OpenAtMS        int64
	ExpiresAtMS     int64
	CreatedAtMS     int64
}

// RedPacketCreatedEvent keeps older tests and callers compiling while wallet red-packet facts are generalized.
type RedPacketCreatedEvent = RedPacketWalletEvent
