"""Phase 5: ImageAsset variant 컬럼 추가 (variant_index/label/t2i_guide).

Outlook 패턴(C01 캐릭터 + O01/O02 의상)을 backgrounds 도메인으로 확장.
- floor_plan 행: variant_index=0, variant_label="v00"
- chain_bg 행: variant_index=1+, variant_label="v01"+ (location 별 순차)
- t2i_guide: shot t2i 주입용 가이드 텍스트 (Phase 6에서 scene_detail이 lookup)

기존 Phase 3+4 row는 server_default("0", "v00", NULL)로 자동 backfill.

Revision ID: 002_phase5_image_asset_variants
Revises: 001_add_indexes
Create Date: 2026-04-29
"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = "002_phase5_image_asset_variants"
down_revision: Union[str, None] = "001_add_indexes"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
    """Add variant_index, variant_label, t2i_guide columns to image_asset.

    server_default ensures existing rows are backfilled atomically without
    a separate UPDATE step. NOT NULL columns are safe because Postgres
    rewrites the table with the default value during ALTER TABLE.
    """
    op.add_column(
        "image_asset",
        sa.Column(
            "variant_index",
            sa.Integer(),
            nullable=False,
            server_default="0",
        ),
    )
    op.add_column(
        "image_asset",
        sa.Column(
            "variant_label",
            sa.String(length=8),
            nullable=False,
            server_default="v00",
        ),
    )
    op.add_column(
        "image_asset",
        sa.Column(
            "t2i_guide",
            sa.Text(),
            nullable=True,
        ),
    )
    # NOTE: Plan §Task 1.5 mentions extending an existing
    # (project_id, asset_type, short_id) unique constraint with variant_index.
    # The current image_asset schema has NO short_id column and NO unique
    # constraint — Phase 3+4 use entity_id/still_id with application-level
    # UPSERT. The unique constraint extension is therefore deferred to
    # T5/T7 when short_id is introduced. This migration is purely additive.


def downgrade() -> None:
    """Drop the three columns. Reverse order of upgrade for cleanliness."""
    op.drop_column("image_asset", "t2i_guide")
    op.drop_column("image_asset", "variant_label")
    op.drop_column("image_asset", "variant_index")
