"""Add reports table (Phase 7: report & moderation system)

Entity-generic Trust & Safety reports. Every report stores entity_type +
entity_public_id, with optional typed FKs for the entity kinds actioned today, so
future entity types need no schema redesign.

Revision ID: c3d5e7f9a2b4
Revises: b2c4d6e8f0a1
Create Date: 2026-07-04 00:00:00.000000

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = "c3d5e7f9a2b4"
down_revision = "b2c4d6e8f0a1"
branch_labels = None
depends_on = None


def upgrade():
    op.create_table(
        "reports",
        sa.Column("public_id", sa.CHAR(length=36), nullable=False),
        sa.Column("reporter_id", sa.BigInteger().with_variant(sa.Integer(), "sqlite"), nullable=False),
        sa.Column(
            "entity_type",
            sa.Enum("listing", "user", "message", "advertisement", name="report_entity_type"),
            nullable=False,
        ),
        sa.Column("entity_public_id", sa.CHAR(length=36), nullable=False),
        sa.Column("listing_id", sa.BigInteger().with_variant(sa.Integer(), "sqlite"), nullable=True),
        sa.Column("reported_user_id", sa.BigInteger().with_variant(sa.Integer(), "sqlite"), nullable=True),
        sa.Column(
            "reason",
            sa.Enum("scam", "spam", "fake_item", "prohibited_item", "offensive_content",
                    "wrong_category", "duplicate", "other", name="report_reason"),
            nullable=False,
        ),
        sa.Column("description", sa.Text(), nullable=True),
        sa.Column(
            "status",
            sa.Enum("pending", "under_review", "resolved", "dismissed", name="report_status"),
            nullable=False,
        ),
        sa.Column("moderator_id", sa.BigInteger().with_variant(sa.Integer(), "sqlite"), nullable=True),
        sa.Column("moderator_notes", sa.Text(), nullable=True),
        sa.Column("resolved_at", sa.DateTime(timezone=True), nullable=True),
        sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
        sa.Column("id", sa.BigInteger().with_variant(sa.Integer(), "sqlite"), autoincrement=True, nullable=False),
        sa.ForeignKeyConstraint(["reporter_id"], ["users.id"], name="fk_reports_reporter_id"),
        sa.ForeignKeyConstraint(["listing_id"], ["listings.id"], name="fk_reports_listing_id"),
        sa.ForeignKeyConstraint(["reported_user_id"], ["users.id"], name="fk_reports_reported_user_id"),
        sa.ForeignKeyConstraint(["moderator_id"], ["users.id"], name="fk_reports_moderator_id"),
        sa.PrimaryKeyConstraint("id"),
        sa.UniqueConstraint("public_id", name="uq_reports_public_id"),
    )
    with op.batch_alter_table("reports", schema=None) as batch_op:
        batch_op.create_index("ix_reports_status", ["status"], unique=False)
        batch_op.create_index("ix_reports_entity_type", ["entity_type"], unique=False)
        batch_op.create_index("ix_reports_reporter_id", ["reporter_id"], unique=False)
        batch_op.create_index("ix_reports_moderator_id", ["moderator_id"], unique=False)
        batch_op.create_index("ix_reports_created_at", ["created_at"], unique=False)


def downgrade():
    op.drop_table("reports")
