"""create_visitor_tables

Revision ID: 002a9cec4967
Revises: bb81dae10cf1
Create Date: 2026-06-03 19:21:45.100805
"""
from collections.abc import Sequence

from alembic import op
import sqlalchemy as sa


revision: str = '002a9cec4967'
down_revision: str | None = 'bb81dae10cf1'
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def upgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table('flovy_visitors',
    sa.Column('tenant_id', sa.String(length=36), nullable=False),
    sa.Column('visitor_uuid', sa.String(length=64), nullable=False),
    sa.Column('fingerprint_hash', sa.String(length=64), nullable=True),
    sa.Column('email', sa.String(length=200), nullable=True),
    sa.Column('phone', sa.String(length=30), nullable=True),
    sa.Column('name', sa.String(length=200), nullable=True),
    sa.Column('ip_address', sa.String(length=45), nullable=True),
    sa.Column('ip_history', sa.JSON(), nullable=True),
    sa.Column('device_type', sa.Enum('mobile', 'desktop', 'tablet', name='visitor_device_type'), nullable=True),
    sa.Column('browser', sa.String(length=50), nullable=True),
    sa.Column('language', sa.String(length=10), nullable=True),
    sa.Column('total_sessions', sa.Integer(), server_default='0', nullable=False),
    sa.Column('total_messages', sa.Integer(), server_default='0', nullable=False),
    sa.Column('last_session_at', sa.DateTime(), nullable=True),
    sa.Column('last_intent', sa.String(length=50), nullable=True),
    sa.Column('lifetime_value', sa.DECIMAL(precision=12, scale=2), server_default='0', nullable=False),
    sa.Column('products_viewed', sa.JSON(), nullable=True),
    sa.Column('products_purchased', sa.JSON(), nullable=True),
    sa.Column('cart_abandoned', sa.JSON(), nullable=True),
    sa.Column('interests', sa.JSON(), nullable=True),
    sa.Column('preferred_time_of_day', sa.Enum('morning', 'afternoon', 'evening', 'night', name='visitor_time_of_day'), nullable=True),
    sa.Column('is_returning', sa.Boolean(), server_default='0', nullable=False),
    sa.Column('kvkk_consent_at', sa.DateTime(), nullable=True),
    sa.Column('anonymized_at', sa.DateTime(), nullable=True),
    sa.Column('id', sa.String(length=36), nullable=False),
    sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
    sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
    sa.ForeignKeyConstraint(['tenant_id'], ['tenants.id'], ondelete='CASCADE'),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('tenant_id', 'visitor_uuid', name='uq_tenant_visitor')
    )
    op.create_index('idx_visitor_email', 'flovy_visitors', ['tenant_id', 'email'], unique=False)
    op.create_index('idx_visitor_fingerprint', 'flovy_visitors', ['tenant_id', 'fingerprint_hash'], unique=False)
    op.create_index('idx_visitor_phone', 'flovy_visitors', ['tenant_id', 'phone'], unique=False)
    op.create_table('flovy_visitor_sessions',
    sa.Column('visitor_id', sa.String(length=36), nullable=False),
    sa.Column('tenant_id', sa.String(length=36), nullable=False),
    sa.Column('chat_session_id', sa.String(length=36), nullable=True),
    sa.Column('ip_address', sa.String(length=45), nullable=True),
    sa.Column('page_url', sa.String(length=1000), nullable=True),
    sa.Column('referrer', sa.String(length=500), nullable=True),
    sa.Column('utm_source', sa.String(length=100), nullable=True),
    sa.Column('utm_medium', sa.String(length=100), nullable=True),
    sa.Column('utm_campaign', sa.String(length=100), nullable=True),
    sa.Column('started_at', sa.DateTime(), nullable=True),
    sa.Column('ended_at', sa.DateTime(), nullable=True),
    sa.Column('id', sa.String(length=36), nullable=False),
    sa.ForeignKeyConstraint(['visitor_id'], ['flovy_visitors.id'], ondelete='CASCADE'),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_flovy_visitor_sessions_tenant_id'), 'flovy_visitor_sessions', ['tenant_id'], unique=False)
    op.create_index(op.f('ix_flovy_visitor_sessions_visitor_id'), 'flovy_visitor_sessions', ['visitor_id'], unique=False)
    op.create_foreign_key(None, 'chat_sessions', 'flovy_visitors', ['visitor_id'], ['id'], ondelete='SET NULL')
    # ### end Alembic commands ###


def downgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_constraint(None, 'chat_sessions', type_='foreignkey')
    op.drop_index(op.f('ix_flovy_visitor_sessions_visitor_id'), table_name='flovy_visitor_sessions')
    op.drop_index(op.f('ix_flovy_visitor_sessions_tenant_id'), table_name='flovy_visitor_sessions')
    op.drop_table('flovy_visitor_sessions')
    op.drop_index('idx_visitor_phone', table_name='flovy_visitors')
    op.drop_index('idx_visitor_fingerprint', table_name='flovy_visitors')
    op.drop_index('idx_visitor_email', table_name='flovy_visitors')
    op.drop_table('flovy_visitors')
    # ### end Alembic commands ###
