"""Realtime: project_realtime_config and project_realtime_channels tables.

Revision ID: 039
Revises: 038
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
from sqlalchemy.dialects.postgresql import ENUM as PgEnum

revision = "039"
down_revision = "038"
branch_labels = None
depends_on = None


def upgrade() -> None:
    op.execute("""
        DO $$ BEGIN
            CREATE TYPE p2hs_realtime_access_policy AS ENUM ('public', 'authenticated', 'private');
        EXCEPTION WHEN duplicate_object THEN NULL;
        END $$
    """)

    op.create_table(
        "project_realtime_config",
        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,
            unique=True,
        ),
        sa.Column("enabled", sa.Boolean, nullable=False, server_default="false"),
        sa.Column("max_concurrent_connections", sa.Integer, nullable=False, server_default="10"),
        sa.Column("history_enabled", sa.Boolean, nullable=False, server_default="true"),
        sa.Column("history_buffer_size", sa.Integer, nullable=False, server_default="50"),
        sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
    )
    op.create_index(
        "ix_project_realtime_config_project_id",
        "project_realtime_config",
        ["project_id"],
    )

    op.create_table(
        "project_realtime_channels",
        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("name", sa.String(128), nullable=False),
        sa.Column(
            "access_policy",
            PgEnum(name="p2hs_realtime_access_policy", create_type=False),
            nullable=False,
            server_default="authenticated",
        ),
        sa.Column("rls_filter", sa.Boolean, nullable=False, server_default="false"),
        sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now()),
        sa.UniqueConstraint("project_id", "name", name="uq_realtime_channel_project_name"),
    )
    op.create_index(
        "ix_project_realtime_channels_project_id",
        "project_realtime_channels",
        ["project_id"],
    )


def downgrade() -> None:
    op.drop_table("project_realtime_channels")
    op.drop_table("project_realtime_config")
    op.execute("DROP TYPE IF EXISTS p2hs_realtime_access_policy")
