"""Add dashboard_configs table.

Revision ID: 046
Revises: 045
"""
import sqlalchemy as sa
from alembic import op
from sqlalchemy.dialects.postgresql import UUID, JSONB

revision = '046'
down_revision = '045'
branch_labels = None
depends_on = None


def upgrade():
    op.create_table(
        'dashboard_configs',
        sa.Column('id', UUID(as_uuid=True), primary_key=True, server_default=sa.text('gen_random_uuid()')),
        sa.Column('tenant_id', UUID(as_uuid=True), sa.ForeignKey('tenants.id', ondelete='CASCADE'), nullable=True),
        sa.Column('user_id', UUID(as_uuid=True), sa.ForeignKey('users.id', ondelete='CASCADE'), nullable=True),
        sa.Column('widgets', JSONB, nullable=False, server_default=sa.text("'[]'::jsonb")),
        sa.Column('is_tenant_default', sa.Boolean, nullable=False, server_default='false'),
        sa.Column('created_at', sa.DateTime, nullable=False, server_default=sa.text('NOW()')),
        sa.Column('updated_at', sa.DateTime, nullable=False, server_default=sa.text('NOW()')),
    )
    # Unique: one config per user
    op.create_index(
        'uq_dashboard_config_user',
        'dashboard_configs',
        ['user_id'],
        unique=True,
        postgresql_where=sa.text('user_id IS NOT NULL'),
    )
    # Unique: one tenant-default per tenant
    op.create_index(
        'uq_dashboard_config_tenant_default',
        'dashboard_configs',
        ['tenant_id'],
        unique=True,
        postgresql_where=sa.text('is_tenant_default = true'),
    )


def downgrade():
    op.drop_index('uq_dashboard_config_tenant_default', table_name='dashboard_configs')
    op.drop_index('uq_dashboard_config_user', table_name='dashboard_configs')
    op.drop_table('dashboard_configs')
