"""Add listing_intersection_rule table.

Revision ID: 0053_add_listing_intersection_rule
Revises: 0052_add_master_taxonomy_job
"""

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


revision = "0053_add_listing_intersection_rule"
down_revision = "0052_add_master_taxonomy_job"
branch_labels = None
depends_on = None


def upgrade() -> None:
    op.create_table(
        "listing_intersection_rule",
        sa.Column("id", sa.Integer(), autoincrement=True, nullable=False),
        sa.Column("base_path_slug", sa.String(length=512), nullable=False),
        sa.Column("group_path_slug", sa.String(length=512), nullable=False),
        sa.Column("group_kind", sa.String(length=64), nullable=False, server_default="collection"),
        sa.Column("facet_attribute", sa.String(length=128), nullable=False),
        sa.Column("facet_label", sa.Text(), nullable=False),
        sa.Column("facet_value", sa.String(length=255), nullable=False),
        sa.Column("facet_slug", sa.String(length=255), nullable=False),
        sa.Column("seo_path_slug", sa.String(length=768), nullable=False),
        sa.Column("title", sa.Text(), nullable=False),
        sa.Column("listing_path_id", sa.Integer(), nullable=True),
        sa.Column("target_listing_path_id", sa.Integer(), nullable=True),
        sa.Column("filter_payload", postgresql.JSONB(astext_type=sa.Text()), nullable=True),
        sa.Column("channel_payload", postgresql.JSONB(astext_type=sa.Text()), nullable=True),
        sa.Column("is_indexable", sa.Boolean(), nullable=False, server_default=sa.true()),
        sa.Column("is_active", sa.Boolean(), nullable=False, server_default=sa.true()),
        sa.Column("notes", sa.Text(), nullable=True),
        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),
        sa.ForeignKeyConstraint(["listing_path_id"], ["channel_listing_path.id"]),
        sa.ForeignKeyConstraint(["target_listing_path_id"], ["channel_listing_path.id"]),
        sa.PrimaryKeyConstraint("id"),
        sa.UniqueConstraint("seo_path_slug", name="uq_listing_intersection_rule_seo_path_slug"),
    )
    op.create_index("ix_listing_intersection_rule_base_path_slug", "listing_intersection_rule", ["base_path_slug"])
    op.create_index("ix_listing_intersection_rule_group_path_slug", "listing_intersection_rule", ["group_path_slug"])
    op.create_index("ix_listing_intersection_rule_seo_path_slug", "listing_intersection_rule", ["seo_path_slug"])
    op.create_index(
        "ix_listing_intersection_rule_base_group",
        "listing_intersection_rule",
        ["base_path_slug", "group_path_slug"],
    )


def downgrade() -> None:
    op.drop_index("ix_listing_intersection_rule_base_group", table_name="listing_intersection_rule")
    op.drop_index("ix_listing_intersection_rule_seo_path_slug", table_name="listing_intersection_rule")
    op.drop_index("ix_listing_intersection_rule_group_path_slug", table_name="listing_intersection_rule")
    op.drop_index("ix_listing_intersection_rule_base_path_slug", table_name="listing_intersection_rule")
    op.drop_table("listing_intersection_rule")
