-- VIP 每日金币返现由 wallet-service 独占：日 run 固化 UTC 日切金额矩阵，用户返现行保存资格、窗口和领取交易。
-- 本迁移可重复执行；不猜测任一等级金额，历史空配置会安全关闭，等待运营填 metadata_json.coin_amount 后再启用。

SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;

USE hyapp_wallet;

CREATE TABLE IF NOT EXISTS vip_daily_coin_rebate_runs (
  app_code VARCHAR(32) NOT NULL COMMENT '应用编码，用于多租户隔离',
  task_day CHAR(10) NOT NULL COMMENT 'UTC 日期，YYYY-MM-DD',
  run_id VARCHAR(96) NOT NULL COMMENT '稳定批任务 ID',
  day_start_ms BIGINT NOT NULL COMMENT 'UTC 当日开始，epoch ms',
  day_end_ms BIGINT NOT NULL COMMENT 'UTC 次日开始，排他结束 epoch ms',
  config_version BIGINT NOT NULL COMMENT '创建 run 时 VIP 配置版本',
  level_amounts_json JSON NOT NULL COMMENT '等级到返现金额的不可变快照',
  status VARCHAR(32) NOT NULL COMMENT 'running/completed',
  last_user_id BIGINT NOT NULL DEFAULT 0 COMMENT '已扫描会员游标',
  scanned_count BIGINT NOT NULL DEFAULT 0 COMMENT '累计扫描会员数',
  created_count 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',
  completed_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '完成时间，UTC epoch ms',
  PRIMARY KEY (app_code, task_day),
  UNIQUE KEY uk_vip_rebate_run_id (app_code, run_id),
  KEY idx_vip_rebate_run_status (app_code, status, task_day)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='VIP 每日金币返现运行快照';

CREATE TABLE IF NOT EXISTS vip_daily_coin_rebates (
  app_code VARCHAR(32) NOT NULL COMMENT '应用编码，用于多租户隔离',
  rebate_id VARCHAR(96) NOT NULL COMMENT '返现事实 ID',
  run_id VARCHAR(96) NOT NULL COMMENT '来源日 run ID',
  task_day CHAR(10) NOT NULL COMMENT 'UTC 日期，YYYY-MM-DD',
  user_id BIGINT NOT NULL COMMENT '领取用户 ID',
  vip_level INT NOT NULL COMMENT 'UTC 日切时付费 VIP 等级快照',
  vip_name VARCHAR(64) NOT NULL COMMENT 'VIP 名称快照',
  coin_amount BIGINT NOT NULL COMMENT '返现金币正整数快照',
  status VARCHAR(32) NOT NULL COMMENT 'claimable/claimed；expired 由查询层投影',
  available_at_ms BIGINT NOT NULL COMMENT '领取开始，UTC epoch ms',
  expires_at_ms BIGINT NOT NULL COMMENT '领取排他结束，UTC epoch ms',
  config_version BIGINT NOT NULL COMMENT '来源 run 的 VIP 配置版本',
  claimed_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '实际领取时间，UTC epoch ms',
  wallet_transaction_id VARCHAR(96) NOT NULL DEFAULT '' COMMENT '领取入账交易 ID',
  created_at_ms BIGINT NOT NULL COMMENT '创建时间，UTC epoch ms',
  updated_at_ms BIGINT NOT NULL COMMENT '更新时间，UTC epoch ms',
  PRIMARY KEY (app_code, rebate_id),
  UNIQUE KEY uk_vip_rebate_user_day (app_code, task_day, user_id),
  KEY idx_vip_rebate_user_day (app_code, user_id, task_day, rebate_id),
  KEY idx_vip_rebate_expiry (app_code, status, expires_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='VIP 每日金币返现领取事实';

UPDATE vip_level_benefits
SET status = 'disabled', trial_enabled = FALSE
WHERE benefit_code = 'daily_coin_rebate'
  AND (
    JSON_EXTRACT(metadata_json, '$.coin_amount') IS NULL
    OR JSON_TYPE(JSON_EXTRACT(metadata_json, '$.coin_amount')) <> 'INTEGER'
    OR CAST(JSON_UNQUOTE(JSON_EXTRACT(metadata_json, '$.coin_amount')) AS DECIMAL(65, 0)) <= 0
    OR CAST(JSON_UNQUOTE(JSON_EXTRACT(metadata_json, '$.coin_amount')) AS DECIMAL(65, 0)) > 9223372036854775807
  );

UPDATE vip_level_benefits
SET trial_enabled = FALSE, execution_scope = 'wallet'
WHERE benefit_code = 'daily_coin_rebate';

UPDATE vip_level_benefits
SET execution_scope = 'notice'
WHERE benefit_code = 'online_global_notice';

-- 已经先上线过领取交易的环境补齐统一 VIP command guard；同 command 不能再被购买、发卡或另一返现复用。
-- 显式限定当前 App 才能使用 wallet_transactions 的 (app_code,biz_type,created_at_ms) 索引；
-- 禁止在生产迁移中只按 biz_type 扫描完整钱包交易表。
INSERT IGNORE INTO vip_command_locks (
  app_code, command_id, biz_type, request_hash, created_at_ms, updated_at_ms
)
SELECT app_code, command_id, biz_type, request_hash, created_at_ms, updated_at_ms
FROM wallet_transactions
WHERE app_code IN ('lalu', 'fami', 'huwaa', 'yumi')
  AND biz_type = 'vip_daily_coin_rebate';
