CREATE TABLE IF NOT EXISTS activity_templates (
  app_code VARCHAR(32) NOT NULL COMMENT '应用编码',
  template_id VARCHAR(96) NOT NULL COMMENT '活动模版 ID',
  template_code VARCHAR(64) NOT NULL COMMENT 'App 内唯一业务编码',
  name VARCHAR(128) NOT NULL COMMENT '后台内部名称',
  activity_type VARCHAR(32) NOT NULL DEFAULT 'gift_challenge' COMMENT '活动类型',
  status VARCHAR(24) NOT NULL DEFAULT 'draft' COMMENT 'draft/published/disabled/archived',
  start_ms BIGINT NOT NULL DEFAULT 0 COMMENT '活动开始，UTC epoch ms，包含',
  end_ms BIGINT NOT NULL DEFAULT 0 COMMENT '活动结束，UTC epoch ms，不包含',
  all_regions BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否覆盖全部区域',
  daily_leaderboard_size INT NOT NULL DEFAULT 100 COMMENT '日榜最多展示人数',
  total_leaderboard_size INT NOT NULL DEFAULT 100 COMMENT '总榜最多展示人数',
  display_config_json JSON NOT NULL COMMENT '客户端布局和样式配置',
  revision BIGINT NOT NULL DEFAULT 1 COMMENT '后台编辑乐观锁版本',
  published_version BIGINT NOT NULL DEFAULT 0 COMMENT '最近发布快照版本',
  created_by_admin_id BIGINT NOT NULL COMMENT '创建管理员',
  updated_by_admin_id BIGINT NOT NULL COMMENT '最后更新管理员',
  published_by_admin_id BIGINT NOT NULL DEFAULT 0 COMMENT '最近发布管理员',
  created_at_ms BIGINT NOT NULL COMMENT '创建时间，UTC epoch ms',
  updated_at_ms BIGINT NOT NULL COMMENT '更新时间，UTC epoch ms',
  published_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '最近发布时间，UTC epoch ms',
  archived_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '软归档时间，UTC epoch ms',
  PRIMARY KEY (app_code, template_id),
  UNIQUE KEY uk_activity_template_code (app_code, template_code),
  KEY idx_activity_template_list (app_code, status, updated_at_ms, template_id),
  KEY idx_activity_template_period (app_code, status, start_ms, end_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='可排期运营活动模版实例';

-- 发布互斥行按 App 串行化“检查重叠 + 写入 published”。仅锁候选活动行会出现两个草稿并发发布时互相不可见的写偏差。
CREATE TABLE IF NOT EXISTS activity_template_publish_locks (
  app_code VARCHAR(32) NOT NULL COMMENT '应用编码',
  updated_at_ms BIGINT NOT NULL COMMENT '最近获取发布锁时间，UTC epoch ms',
  PRIMARY KEY (app_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动模版发布事务互斥行';

CREATE TABLE IF NOT EXISTS activity_template_regions (
  app_code VARCHAR(32) NOT NULL COMMENT '应用编码',
  template_id VARCHAR(96) NOT NULL COMMENT '活动模版 ID',
  region_id BIGINT NOT NULL COMMENT '投放区域 ID',
  created_at_ms BIGINT NOT NULL COMMENT '创建时间，UTC epoch ms',
  PRIMARY KEY (app_code, template_id, region_id),
  KEY idx_activity_template_region_match (app_code, region_id, template_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动模版投放区域';

CREATE TABLE IF NOT EXISTS activity_template_locales (
  app_code VARCHAR(32) NOT NULL COMMENT '应用编码',
  template_id VARCHAR(96) NOT NULL COMMENT '活动模版 ID',
  locale VARCHAR(24) NOT NULL COMMENT 'BCP-47 基础语言码',
  title VARCHAR(160) NOT NULL DEFAULT '' COMMENT '客户端活动标题',
  rules MEDIUMTEXT NOT NULL COMMENT '客户端活动规则正文',
  created_at_ms BIGINT NOT NULL COMMENT '创建时间，UTC epoch ms',
  updated_at_ms BIGINT NOT NULL COMMENT '更新时间，UTC epoch ms',
  PRIMARY KEY (app_code, template_id, locale)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动模版多语言文案';

CREATE TABLE IF NOT EXISTS activity_template_gifts (
  app_code VARCHAR(32) NOT NULL COMMENT '应用编码',
  template_id VARCHAR(96) NOT NULL COMMENT '活动模版 ID',
  gift_id VARCHAR(96) NOT NULL COMMENT 'wallet 礼物 ID',
  sort_order INT NOT NULL DEFAULT 0 COMMENT '展示顺序',
  name VARCHAR(128) NOT NULL DEFAULT '' COMMENT '发布展示名称快照',
  icon_url VARCHAR(512) NOT NULL DEFAULT '' COMMENT '发布展示图标快照',
  coin_price BIGINT NOT NULL DEFAULT 0 COMMENT '发布时金币价格快照，仅供展示',
  price_version VARCHAR(64) NOT NULL DEFAULT '' COMMENT '发布时价格版本快照',
  created_at_ms BIGINT NOT NULL COMMENT '创建时间，UTC epoch ms',
  updated_at_ms BIGINT NOT NULL COMMENT '更新时间，UTC epoch ms',
  PRIMARY KEY (app_code, template_id, gift_id),
  KEY idx_activity_template_gift_match (app_code, gift_id, template_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动模版指定礼物和展示快照';

CREATE TABLE IF NOT EXISTS activity_template_tasks (
  app_code VARCHAR(32) NOT NULL COMMENT '应用编码',
  template_id VARCHAR(96) NOT NULL COMMENT '活动模版 ID',
  task_key VARCHAR(64) NOT NULL COMMENT '模版内稳定任务键',
  task_type VARCHAR(32) NOT NULL COMMENT 'daily_visit/gift_count/gift_coin_amount',
  target_value BIGINT NOT NULL DEFAULT 0 COMMENT '任务达成阈值',
  reward_resource_group_id BIGINT NOT NULL DEFAULT 0 COMMENT 'wallet 奖励资源组 ID',
  sort_order INT NOT NULL DEFAULT 0 COMMENT '展示顺序',
  created_at_ms BIGINT NOT NULL COMMENT '创建时间，UTC epoch ms',
  updated_at_ms BIGINT NOT NULL COMMENT '更新时间，UTC epoch ms',
  PRIMARY KEY (app_code, template_id, task_key)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动模版每日任务配置';

CREATE TABLE IF NOT EXISTS activity_template_rank_rewards (
  app_code VARCHAR(32) NOT NULL COMMENT '应用编码',
  template_id VARCHAR(96) NOT NULL COMMENT '活动模版 ID',
  board_type VARCHAR(16) NOT NULL COMMENT 'daily/total',
  rank_from INT NOT NULL COMMENT '奖励起始名次，闭区间',
  rank_to INT NOT NULL COMMENT '奖励结束名次，闭区间',
  resource_group_id BIGINT NOT NULL DEFAULT 0 COMMENT 'wallet 奖励资源组 ID',
  sort_order INT NOT NULL DEFAULT 0 COMMENT '展示顺序',
  created_at_ms BIGINT NOT NULL COMMENT '创建时间，UTC epoch ms',
  updated_at_ms BIGINT NOT NULL COMMENT '更新时间，UTC epoch ms',
  PRIMARY KEY (app_code, template_id, board_type, rank_from, rank_to)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动模版日榜和总榜名次奖励';

CREATE TABLE IF NOT EXISTS activity_template_assets (
  app_code VARCHAR(32) NOT NULL COMMENT '应用编码',
  template_id VARCHAR(96) NOT NULL COMMENT '活动模版 ID',
  asset_key VARCHAR(64) NOT NULL COMMENT '素材位键',
  locale VARCHAR(24) NOT NULL DEFAULT '*' COMMENT '* 表示共享素材，否则为语言码',
  url VARCHAR(1024) NOT NULL COMMENT 'COS/CDN 素材地址',
  media_type VARCHAR(16) NOT NULL COMMENT 'image/webp/svga/pag',
  sort_order INT NOT NULL DEFAULT 0 COMMENT '展示顺序',
  created_at_ms BIGINT NOT NULL COMMENT '创建时间，UTC epoch ms',
  updated_at_ms BIGINT NOT NULL COMMENT '更新时间，UTC epoch ms',
  PRIMARY KEY (app_code, template_id, asset_key, locale)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动模版客户端素材';

CREATE TABLE IF NOT EXISTS activity_template_versions (
  app_code VARCHAR(32) NOT NULL COMMENT '应用编码',
  template_id VARCHAR(96) NOT NULL COMMENT '活动模版 ID',
  version_no BIGINT NOT NULL COMMENT '单模版递增发布版本',
  snapshot_json JSON NOT NULL COMMENT '发布时完整不可变配置快照',
  published_by_admin_id BIGINT NOT NULL COMMENT '发布管理员',
  published_at_ms BIGINT NOT NULL COMMENT '发布时间，UTC epoch ms',
  PRIMARY KEY (app_code, template_id, version_no),
  KEY idx_activity_template_version_list (app_code, template_id, published_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动模版不可变发布版本';
