"""Add provider-neutral principal/identity/authentication projections."""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql

revision = "184"
down_revision = "183"
branch_labels = None
depends_on = None


def upgrade() -> None:
    op.add_column("project_auth_config", sa.Column("identity_channels", postgresql.JSONB(), nullable=False, server_default="[]"))
    op.add_column("project_auth_config", sa.Column("auth_connections", postgresql.JSONB(), nullable=False, server_default="[]"))
    op.add_column("project_auth_config", sa.Column("audiences", postgresql.JSONB(), nullable=False, server_default='["staff", "customer"]'))
    op.execute(
        """
        UPDATE project_auth_config
        SET identity_channels = CASE
                WHEN providers ? 'email' OR providers ? 'magic_link' OR providers ? 'password' THEN '["email"]'::jsonb
                WHEN providers ? 'google' THEN '["oidc"]'::jsonb
                ELSE '[]'::jsonb
            END,
            auth_connections = CASE
                WHEN providers ? 'email' OR providers ? 'magic_link'
                    THEN '[{"id":"local_magic_link","method":"passwordless","channel":"email"}]'::jsonb
                WHEN providers ? 'google'
                    THEN '[{"id":"google","method":"oidc","channel":"oidc"}]'::jsonb
                ELSE '[]'::jsonb
            END
        WHERE identity_channels = '[]'::jsonb
        """
    )


def downgrade() -> None:
    op.drop_column("project_auth_config", "audiences")
    op.drop_column("project_auth_config", "auth_connections")
    op.drop_column("project_auth_config", "identity_channels")
