"""add_waitlist_engagement_fields

Revision ID: b2af37736ec8
Revises: 2ca250ba0529
Create Date: 2026-01-27 14:05:42.536183

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


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


def upgrade() -> None:
    """Upgrade schema."""
    # Add columns with nullable=True first for existing rows
    op.add_column('waitlist', sa.Column('invitation_sent', sa.Boolean(), nullable=True))
    op.add_column('waitlist', sa.Column('invitation_sent_at', sa.DateTime(), nullable=True))
    op.add_column('waitlist', sa.Column('followup_count', sa.Integer(), nullable=True))
    op.add_column('waitlist', sa.Column('last_followup_at', sa.DateTime(), nullable=True))
    op.add_column('waitlist', sa.Column('has_applied', sa.Boolean(), nullable=True))
    op.add_column('waitlist', sa.Column('application_id', sa.UUID(), nullable=True))
    op.add_column('waitlist', sa.Column('status', sa.String(length=20), nullable=True))
    
    # Set default values for existing rows
    op.execute("UPDATE waitlist SET invitation_sent = false WHERE invitation_sent IS NULL")
    op.execute("UPDATE waitlist SET followup_count = 0 WHERE followup_count IS NULL")
    op.execute("UPDATE waitlist SET has_applied = false WHERE has_applied IS NULL")
    op.execute("UPDATE waitlist SET status = 'waiting' WHERE status IS NULL")
    
    # Now alter columns to be NOT NULL where needed
    op.alter_column('waitlist', 'invitation_sent', nullable=False)
    op.alter_column('waitlist', 'followup_count', nullable=False)
    op.alter_column('waitlist', 'has_applied', nullable=False)
    op.alter_column('waitlist', 'status', nullable=False)


def downgrade() -> None:
    """Downgrade schema."""
    op.drop_column('waitlist', 'status')
    op.drop_column('waitlist', 'application_id')
    op.drop_column('waitlist', 'has_applied')
    op.drop_column('waitlist', 'last_followup_at')
    op.drop_column('waitlist', 'followup_count')
    op.drop_column('waitlist', 'invitation_sent_at')
    op.drop_column('waitlist', 'invitation_sent')
