"""create_chat_tables

Revision ID: bb81dae10cf1
Revises: f51816ef0a57
Create Date: 2026-06-03 19:01:43.759549
"""
from collections.abc import Sequence

from alembic import op
import sqlalchemy as sa


revision: str = 'bb81dae10cf1'
down_revision: str | None = 'f51816ef0a57'
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('chat_widgets',
    sa.Column('tenant_id', sa.String(length=36), nullable=False),
    sa.Column('name', sa.String(length=200), nullable=False),
    sa.Column('api_key', sa.String(length=64), nullable=False),
    sa.Column('allowed_domains', sa.JSON(), nullable=True),
    sa.Column('ai_enabled', sa.Boolean(), server_default='1', nullable=False),
    sa.Column('is_online', sa.Boolean(), server_default='1', nullable=False),
    sa.Column('persona', sa.JSON(), nullable=True),
    sa.Column('settings', sa.JSON(), nullable=True),
    sa.Column('ai_budget_monthly', sa.DECIMAL(precision=10, scale=2), server_default='0', nullable=False),
    sa.Column('ai_budget_used', sa.DECIMAL(precision=10, scale=2), server_default='0', nullable=False),
    sa.Column('ai_budget_period', sa.String(length=7), 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')
    )
    op.create_index(op.f('ix_chat_widgets_api_key'), 'chat_widgets', ['api_key'], unique=True)
    op.create_index(op.f('ix_chat_widgets_tenant_id'), 'chat_widgets', ['tenant_id'], unique=False)
    op.create_table('chat_sessions',
    sa.Column('tenant_id', sa.String(length=36), nullable=False),
    sa.Column('widget_id', sa.String(length=36), nullable=False),
    sa.Column('visitor_id', sa.String(length=36), nullable=True),
    sa.Column('session_token', sa.String(length=64), nullable=False),
    sa.Column('status', sa.Enum('open', 'closed', 'escalated', name='session_status'), server_default='open', nullable=False),
    sa.Column('visitor_name', sa.String(length=200), nullable=True),
    sa.Column('visitor_email', sa.String(length=200), nullable=True),
    sa.Column('visitor_phone', sa.String(length=30), nullable=True),
    sa.Column('visitor_ip', sa.String(length=45), nullable=True),
    sa.Column('visitor_browser', sa.String(length=255), nullable=True),
    sa.Column('page_url', sa.String(length=1000), nullable=True),
    sa.Column('referrer', sa.String(length=500), nullable=True),
    sa.Column('kvkk_consent_at', sa.DateTime(), nullable=True),
    sa.Column('intent', sa.String(length=50), nullable=True),
    sa.Column('nps_score', sa.Integer(), nullable=True),
    sa.Column('nps_comment', sa.Text(), nullable=True),
    sa.Column('nps_submitted_at', sa.DateTime(), nullable=True),
    sa.Column('escalated_at', sa.DateTime(), nullable=True),
    sa.Column('idle_ping_sent_at', sa.DateTime(), nullable=True),
    sa.Column('metadata', sa.JSON(), nullable=True),
    sa.Column('started_at', sa.DateTime(), nullable=False),
    sa.Column('ended_at', sa.DateTime(), nullable=True),
    sa.Column('id', sa.String(length=36), nullable=False),
    sa.ForeignKeyConstraint(['tenant_id'], ['tenants.id'], ondelete='CASCADE'),
    sa.ForeignKeyConstraint(['widget_id'], ['chat_widgets.id'], ondelete='CASCADE'),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_chat_sessions_session_token'), 'chat_sessions', ['session_token'], unique=True)
    op.create_index(op.f('ix_chat_sessions_tenant_id'), 'chat_sessions', ['tenant_id'], unique=False)
    op.create_index(op.f('ix_chat_sessions_visitor_id'), 'chat_sessions', ['visitor_id'], unique=False)
    op.create_table('chat_messages',
    sa.Column('session_id', sa.String(length=36), nullable=False),
    sa.Column('tenant_id', sa.String(length=36), nullable=False),
    sa.Column('sender_type', sa.Enum('visitor', 'ai', 'operator', 'system', name='sender_type'), nullable=False),
    sa.Column('message', sa.Text(), nullable=False),
    sa.Column('message_type', sa.Enum('text', 'ai', 'system', 'tool_result', name='message_type'), server_default='text', nullable=False),
    sa.Column('meta', sa.JSON(), nullable=True),
    sa.Column('model', sa.String(length=100), nullable=True),
    sa.Column('latency_ms', sa.Integer(), nullable=True),
    sa.Column('is_read', sa.Boolean(), server_default='0', nullable=False),
    sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False),
    sa.Column('id', sa.String(length=36), nullable=False),
    sa.ForeignKeyConstraint(['session_id'], ['chat_sessions.id'], ondelete='CASCADE'),
    sa.PrimaryKeyConstraint('id')
    )
    op.create_index(op.f('ix_chat_messages_session_id'), 'chat_messages', ['session_id'], unique=False)
    op.create_index(op.f('ix_chat_messages_tenant_id'), 'chat_messages', ['tenant_id'], unique=False)
    # ### end Alembic commands ###


def downgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_index(op.f('ix_chat_messages_tenant_id'), table_name='chat_messages')
    op.drop_index(op.f('ix_chat_messages_session_id'), table_name='chat_messages')
    op.drop_table('chat_messages')
    op.drop_index(op.f('ix_chat_sessions_visitor_id'), table_name='chat_sessions')
    op.drop_index(op.f('ix_chat_sessions_tenant_id'), table_name='chat_sessions')
    op.drop_index(op.f('ix_chat_sessions_session_token'), table_name='chat_sessions')
    op.drop_table('chat_sessions')
    op.drop_index(op.f('ix_chat_widgets_tenant_id'), table_name='chat_widgets')
    op.drop_index(op.f('ix_chat_widgets_api_key'), table_name='chat_widgets')
    op.drop_table('chat_widgets')
    # ### end Alembic commands ###
