"""admin audit log and impersonation

Revision ID: d4e5f6a7b8c9
Revises: b2c3d4e5f6a7
Create Date: 2026-03-06 00:00:00.000000

"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa

revision: str = 'd4e5f6a7b8c9'
down_revision: Union[str, Sequence[str], None] = 'b2c3d4e5f6a7'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
    # Create admin_audit_log table
    op.create_table(
        'admin_audit_log',
        sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
        sa.Column('admin_user_id', sa.Integer(), nullable=False),
        sa.Column('action', sa.String(100), nullable=False),
        sa.Column('target_type', sa.String(50), nullable=False),
        sa.Column('target_id', sa.Integer(), nullable=False),
        sa.Column('metadata', sa.JSON(), nullable=True),
        sa.Column('ip_address', sa.String(45), nullable=True),
        sa.Column(
            'created_at',
            sa.DateTime(timezone=True),
            server_default=sa.text('now()'),
            nullable=False,
        ),
        sa.ForeignKeyConstraint(['admin_user_id'], ['users.id']),
        sa.PrimaryKeyConstraint('id'),
    )
    op.create_index('ix_admin_audit_log_admin_user_id', 'admin_audit_log', ['admin_user_id'])
    op.create_index('ix_admin_audit_log_target_id', 'admin_audit_log', ['target_id'])

    # Add impersonated_merchant_id to auth_sessions
    op.add_column(
        'auth_sessions',
        sa.Column('impersonated_merchant_id', sa.Integer(), nullable=True),
    )
    op.create_index(
        'ix_auth_sessions_impersonated_merchant_id',
        'auth_sessions',
        ['impersonated_merchant_id'],
    )
    op.create_foreign_key(
        'fk_auth_sessions_impersonated_merchant_id',
        'auth_sessions', 'merchants',
        ['impersonated_merchant_id'], ['id'],
    )


def downgrade() -> None:
    op.drop_constraint(
        'fk_auth_sessions_impersonated_merchant_id', 'auth_sessions', type_='foreignkey'
    )
    op.drop_index('ix_auth_sessions_impersonated_merchant_id', table_name='auth_sessions')
    op.drop_column('auth_sessions', 'impersonated_merchant_id')
    op.drop_index('ix_admin_audit_log_target_id', table_name='admin_audit_log')
    op.drop_index('ix_admin_audit_log_admin_user_id', table_name='admin_audit_log')
    op.drop_table('admin_audit_log')
