"""migration fix

Revision ID: 2c8f635b25c5
Revises: e7f8a9b0c1d2
Create Date: 2026-03-18 05:59:01.476918

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

# revision identifiers, used by Alembic.
revision: str = '2c8f635b25c5'
down_revision: Union[str, Sequence[str], None] = 'e7f8a9b0c1d2'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
    """Upgrade schema."""
    # ### commands auto generated by Alembic - please adjust! ###
    op.execute('DROP INDEX IF EXISTS ix_admin_audit_log_admin_user_id')
    op.execute('DROP INDEX IF EXISTS ix_admin_audit_log_target_id')
    op.execute('DROP TABLE IF EXISTS admin_audit_log')
    op.execute('DROP INDEX IF EXISTS ix_invoice_activities_created_at')
    op.execute('DROP INDEX IF EXISTS ix_invoice_activities_invoice_id_created_at')
    op.execute('DROP INDEX IF EXISTS ix_invoices_invoice_literal')
    op.execute('DROP INDEX IF EXISTS ix_invoices_merchant_id')
    op.execute('DROP INDEX IF EXISTS ix_invoices_merchant_literal')
    op.execute('DROP INDEX IF EXISTS ix_invoices_merchant_status')
    op.execute('ALTER TABLE invoices DROP CONSTRAINT IF EXISTS uq_invoices_invoice_literal')
    op.create_unique_constraint('uq_invoices_invoice_literal', 'invoices', ['invoice_literal'])
    op.execute('DROP INDEX IF EXISTS ix_payment_requests_authorizations_hpp_session_id')
    op.execute('DROP INDEX IF EXISTS ix_payment_requests_authorizations_signature_file_id')
    op.alter_column('payment_requests_links', 'invoice_id',
               existing_type=sa.INTEGER(),
               nullable=True)
    op.execute('DROP INDEX IF EXISTS ix_reminders_reminder_status')
    op.execute('DROP INDEX IF EXISTS ix_reminders_status_scheduled_at')
    op.execute('ALTER TABLE reminders DROP CONSTRAINT IF EXISTS uq_reminders_reminder_id')
    op.execute('DROP INDEX IF EXISTS ix_reminders_reminder_id')
    op.create_index(op.f('ix_reminders_reminder_id'), 'reminders', ['reminder_id'], unique=True)
    op.execute('DROP INDEX IF EXISTS idx_transactions_merchant_occurred_at')
    op.execute('DROP INDEX IF EXISTS idx_transactions_merchant_status')
    op.execute('DROP INDEX IF EXISTS idx_transactions_payment_request_id')
    op.execute('DROP INDEX IF EXISTS idx_transactions_txn_literal_search')
    op.execute('DROP INDEX IF EXISTS ix_users_customer_id')
    op.execute('DROP INDEX IF EXISTS ix_users_merchant_id')
    op.execute('DROP INDEX IF EXISTS uq_users_email_merchant_customer')
    # ### end Alembic commands ###


def downgrade() -> None:
    """Downgrade schema."""
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_index(op.f('uq_users_email_merchant_customer'), 'users', ['email', 'merchant_id'], unique=True, postgresql_where="((user_type)::text = 'customer'::text)")
    op.create_index(op.f('ix_users_merchant_id'), 'users', ['merchant_id'], unique=False)
    op.create_index(op.f('ix_users_customer_id'), 'users', ['customer_id'], unique=False)
    op.create_index(op.f('idx_transactions_txn_literal_search'), 'transactions', ['merchant_id', 'txn_literal'], unique=False, postgresql_where='(txn_literal IS NOT NULL)')
    op.create_index(op.f('idx_transactions_payment_request_id'), 'transactions', ['payment_request_id'], unique=False)
    op.create_index(op.f('idx_transactions_merchant_status'), 'transactions', ['merchant_id', 'txn_status'], unique=False)
    op.create_index(op.f('idx_transactions_merchant_occurred_at'), 'transactions', ['merchant_id', sa.literal_column('ocurred_at DESC')], unique=False)
    op.drop_index(op.f('ix_reminders_reminder_id'), table_name='reminders')
    op.create_index(op.f('ix_reminders_reminder_id'), 'reminders', ['reminder_id'], unique=False)
    op.create_unique_constraint(op.f('uq_reminders_reminder_id'), 'reminders', ['reminder_id'], postgresql_nulls_not_distinct=False)
    op.create_index(op.f('ix_reminders_status_scheduled_at'), 'reminders', ['reminder_status', 'scheduled_at'], unique=False)
    op.create_index(op.f('ix_reminders_reminder_status'), 'reminders', ['reminder_status'], unique=False)
    op.alter_column('payment_requests_links', 'invoice_id',
               existing_type=sa.INTEGER(),
               nullable=False)
    op.create_index(op.f('ix_payment_requests_authorizations_signature_file_id'), 'payment_requests_authorizations', ['signature_file_id'], unique=False)
    op.create_index(op.f('ix_payment_requests_authorizations_hpp_session_id'), 'payment_requests_authorizations', ['hpp_session_id'], unique=False)
    op.drop_constraint('uq_invoices_invoice_literal', 'invoices', type_='unique')
    op.create_index(op.f('ix_invoices_merchant_status'), 'invoices', ['merchant_id', 'status'], unique=False, postgresql_where='(deleted_at IS NULL)')
    op.create_index(op.f('ix_invoices_merchant_literal'), 'invoices', ['merchant_id', 'invoice_literal'], unique=False, postgresql_where='(deleted_at IS NULL)')
    op.create_index(op.f('ix_invoices_merchant_id'), 'invoices', ['merchant_id'], unique=False, postgresql_where='(deleted_at IS NULL)')
    op.create_index(op.f('ix_invoices_invoice_literal'), 'invoices', ['invoice_literal'], unique=True, postgresql_where='(invoice_literal IS NOT NULL)')
    op.create_index(op.f('ix_invoice_activities_invoice_id_created_at'), 'invoice_activities', ['invoice_id', 'created_at'], unique=False)
    op.create_index(op.f('ix_invoice_activities_created_at'), 'invoice_activities', ['created_at'], unique=False)
    op.create_table('admin_audit_log',
    sa.Column('id', sa.INTEGER(), autoincrement=True, nullable=False),
    sa.Column('admin_user_id', sa.INTEGER(), autoincrement=False, nullable=False),
    sa.Column('action', sa.VARCHAR(length=100), autoincrement=False, nullable=False),
    sa.Column('target_type', sa.VARCHAR(length=50), autoincrement=False, nullable=False),
    sa.Column('target_id', sa.INTEGER(), autoincrement=False, nullable=False),
    sa.Column('metadata', postgresql.JSON(astext_type=sa.Text()), autoincrement=False, nullable=True),
    sa.Column('ip_address', sa.VARCHAR(length=45), autoincrement=False, nullable=True),
    sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=False),
    sa.ForeignKeyConstraint(['admin_user_id'], ['users.id'], name=op.f('admin_audit_log_admin_user_id_fkey')),
    sa.PrimaryKeyConstraint('id', name=op.f('admin_audit_log_pkey'))
    )
    op.create_index(op.f('ix_admin_audit_log_target_id'), 'admin_audit_log', ['target_id'], unique=False)
    op.create_index(op.f('ix_admin_audit_log_admin_user_id'), 'admin_audit_log', ['admin_user_id'], unique=False)
    # ### end Alembic commands ###
