"""Restamp Feature Pack contract V2.1 onto catalog composition JSON.

Re-applies typed contract fields after V2.1: entity-level contracts only,
optional contact email, booking primitives, protected checkout webhook,
planner preference, versioned events.

Revision ID: 135
Revises: 134
"""
from datetime import datetime, timezone

from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

revision = "135"
down_revision = "134"
branch_labels = None
depends_on = None

feature_packs = sa.table(
    "feature_packs",
    sa.column("slug", sa.String),
    sa.column("composition", postgresql.JSONB),
    sa.column("access_policy", postgresql.JSONB),
    sa.column("input_schema", postgresql.JSONB),
    sa.column("version", sa.String),
    sa.column("updated_at", sa.DateTime(timezone=True)),
)


def upgrade() -> None:
    from src.domain.feature_packs.normalize import stamp_composition

    conn = op.get_bind()
    rows = conn.execute(
        sa.select(
            feature_packs.c.slug,
            feature_packs.c.composition,
            feature_packs.c.access_policy,
            feature_packs.c.input_schema,
            feature_packs.c.version,
        )
    ).fetchall()
    now = datetime.now(timezone.utc)
    for slug, composition, access_policy, input_schema, version in rows:
        if not isinstance(composition, dict):
            continue
        stamped = stamp_composition(
            slug,
            composition,
            access_policy=access_policy if isinstance(access_policy, dict) else None,
            implementation_version=version,
        )
        values: dict = {"composition": stamped, "updated_at": now}
        if slug == "payment-checkout" and isinstance(input_schema, dict):
            schema = dict(input_schema)
            props = dict(schema.get("properties") or {})
            props.pop("webhook_forward_url", None)
            schema["properties"] = props
            required = [
                key
                for key in (schema.get("required") or [])
                if key != "webhook_forward_url"
            ]
            if required:
                schema["required"] = required
            else:
                schema.pop("required", None)
            values["input_schema"] = schema
        conn.execute(
            sa.update(feature_packs)
            .where(feature_packs.c.slug == slug)
            .values(**values)
        )


def downgrade() -> None:
    return
