"""Add listing_views table (Phase 4.1: view tracking)

Append-only event table backing view analytics. Raw IPs/user agents are never
stored — only salted SHA-256 hashes.

Revision ID: a1b2c3d4e5f7
Revises: f9a2c3d4e5b6
Create Date: 2026-07-04 00:00:00.000000

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = "a1b2c3d4e5f7"
down_revision = "f9a2c3d4e5b6"
branch_labels = None
depends_on = None


def upgrade():
    op.create_table(
        "listing_views",
        sa.Column("listing_id", sa.BigInteger().with_variant(sa.Integer(), "sqlite"), nullable=False),
        sa.Column("viewer_id", sa.BigInteger().with_variant(sa.Integer(), "sqlite"), nullable=True),
        sa.Column("session_id", sa.String(length=64), nullable=True),
        sa.Column("ip_hash", sa.CHAR(length=64), nullable=True),
        sa.Column("user_agent_hash", sa.CHAR(length=64), nullable=True),
        sa.Column("viewed_at", sa.DateTime(timezone=True), nullable=False),
        sa.Column("id", sa.BigInteger().with_variant(sa.Integer(), "sqlite"), autoincrement=True, nullable=False),
        sa.ForeignKeyConstraint(["listing_id"], ["listings.id"], name="fk_listing_views_listing_id"),
        sa.ForeignKeyConstraint(["viewer_id"], ["users.id"], name="fk_listing_views_viewer_id"),
        sa.PrimaryKeyConstraint("id"),
    )
    with op.batch_alter_table("listing_views", schema=None) as batch_op:
        batch_op.create_index("ix_listing_views_listing_id", ["listing_id"], unique=False)
        batch_op.create_index("ix_listing_views_viewer_id", ["viewer_id"], unique=False)
        batch_op.create_index("ix_listing_views_viewed_at", ["viewed_at"], unique=False)
        batch_op.create_index("ix_listing_views_session_id", ["session_id"], unique=False)
        batch_op.create_index("ix_listing_views_dedup", ["listing_id", "viewed_at"], unique=False)


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