"""add calendar sync state

Revision ID: 20260525_0006
Revises: 20260518_0005
Create Date: 2026-05-25 00:30:00
"""
from __future__ import annotations

from alembic import op
import sqlalchemy as sa


revision = "20260525_0006"
down_revision = "20260518_0005"
branch_labels = None
depends_on = None


def upgrade() -> None:
    bind = op.get_bind()
    inspector = sa.inspect(bind)

    user_columns = {column["name"] for column in inspector.get_columns("users")}
    if "refresh_token" not in user_columns:
        op.add_column("users", sa.Column("refresh_token", sa.String(), nullable=True))

    meeting_columns = {column["name"] for column in inspector.get_columns("meetings")}
    if "calendar_event_id" not in meeting_columns:
        op.add_column("meetings", sa.Column("calendar_event_id", sa.String(), nullable=True))
        op.create_index("ix_meetings_calendar_event_id", "meetings", ["calendar_event_id"], unique=False)

    tables = set(inspector.get_table_names())
    if "calendar_sync_states" not in tables:
        op.create_table(
            "calendar_sync_states",
            sa.Column("id", sa.Integer(), nullable=False),
            sa.Column("user_id", sa.Integer(), nullable=False),
            sa.Column("calendar_id", sa.String(), nullable=False, server_default="primary"),
            sa.Column("sync_token", sa.Text(), nullable=True),
            sa.Column("channel_id", sa.String(), nullable=True),
            sa.Column("channel_token", sa.String(), nullable=True),
            sa.Column("resource_id", sa.String(), nullable=True),
            sa.Column("resource_uri", sa.Text(), nullable=True),
            sa.Column("expires_at", sa.DateTime(timezone=True), nullable=True),
            sa.Column("last_message_number", sa.String(), nullable=True),
            sa.Column("last_synced_at", sa.DateTime(timezone=True), nullable=True),
            sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.func.now(), nullable=True),
            sa.ForeignKeyConstraint(["user_id"], ["users.id"]),
            sa.PrimaryKeyConstraint("id"),
            sa.UniqueConstraint("channel_id"),
            sa.UniqueConstraint("user_id"),
        )
        op.create_index("ix_calendar_sync_states_channel_id", "calendar_sync_states", ["channel_id"], unique=True)
        op.create_index("ix_calendar_sync_states_user_id", "calendar_sync_states", ["user_id"], unique=True)


def downgrade() -> None:
    bind = op.get_bind()
    inspector = sa.inspect(bind)

    tables = set(inspector.get_table_names())
    if "calendar_sync_states" in tables:
        op.drop_index("ix_calendar_sync_states_user_id", table_name="calendar_sync_states")
        op.drop_index("ix_calendar_sync_states_channel_id", table_name="calendar_sync_states")
        op.drop_table("calendar_sync_states")

    meeting_columns = {column["name"] for column in inspector.get_columns("meetings")}
    if "calendar_event_id" in meeting_columns:
        op.drop_index("ix_meetings_calendar_event_id", table_name="meetings")
        op.drop_column("meetings", "calendar_event_id")

    user_columns = {column["name"] for column in inspector.get_columns("users")}
    if "refresh_token" in user_columns:
        op.drop_column("users", "refresh_token")
