"""ad_reward_record.boost_round_id(金币膨胀「本轮累计」标签)

看完一条激励视频后客户端要弹「本轮累计获得 N 金币」,N 必须等于这一轮实际到账之和(否则用户
会认为少发了钱)。单条到账额 reward-result 已经能给,但「一轮」的边界只有客户端知道(点「放弃
赚钱」才算结束),客户端自己累加又会在进程被杀后丢失。

解法:客户端把轮次 id 随 mediaExtra 透传,穿山甲 S2S 原样带回,发奖时打在记录上;
reward-result 按 (user_id, boost_round_id) 对 granted 记录求和返回 round_coin。

本列是**纯标签**:不参与发奖判定,发多少/发不发完全不受影响。客户端就算一直复用同一个 id,
也只是把展示数字滚大,不产生任何新入账(求和的是已发生的发奖记录),无资损风险。

Revision ID: ad_reward_boost_round_id
Revises: comparison_llm_cost
Create Date: 2026-07-20
"""
from collections.abc import Sequence

import sqlalchemy as sa

from alembic import op

revision: str = "ad_reward_boost_round_id"
down_revision: str | Sequence[str] | None = "comparison_llm_cost"
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def upgrade() -> None:
    # 可空、无默认:SQLite 原生支持 ADD COLUMN,不需要 batch_alter_table(同 comparison_llm_cost)。
    # 存量行留 NULL = 「不属于任何一轮」,求和时天然不参与,老客户端行为不变。
    op.add_column(
        "ad_reward_record",
        sa.Column("boost_round_id", sa.String(length=64), nullable=True),
    )
    # 求和恒带 user_id(轮 id 是客户端生成的,不能跨用户信任),故建复合索引而非单列
    op.create_index(
        "ix_ad_reward_user_boost_round",
        "ad_reward_record",
        ["user_id", "boost_round_id"],
        unique=False,
    )


def downgrade() -> None:
    op.drop_index("ix_ad_reward_user_boost_round", table_name="ad_reward_record")
    op.drop_column("ad_reward_record", "boost_round_id")
