"""Feature packs: feature_packs catalog, project_feature_packs install state.

Revision ID: 098
Revises: 097
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

revision = "098"
down_revision = "097"
branch_labels = None
depends_on = None


def upgrade() -> None:
    # ------------------------------------------------------------------
    # feature_packs — platform feature-pack catalog
    # ------------------------------------------------------------------
    op.create_table(
        "feature_packs",
        sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True),
        sa.Column("slug", sa.String(64), nullable=False),
        sa.Column("name", sa.String(120), nullable=False),
        sa.Column("description", sa.Text, nullable=True),
        sa.Column("version", sa.String(20), nullable=False, server_default="1.0.0"),
        sa.Column("tags", postgresql.JSONB, nullable=True),
        # active | deprecated
        sa.Column("status", sa.String(20), nullable=False, server_default="active"),
        # {"function_slugs": [...], "entities": [...], "connector_actions": [...], "requires": [...]}
        sa.Column("composition", postgresql.JSONB, nullable=True),
        sa.Column("input_schema", postgresql.JSONB, nullable=True),
        sa.Column("access_policy", postgresql.JSONB, nullable=True),
        sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
        sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
        sa.UniqueConstraint("slug", name="uq_feature_packs_slug"),
    )
    op.create_index("ix_feature_packs_slug", "feature_packs", ["slug"])
    op.create_index("ix_feature_packs_status", "feature_packs", ["status"])

    # ------------------------------------------------------------------
    # project_feature_packs — install state per project
    # ------------------------------------------------------------------
    op.create_table(
        "project_feature_packs",
        sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True),
        sa.Column(
            "project_id",
            postgresql.UUID(as_uuid=True),
            sa.ForeignKey("projects.id", ondelete="CASCADE"),
            nullable=False,
        ),
        sa.Column(
            "pack_id",
            postgresql.UUID(as_uuid=True),
            sa.ForeignKey("feature_packs.id", ondelete="RESTRICT"),
            nullable=False,
        ),
        sa.Column("pack_slug", sa.String(64), nullable=False),
        sa.Column("pack_version", sa.String(20), nullable=False),
        # supported | enabled | installed | configured | deployed | verified | blocked
        sa.Column("status", sa.String(20), nullable=False, server_default="installed"),
        sa.Column("config", postgresql.JSONB, nullable=True),
        sa.Column("blocker", postgresql.JSONB, nullable=True),
        sa.Column("installed_at", sa.DateTime(timezone=True), nullable=True),
        sa.Column("verified_at", sa.DateTime(timezone=True), nullable=True),
        sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
        sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
        sa.UniqueConstraint("project_id", "pack_slug", name="uq_project_feature_pack_project_slug"),
    )
    op.create_index("ix_project_feature_packs_project_id", "project_feature_packs", ["project_id"])
    op.create_index(
        "ix_project_feature_packs_status", "project_feature_packs", ["project_id", "status"]
    )


def downgrade() -> None:
    op.drop_table("project_feature_packs")
    op.drop_table("feature_packs")
