package game

const (
	StatusActive      = "active"
	StatusMaintenance = "maintenance"
	StatusDisabled    = "disabled"

	SceneVoiceRoom = "voice_room"

	PlatformCodeZGame = "zgame"
	PlatformCodeAMG   = "amg"

	LaunchModeFullScreen         = "full_screen"
	LaunchModeHalfScreen         = "half_screen"
	LaunchModeThreeQuarterScreen = "three_quarter_screen"
	LaunchModeH5Popup            = "h5_popup"
	SessionActive                = "active"

	AdapterDemo        = "demo"
	AdapterYomiV4      = "yomi_v4"
	AdapterLeaderCCV1  = "leadercc_v1"
	AdapterZeeOneV1    = "zeeone_v1"
	AdapterBaishunV1   = "baishun_v1"
	AdapterVivaGamesV1 = "vivagames_v1"
	AdapterReyouV1     = "reyou_v1"
	AdapterZGameV1     = "zgame_v1"
	AdapterAMGV1       = "amg_v1"

	OrderStatusWalletApplying = "wallet_applying"
	OrderStatusSucceeded      = "succeeded"
	OrderStatusFailed         = "failed"
	OrderStatusConflict       = "conflict"

	RepairStatusLogged = "logged"

	LevelEventStatusPending   = "pending"
	LevelEventStatusRunning   = "running"
	LevelEventStatusDelivered = "delivered"
	LevelEventStatusFailed    = "failed"
)

// Platform 是第三方游戏平台配置事实。
type Platform struct {
	AppCode      string
	PlatformCode string
	PlatformName string
	Status       string
	// APIBaseURL 是厂商 H5/Auth 入口，按环境在后台改，不放服务配置文件。
	APIBaseURL string
	// AdapterType 决定启动参数、签名/解密规则、回包结构和错误码映射。
	AdapterType string
	// CallbackSecretCiphertext 存放厂商 key/AppSecret；后台配置页需要回显，回调校验也直接使用它。
	CallbackSecretCiphertext string
	CallbackSecretConfigured bool
	// CallbackIPWhitelist 为空表示不限制；配置后支持单 IP 或 CIDR。
	CallbackIPWhitelist []string
	// AdapterConfigJSON 存放 uid_mode/default_lang/token_ttl_seconds 等厂商扩展项。
	AdapterConfigJSON string
	SortOrder         int32
	CreatedAtMS       int64
	UpdatedAtMS       int64
}

// CatalogItem 是内部稳定 game_id 到第三方 provider_game_id 的映射。
type CatalogItem struct {
	AppCode        string
	GameID         string
	PlatformCode   string
	ProviderGameID string
	GameName       string
	Category       string
	IconURL        string
	CoverURL       string
	LaunchMode     string
	Orientation    string
	SafeHeight     int32
	MinCoin        int64
	Status         string
	SortOrder      int32
	Tags           []string
	CreatedAtMS    int64
	UpdatedAtMS    int64
	// WhitelistEnabled 默认 false，保证迁移后旧游戏仍面向原有用户集合开放。
	WhitelistEnabled bool
}

// WhitelistUser 保存目录访问成员和后台操作来源；用户昵称、头像等主数据仍由 user-service 持有。
type WhitelistUser struct {
	AppCode          string
	GameID           string
	UserID           int64
	CreatedByAdminID int64
	CreatedAtMS      int64
}

// AppGame 是 App 语音房内看到的跨平台合并游戏卡片。
type AppGame struct {
	GameID       string
	PlatformCode string
	NameKey      string
	Name         string
	IconURL      string
	CoverURL     string
	Category     string
	LaunchMode   string
	Orientation  string
	SafeHeight   int32
	MinCoin      int64
	Enabled      bool
	Maintenance  bool
	SortOrder    int32
}

// LaunchableGame 汇总启动时需要的平台和目录配置。
type LaunchableGame struct {
	CatalogItem
	PlatformName   string
	PlatformStatus string
	// 以下平台字段随 catalog 一起取出，启动链路不再额外查一次平台配置。
	APIBaseURL               string
	AdapterType              string
	CallbackSecretCiphertext string
	CallbackIPWhitelist      []string
	AdapterConfigJSON        string
}

// LaunchSession 是 H5 启动会话持久事实，token 只保存 hash。
type LaunchSession struct {
	AppCode   string
	SessionID string
	UserID    int64
	// DisplayUserID 用于对外 uid_mode，避免直接暴露内部数字 ID。
	DisplayUserID string
	RoomID        string
	RegionID      int64
	CountryID     int64
	Scene         string
	PlatformCode  string
	GameID        string
	// ProviderGameID 是厂商侧 gameId/gameUid，回调时用它防止跨游戏复用 token。
	ProviderGameID  string
	LaunchTokenHash string
	Status          string
	ExpiresAtMS     int64
	CreatedAtMS     int64
	UpdatedAtMS     int64
}

// GameOrder 是 provider_order_id 对应的钱包改账事实。
type GameOrder struct {
	AppCode      string
	OrderID      string
	PlatformCode string
	// ProviderOrderID 是厂商幂等键，唯一索引用它挡住重复扣款/返奖。
	ProviderOrderID string
	// ProviderRoundID 用于关联同一局的投注和返奖。
	ProviderRoundID string
	GameID          string
	ProviderGameID  string
	UserID          int64
	RoomID          string
	RegionID        int64
	CountryID       int64
	// OpType 只允许钱包语义 debit/credit，厂商枚举在适配器层转换。
	OpType              string
	CoinAmount          int64
	Status              string
	WalletTransactionID string
	WalletBalanceAfter  int64
	RequestHash         string
	FailureCode         string
	FailureMessage      string
	CreatedAtMS         int64
	UpdatedAtMS         int64
}

// LevelEventOutbox 是游戏扣费订单到 activity-service 游戏等级的异步投递事实。
type LevelEventOutbox struct {
	AppCode             string
	EventID             string
	OrderID             string
	UserID              int64
	GameID              string
	ProviderOrderID     string
	ProviderRoundID     string
	CoinAmount          int64
	WalletTransactionID string
	PayloadJSON         string
	Status              string
	AttemptCount        int32
	FailureReason       string
	OccurredAtMS        int64
	CreatedAtMS         int64
	UpdatedAtMS         int64
}

// CallbackLog 保存平台回调审计摘要，原始 body 后续可迁移到对象存储。
type CallbackLog struct {
	AppCode           string
	CallbackID        string
	PlatformCode      string
	Operation         string
	RequestID         string
	ProviderRequestID string
	// SignatureValid 用来区分验签失败、业务失败和系统失败，便于联调排错。
	SignatureValid bool
	// RequestHash/ResponseBodyHash 避免把 token、签名、用户资料等敏感原文直接进日志表。
	RequestHash      string
	ResponseCode     string
	ResponseBodyHash string
	Status           string
	CreatedAtMS      int64
}

// RepairOrder 是三方补单请求的最小审计事实；首版可只落库不改账。
type RepairOrder struct {
	AppCode      string
	RepairID     string
	PlatformCode string
	// ProviderOrderID 唯一约束保证重复补单只产生一条审计事实。
	ProviderOrderID string
	// Reason 标记来源厂商和接口，后续补偿任务可以按 reason 选择不同策略。
	Reason          string
	Status          string
	OperatorAdminID int64
	Attempts        int32
	NextRunAtMS     int64
	LastErrorCode   string
	CreatedAtMS     int64
	UpdatedAtMS     int64
}
