"""add recurring meeting candidate flow

Revision ID: 609a137ad02d
Revises: 20260603_0011
Create Date: 2026-06-10 14:34:55.394719
"""
from __future__ import annotations

from alembic import op
import sqlalchemy as sa



# revision identifiers, used by Alembic.
revision = '609a137ad02d'
down_revision = '20260603_0011'
branch_labels = None
depends_on = None


def upgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table('recurring_meeting_candidates',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('user_id', sa.Integer(), nullable=False),
    sa.Column('recurring_series_id', sa.String(), nullable=False),
    sa.Column('google_event_id', sa.String(), nullable=False),
    sa.Column('title', sa.String(), nullable=True),
    sa.Column('meet_link', sa.String(), nullable=False),
    sa.Column('platform', sa.String(), nullable=False),
    sa.Column('scheduled_at', sa.DateTime(timezone=True), nullable=False),
    sa.Column('host_rsvp_status', sa.String(), nullable=True),
    sa.Column('organizer_email', sa.String(), nullable=True),
    sa.Column('bot_permission_status', sa.String(), server_default='pending', nullable=False),
    sa.Column('dashboard_visible', sa.Boolean(), server_default='false', nullable=False),
    sa.Column('linked_meeting_id', sa.Integer(), nullable=True),
    sa.Column('payload_json', sa.Text(), nullable=True),
    sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
    sa.Column('updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),
    sa.ForeignKeyConstraint(['linked_meeting_id'], ['meetings.id'], ),
    sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
    sa.PrimaryKeyConstraint('id'),
    sa.UniqueConstraint('linked_meeting_id'),
    sa.UniqueConstraint('user_id', 'google_event_id', name='uq_recurring_candidate_user_event')
    )
    op.create_index(op.f('ix_recurring_meeting_candidates_google_event_id'), 'recurring_meeting_candidates', ['google_event_id'], unique=False)
    op.create_index(op.f('ix_recurring_meeting_candidates_id'), 'recurring_meeting_candidates', ['id'], unique=False)
    op.create_index(op.f('ix_recurring_meeting_candidates_recurring_series_id'), 'recurring_meeting_candidates', ['recurring_series_id'], unique=False)
    op.create_index(op.f('ix_recurring_meeting_candidates_scheduled_at'), 'recurring_meeting_candidates', ['scheduled_at'], unique=False)
    op.create_index(op.f('ix_recurring_meeting_candidates_user_id'), 'recurring_meeting_candidates', ['user_id'], unique=False)
    op.drop_constraint(op.f('calendar_sync_states_channel_id_key'), 'calendar_sync_states', type_='unique')
    op.drop_constraint(op.f('calendar_sync_states_user_id_key'), 'calendar_sync_states', type_='unique')
    op.create_index(op.f('ix_calendar_sync_states_id'), 'calendar_sync_states', ['id'], unique=False)
    op.add_column('meetings', sa.Column('is_recurring', sa.Boolean(), server_default='false', nullable=False))
    op.add_column('meetings', sa.Column('recurring_series_id', sa.String(), nullable=True))
    op.add_column('meetings', sa.Column('source_event_id', sa.String(), nullable=True))
    op.add_column('meetings', sa.Column('host_rsvp_status', sa.String(), nullable=True))
    op.alter_column('meetings', 'platform',
               existing_type=sa.VARCHAR(),
               server_default=None,
               nullable=True)
    op.alter_column('meetings', 'status',
               existing_type=sa.VARCHAR(),
               server_default=None,
               existing_nullable=True)
    op.alter_column('meetings', 'provider',
               existing_type=sa.VARCHAR(),
               server_default=None,
               nullable=True)
    op.drop_index(op.f('uq_meetings_recall_bot_id'), table_name='meetings')
    op.create_index(op.f('ix_meetings_recurring_series_id'), 'meetings', ['recurring_series_id'], unique=False)
    op.create_index(op.f('ix_meetings_source_event_id'), 'meetings', ['source_event_id'], unique=False)
    op.create_unique_constraint(None, 'meetings', ['recall_bot_id'])
    op.alter_column('recordings', 'status',
               existing_type=sa.VARCHAR(),
               server_default=None,
               existing_nullable=True)
    op.drop_index(op.f('uq_recordings_recall_recording_id'), table_name='recordings')
    op.create_unique_constraint(None, 'recordings', ['recall_recording_id'])
    op.alter_column('transcripts', 'status',
               existing_type=sa.VARCHAR(),
               server_default=None,
               existing_nullable=True)
    op.drop_index(op.f('uq_transcripts_recall_transcript_id'), table_name='transcripts')
    op.create_unique_constraint(None, 'transcripts', ['recall_transcript_id'])
    op.alter_column('users', 'role',
               existing_type=sa.VARCHAR(),
               server_default='user',
               existing_nullable=False)
    op.alter_column('users', 'approval_status',
               existing_type=sa.VARCHAR(),
               server_default='pending',
               existing_nullable=False)
    op.create_foreign_key(None, 'users', 'users', ['approved_by'], ['id'])
    # ### end Alembic commands ###


def downgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_constraint(None, 'users', type_='foreignkey')
    op.alter_column('users', 'approval_status',
               existing_type=sa.VARCHAR(),
               server_default=None,
               existing_nullable=False)
    op.alter_column('users', 'role',
               existing_type=sa.VARCHAR(),
               server_default=None,
               existing_nullable=False)
    op.drop_constraint(None, 'transcripts', type_='unique')
    op.create_index(op.f('uq_transcripts_recall_transcript_id'), 'transcripts', ['recall_transcript_id'], unique=True)
    op.alter_column('transcripts', 'status',
               existing_type=sa.VARCHAR(),
               server_default=sa.text("'pending'::character varying"),
               existing_nullable=True)
    op.drop_constraint(None, 'recordings', type_='unique')
    op.create_index(op.f('uq_recordings_recall_recording_id'), 'recordings', ['recall_recording_id'], unique=True)
    op.alter_column('recordings', 'status',
               existing_type=sa.VARCHAR(),
               server_default=sa.text("'recording'::character varying"),
               existing_nullable=True)
    op.drop_constraint(None, 'meetings', type_='unique')
    op.drop_index(op.f('ix_meetings_source_event_id'), table_name='meetings')
    op.drop_index(op.f('ix_meetings_recurring_series_id'), table_name='meetings')
    op.create_index(op.f('uq_meetings_recall_bot_id'), 'meetings', ['recall_bot_id'], unique=True)
    op.alter_column('meetings', 'provider',
               existing_type=sa.VARCHAR(),
               server_default=sa.text("'recall_ai'::character varying"),
               nullable=False)
    op.alter_column('meetings', 'status',
               existing_type=sa.VARCHAR(),
               server_default=sa.text("'pending'::character varying"),
               existing_nullable=True)
    op.alter_column('meetings', 'platform',
               existing_type=sa.VARCHAR(),
               server_default=sa.text("'google_meet'::character varying"),
               nullable=False)
    op.drop_column('meetings', 'host_rsvp_status')
    op.drop_column('meetings', 'source_event_id')
    op.drop_column('meetings', 'recurring_series_id')
    op.drop_column('meetings', 'is_recurring')
    op.drop_index(op.f('ix_calendar_sync_states_id'), table_name='calendar_sync_states')
    op.create_unique_constraint(op.f('calendar_sync_states_user_id_key'), 'calendar_sync_states', ['user_id'], postgresql_nulls_not_distinct=False)
    op.create_unique_constraint(op.f('calendar_sync_states_channel_id_key'), 'calendar_sync_states', ['channel_id'], postgresql_nulls_not_distinct=False)
    op.drop_index(op.f('ix_recurring_meeting_candidates_user_id'), table_name='recurring_meeting_candidates')
    op.drop_index(op.f('ix_recurring_meeting_candidates_scheduled_at'), table_name='recurring_meeting_candidates')
    op.drop_index(op.f('ix_recurring_meeting_candidates_recurring_series_id'), table_name='recurring_meeting_candidates')
    op.drop_index(op.f('ix_recurring_meeting_candidates_id'), table_name='recurring_meeting_candidates')
    op.drop_index(op.f('ix_recurring_meeting_candidates_google_event_id'), table_name='recurring_meeting_candidates')
    op.drop_table('recurring_meeting_candidates')
    # ### end Alembic commands ###
