"""Event subscriptions + project custom event registry (integration platform).

Revision ID: 125
Revises: 124
"""
from __future__ import annotations

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

revision = "125"
down_revision = "124"
branch_labels = None
depends_on = None


def upgrade() -> None:
    op.create_table(
        "integration_subscriptions",
        sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True, nullable=False),
        sa.Column("workspace_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("workspaces.id", ondelete="CASCADE"), nullable=False),
        sa.Column("project_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("projects.id", ondelete="CASCADE"), nullable=False),
        sa.Column("connection_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("connector_connections.id", ondelete="SET NULL"), nullable=True),
        sa.Column("event", sa.String(180), nullable=False),
        sa.Column("event_version", sa.String(20), nullable=False, server_default="01.00.00"),
        sa.Column("destination", sa.String(40), nullable=False),
        sa.Column("url", sa.Text(), nullable=True),
        sa.Column("secret_enc", sa.Text(), nullable=True),
        sa.Column("filter_json", postgresql.JSONB(), nullable=False, server_default=sa.text("'{}'::jsonb")),
        sa.Column("ignore_origin", sa.Boolean(), nullable=False, server_default=sa.text("true")),
        sa.Column("max_hops", sa.Integer(), nullable=False, server_default="5"),
        sa.Column("status", sa.String(20), nullable=False, server_default="active"),
        sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False),
        sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False),
    )
    op.create_index("ix_integration_subscriptions_workspace_id", "integration_subscriptions", ["workspace_id"])
    op.create_index("ix_integration_subscriptions_project_id", "integration_subscriptions", ["project_id"])
    op.create_unique_constraint(
        "uq_integration_subscriptions_fanout",
        "integration_subscriptions",
        ["project_id", "event", "destination", "connection_id"],
    )
    op.create_table(
        "project_custom_events",
        sa.Column("id", postgresql.UUID(as_uuid=True), primary_key=True, nullable=False),
        sa.Column("project_id", postgresql.UUID(as_uuid=True), sa.ForeignKey("projects.id", ondelete="CASCADE"), nullable=False),
        sa.Column("name", sa.String(180), nullable=False),
        sa.Column("version", sa.String(20), nullable=False, server_default="01.00.00"),
        sa.Column("alias", sa.String(180), nullable=False),
        sa.Column("label", sa.String(160), nullable=False),
        sa.Column("schema_json", postgresql.JSONB(), nullable=False, server_default=sa.text("'{}'::jsonb")),
        sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False),
    )
    op.create_index("ix_project_custom_events_project_id", "project_custom_events", ["project_id"])
    op.create_unique_constraint(
        "uq_project_custom_events_name_ver",
        "project_custom_events",
        ["project_id", "name", "version"],
    )


def downgrade() -> None:
    op.drop_table("project_custom_events")
    op.drop_table("integration_subscriptions")
