SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 清理授权和回执都属于 Wallet owner 库；禁止依赖客户端默认数据库。
USE hyapp_wallet;

-- wallet_outbox 自动清理只新增独立窄表，不 ALTER 热 outbox，也不会触发表重写；member 随未清理归档行增减。
-- 授权行必须由部署流程在隔离库完成 RESTORE_VERIFIED 并核对归档回执后手工写入；迁移本身绝不生成清理授权。
CREATE TABLE IF NOT EXISTS wallet_outbox_archive_members (
  app_code VARCHAR(32) NOT NULL COMMENT '应用编码',
  event_id VARCHAR(128) NOT NULL COMMENT '已归档 wallet_outbox 事件 ID',
  updated_at_ms BIGINT NOT NULL COMMENT '归档时 delivered 行的精确更新时间，UTC epoch ms',
  batch_id CHAR(64) CHARACTER SET ascii COLLATE ascii_bin NOT NULL COMMENT '包含该精确事件的归档批次 ID',
  manifest_sha256 CHAR(64) CHARACTER SET ascii COLLATE ascii_bin NOT NULL COMMENT '包含该事件的 manifest SHA-256',
  receipt_verified_at_ms BIGINT NOT NULL COMMENT '归档 receipt 完成 COS 读回验证的时间，UTC epoch ms',
  PRIMARY KEY (app_code, event_id),
  KEY idx_wallet_outbox_archive_member_purge (app_code, updated_at_ms, event_id),
  KEY idx_wallet_outbox_archive_member_batch (app_code, batch_id, event_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='wallet outbox 已验证归档精确成员';

CREATE TABLE IF NOT EXISTS wallet_outbox_archive_purge_authorizations (
  app_code VARCHAR(32) NOT NULL COMMENT '应用编码',
  archive_batch_id CHAR(64) CHARACTER SET ascii COLLATE ascii_bin NOT NULL COMMENT '完成恢复演练的归档批次内容指纹',
  manifest_sha256 CHAR(64) CHARACTER SET ascii COLLATE ascii_bin NOT NULL COMMENT '恢复演练核对通过的 manifest SHA-256',
  schema_version INT NOT NULL COMMENT '恢复演练核对通过的归档 schema 版本',
  row_count INT NOT NULL COMMENT '恢复演练核对通过的精确行数',
  data_crc64 VARCHAR(32) NOT NULL COMMENT '恢复演练核对通过的 data COS CRC64',
  manifest_crc64 VARCHAR(32) NOT NULL COMMENT '恢复演练核对通过的 manifest COS CRC64',
  success_crc64 VARCHAR(32) NOT NULL COMMENT '恢复演练核对通过的 _SUCCESS COS CRC64',
  rehearsal_receipt_id VARCHAR(64) NOT NULL COMMENT '隔离库 RESTORE_VERIFIED 演练回执 ID',
  state VARCHAR(32) NOT NULL COMMENT '固定为 RESTORE_VERIFIED，其他状态不能授权清理',
  verified_at_ms BIGINT NOT NULL COMMENT '恢复演练验证完成时间，UTC epoch ms',
  created_at_ms BIGINT NOT NULL COMMENT '授权证据录入时间，UTC epoch ms',
  updated_at_ms BIGINT NOT NULL COMMENT '授权证据更新时间，UTC epoch ms',
  PRIMARY KEY (app_code, archive_batch_id, manifest_sha256),
  KEY idx_wallet_outbox_purge_auth_verified (app_code, state, verified_at_ms, archive_batch_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='wallet outbox 恢复演练清理授权证据';

-- 一行只对应一个已提交的精确 PK 删除批次；删除与回执写入同事务，失败或回滚时不会留下虚假清理证据。
CREATE TABLE IF NOT EXISTS wallet_outbox_archive_purge_receipts (
  app_code VARCHAR(32) NOT NULL COMMENT '应用编码',
  purge_id CHAR(64) CHARACTER SET ascii COLLATE ascii_bin NOT NULL COMMENT '清理批次稳定指纹',
  state VARCHAR(32) NOT NULL COMMENT '固定为 PURGED',
  policy_version VARCHAR(32) NOT NULL COMMENT '正向安全事件白名单版本',
  cutoff_ms BIGINT NOT NULL COMMENT '本批固定的 delivered 保留截止时间，UTC epoch ms，删除严格小于该值',
  receipt_verified_before_ms BIGINT NOT NULL COMMENT '独立归档回执成熟截止时间，只有更早 VERIFIED receipt 可清理',
  candidate_sha256 CHAR(64) CHARACTER SET ascii COLLATE ascii_bin NOT NULL COMMENT '按游标排序的精确 (app_code,event_id) 候选集合 SHA-256',
  candidate_count INT NOT NULL COMMENT '事务内锁定的候选行数',
  deleted_count INT NOT NULL COMMENT '精确 PK 删除影响行数，必须与 candidate_count 一致',
  first_updated_at_ms BIGINT NOT NULL COMMENT '首条候选 delivered 游标时间',
  first_event_id VARCHAR(128) NOT NULL COMMENT '首条候选事件 ID',
  last_updated_at_ms BIGINT NOT NULL COMMENT '末条候选 delivered 游标时间',
  last_event_id VARCHAR(128) NOT NULL COMMENT '末条候选事件 ID',
  purged_at_ms BIGINT NOT NULL COMMENT '清理提交时间，UTC epoch ms',
  created_at_ms BIGINT NOT NULL COMMENT '创建时间，UTC epoch ms',
  updated_at_ms BIGINT NOT NULL COMMENT '更新时间，UTC epoch ms',
  PRIMARY KEY (app_code, purge_id),
  KEY idx_wallet_outbox_purge_receipt_time (app_code, purged_at_ms, purge_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='wallet outbox 精确 PK 清理审计回执';
