"""Add notification_configs table.

Revision ID: 044
Revises: 043
"""
import sqlalchemy as sa
from alembic import op
from sqlalchemy.dialects.postgresql import UUID

revision = '044'
down_revision = '043'
branch_labels = None
depends_on = None

# Standard events
EVENTS = [
    "order.submitted",
    "order.completed",
    "render.completed",
    "render.failed",
    "excel.imported",
]


def upgrade():
    op.create_table(
        'notification_configs',
        sa.Column('id', UUID(as_uuid=True), primary_key=True, server_default=sa.text('gen_random_uuid()')),
        sa.Column('user_id', UUID(as_uuid=True), sa.ForeignKey('users.id', ondelete='CASCADE'), nullable=False),
        sa.Column('event_type', sa.String(100), nullable=False),
        sa.Column('channel', sa.String(20), nullable=False),
        sa.Column('enabled', sa.Boolean, nullable=False, server_default='true'),
        sa.Column('created_at', sa.DateTime, nullable=False, server_default=sa.text('NOW()')),
    )
    op.create_index('ix_notification_configs_user', 'notification_configs', ['user_id'])
    op.create_unique_constraint(
        'uq_notification_config_user_event_channel',
        'notification_configs',
        ['user_id', 'event_type', 'channel']
    )
    # Seed defaults for admin user (in_app=true, email=false)
    for event in EVENTS:
        op.execute(f"""
            INSERT INTO notification_configs (user_id, event_type, channel, enabled)
            SELECT id, '{event}', 'in_app', true FROM users WHERE role = 'admin'
            ON CONFLICT DO NOTHING
        """)
        op.execute(f"""
            INSERT INTO notification_configs (user_id, event_type, channel, enabled)
            SELECT id, '{event}', 'email', false FROM users WHERE role = 'admin'
            ON CONFLICT DO NOTHING
        """)


def downgrade():
    op.drop_table('notification_configs')
