"""Declare payment-checkout's Stripe webhook subscription need in its composition.

Revision ID: 102
Revises: 101
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

revision = "102"
down_revision = "101"
branch_labels = None
depends_on = None

feature_packs = sa.table(
    "feature_packs",
    sa.column("slug", sa.String),
    sa.column("composition", postgresql.JSONB),
    sa.column("input_schema", postgresql.JSONB),
)

_WEBHOOKS_ENTRY = [
    {
        "provider": "stripe",
        "event_types": ["checkout.session.completed"],
        # codegen must supply config.webhook_forward_url — its own BFF route that reconciles
        # the completed checkout (e.g. creates the order record) — in p2hs/feature-packs.json.
        "forward_url_config_key": "webhook_forward_url",
    },
]

_INPUT_SCHEMA = {
    "type": "object",
    "properties": {
        "webhook_forward_url": {
            "type": "string",
            "description": (
                "Your app's own BFF route that receives the verified checkout.session.completed "
                "event and performs the actual reconciliation (e.g. create the order record). "
                "Required — the pack cannot deliver webhook events without it."
            ),
        },
    },
    "required": ["webhook_forward_url"],
}


def upgrade() -> None:
    conn = op.get_bind()
    row = conn.execute(
        sa.select(feature_packs.c.composition).where(feature_packs.c.slug == "payment-checkout")
    ).first()
    if row is None:
        return
    composition = dict(row[0] or {})
    composition["webhooks"] = _WEBHOOKS_ENTRY
    conn.execute(
        feature_packs.update()
        .where(feature_packs.c.slug == "payment-checkout")
        .values(composition=composition, input_schema=_INPUT_SCHEMA)
    )


def downgrade() -> None:
    conn = op.get_bind()
    row = conn.execute(
        sa.select(feature_packs.c.composition).where(feature_packs.c.slug == "payment-checkout")
    ).first()
    if row is None:
        return
    composition = dict(row[0] or {})
    composition.pop("webhooks", None)
    conn.execute(
        feature_packs.update()
        .where(feature_packs.c.slug == "payment-checkout")
        .values(composition=composition, input_schema={"type": "object", "properties": {}})
    )
