package activitytemplate

const (
	// ActivityTypeGiftChallenge 是当前原型对应的礼物挑战赛；类型字段保留，后续模板类型可复用同一生命周期框架。
	ActivityTypeGiftChallenge = "gift_challenge"

	StatusDraft     = "draft"
	StatusPublished = "published"
	StatusDisabled  = "disabled"
	StatusArchived  = "archived"

	LifecycleDraft     = "draft"
	LifecycleScheduled = "scheduled"
	LifecycleOngoing   = "ongoing"
	LifecycleEnded     = "ended"
	LifecycleDisabled  = "disabled"
	LifecycleArchived  = "archived"

	TaskTypeDailyVisit     = "daily_visit"
	TaskTypeGiftCount      = "gift_count"
	TaskTypeGiftCoinAmount = "gift_coin_amount"

	BoardTypeDaily = "daily"
	BoardTypeTotal = "total"

	SharedAssetLocale = "*"
)

// Locale 是活动页的单语言文案。运行侧先匹配用户语言，再回退到英语，避免把后台内部名称暴露给客户端。
type Locale struct {
	Locale string `json:"locale"`
	Title  string `json:"title"`
	Rules  string `json:"rules"`
}

// Gift 是参与任务和排行榜计分的礼物引用；礼物价格和上下架状态仍由礼物 owner 服务维护。
type Gift struct {
	GiftID       string `json:"gift_id"`
	SortOrder    int32  `json:"sort_order"`
	Name         string `json:"name"`
	IconURL      string `json:"icon_url"`
	CoinPrice    int64  `json:"coin_price"`
	PriceVersion string `json:"price_version"`
}

// RewardItem is the safe client-facing projection copied from a wallet-owned pinned resource-group
// snapshot. It intentionally excludes grant strategies, admin IDs and mutable catalog metadata.
type RewardItem struct {
	ItemType          string `json:"item_type"`
	ResourceID        int64  `json:"resource_id"`
	ResourceType      string `json:"resource_type"`
	Name              string `json:"name"`
	IconURL           string `json:"icon_url"`
	Quantity          int64  `json:"quantity"`
	DurationMS        int64  `json:"duration_ms"`
	WalletAssetType   string `json:"wallet_asset_type"`
	WalletAssetAmount int64  `json:"wallet_asset_amount"`
	SortOrder         int32  `json:"sort_order"`
}

type RewardSnapshot struct {
	SourceGroupID int64        `json:"source_group_id"`
	SnapshotID    string       `json:"snapshot_id"`
	VersionNo     int64        `json:"version_no"`
	SnapshotHash  string       `json:"snapshot_hash"`
	Name          string       `json:"name"`
	Items         []RewardItem `json:"items"`
}

// Task 是活动实例内的每日任务档位。奖励引用资源组，使复杂资产组合仍由 wallet-service 原子发放。
type Task struct {
	TaskKey               string         `json:"task_key"`
	TaskType              string         `json:"task_type"`
	TargetValue           int64          `json:"target_value"`
	RewardResourceGroupID int64          `json:"reward_resource_group_id"`
	SortOrder             int32          `json:"sort_order"`
	RewardSnapshot        RewardSnapshot `json:"reward_snapshot"`
}

// RankReward 是一个不重叠的名次区间。区间使用闭区间，活动周期本身仍使用 [start_ms,end_ms)。
type RankReward struct {
	BoardType       string         `json:"board_type"`
	RankFrom        int32          `json:"rank_from"`
	RankTo          int32          `json:"rank_to"`
	ResourceGroupID int64          `json:"resource_group_id"`
	SortOrder       int32          `json:"sort_order"`
	RewardSnapshot  RewardSnapshot `json:"reward_snapshot"`
}

// Asset 是活动页素材清单；Locale="*" 是共享素材，具体语言素材覆盖共享项。
type Asset struct {
	AssetKey  string `json:"asset_key"`
	Locale    string `json:"locale"`
	URL       string `json:"url"`
	MediaType string `json:"media_type"`
	SortOrder int32  `json:"sort_order"`
}

// Template 是运营后台称作“活动模版”的可排期活动实例。
// Revision 用于后台乐观锁，PublishedVersion 指向最近一次发布形成的不可变完整快照，两者不能混用。
type Template struct {
	AppCode              string       `json:"app_code"`
	TemplateID           string       `json:"template_id"`
	TemplateCode         string       `json:"template_code"`
	Name                 string       `json:"name"`
	ActivityType         string       `json:"activity_type"`
	Status               string       `json:"status"`
	LifecycleStatus      string       `json:"lifecycle_status"`
	StartMS              int64        `json:"start_ms"`
	EndMS                int64        `json:"end_ms"`
	AllRegions           bool         `json:"all_regions"`
	RegionIDs            []int64      `json:"region_ids"`
	Locales              []Locale     `json:"locales"`
	Gifts                []Gift       `json:"gifts"`
	Tasks                []Task       `json:"tasks"`
	DailyLeaderboardSize int32        `json:"daily_leaderboard_size"`
	TotalLeaderboardSize int32        `json:"total_leaderboard_size"`
	RankRewards          []RankReward `json:"rank_rewards"`
	Assets               []Asset      `json:"assets"`
	DisplayConfigJSON    string       `json:"display_config_json"`
	Revision             int64        `json:"revision"`
	PublishedVersion     int64        `json:"published_version"`
	CreatedByAdminID     int64        `json:"created_by_admin_id"`
	UpdatedByAdminID     int64        `json:"updated_by_admin_id"`
	PublishedByAdminID   int64        `json:"published_by_admin_id"`
	CreatedAtMS          int64        `json:"created_at_ms"`
	UpdatedAtMS          int64        `json:"updated_at_ms"`
	PublishedAtMS        int64        `json:"published_at_ms"`
	ArchivedAtMS         int64        `json:"archived_at_ms"`
}

// Summary 是列表专用轻量投影，只附带区域范围，不加载规则、任务、榜单奖励和素材大字段。
type Summary struct {
	AppCode          string
	TemplateID       string
	TemplateCode     string
	Name             string
	ActivityType     string
	Status           string
	LifecycleStatus  string
	StartMS          int64
	EndMS            int64
	AllRegions       bool
	RegionIDs        []int64
	Revision         int64
	PublishedVersion int64
	CreatedByAdminID int64
	UpdatedByAdminID int64
	CreatedAtMS      int64
	UpdatedAtMS      int64
}

// ListQuery 是后台列表筛选。Status 同时接受持久状态和 scheduled/ongoing/ended 生命周期状态。
type ListQuery struct {
	Keyword    string
	Status     string
	RegionID   *int64
	AllRegions *bool
	StartMS    int64
	EndMS      int64
	Page       int32
	PageSize   int32
	NowMS      int64
}

// UpdateCommand 承载整份配置替换；子配置必须和主表在一个事务里提交，避免读到半份模板。
type UpdateCommand struct {
	Template         Template
	ExpectedRevision int64
	OperatorAdminID  int64
}

// StatusCommand 是发布、停用和软归档的乐观锁命令。
type StatusCommand struct {
	TemplateID       string
	Status           string
	ExpectedRevision int64
	OperatorAdminID  int64
	RewardSnapshots  map[int64]RewardSnapshot
}

// Version 是一次发布的不可变快照。Snapshot 让后台可以审阅历史版本，运行侧也能按版本稳定读取配置。
type Version struct {
	TemplateID         string
	VersionNo          int64
	Snapshot           Template
	PublishedByAdminID int64
	PublishedAtMS      int64
	RuntimeFromMS      int64
	RuntimeToMS        int64
}

// CloneCommand 明确复制源版本和目标业务编码；源版本为 0 时复制当前编辑态配置。
type CloneCommand struct {
	SourceTemplateID string
	SourceVersion    int64
	TemplateCode     string
	Name             string
	OperatorAdminID  int64
}

// ValidationIssue 是可绑定到表单字段的稳定校验结果；Code 给前端做国际化，Message 便于后台直接展示。
type ValidationIssue struct {
	Field   string
	Code    string
	Message string
}
