"""Definições de notificações: interruptor geral, defeitos por tipo, excepção por empresa.

Antes disto, o comportamento dos avisos estava espalhado por três sítios: o
destinatário numa linha de `alerts_config`, a decisão de quem gera aviso implícita
no SQL do `insolvency_matching`, e nada em lado nenhum para desligar tudo de uma
vez. Passa a haver uma cadeia explícita e testável:

    interruptor geral -> excepção da empresa -> defeito do tipo -> destinatários

`app_settings` é o sítio que faltava: a página de Definições só tinha tema e
password, portanto não havia onde guardar uma preferência global.

`companies.alerts_enabled` nasce a `false` nas de análise e nas `related`, por
decisão do user — dados recolhidos como as outras, mas sem email. As internas
ficam a `true`, que é o pedido de "receber por email incidentes da minha empresa".
"""
from alembic import op

revision = "0026"
down_revision = "0025"
branch_labels = None
depends_on = None


def upgrade() -> None:
    op.execute(
        """
        CREATE TABLE app_settings (
            key TEXT PRIMARY KEY,
            value JSONB NOT NULL,
            updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
            updated_by UUID REFERENCES users(id) ON DELETE SET NULL
        )
        """
    )

    op.execute(
        "ALTER TABLE companies ADD COLUMN alerts_enabled BOOLEAN NOT NULL DEFAULT TRUE"
    )
    # Excepção por empresa: NULL significaria "segue o defeito do tipo", mas uma
    # coluna NOT NULL com defeito TRUE é mais simples de ler nas queries e a
    # semântica que interessa fica na matriz de tipos. Quem quiser calar uma
    # empresa concreta põe FALSE aqui.
    op.execute(
        """
        UPDATE companies SET alerts_enabled = FALSE
         WHERE monitoring_type IN ('analysis', 'related')
        """
    )
    op.execute(
        """
        CREATE INDEX ix_companies_alerts_off ON companies(alerts_enabled)
         WHERE NOT alerts_enabled
        """
    )

    op.execute(
        """
        INSERT INTO app_settings (key, value) VALUES
          ('email_notifications_enabled', 'true'::jsonb),
          ('default_alert_email', '"geral@segunor.pt"'::jsonb),
          ('alert_defaults_by_type', '{
             "internal": true,
             "competitor": true,
             "client": true,
             "analysis": false,
             "related": false
           }'::jsonb)
        ON CONFLICT (key) DO NOTHING
        """
    )


def downgrade() -> None:
    op.execute("DROP INDEX IF EXISTS ix_companies_alerts_off")
    op.execute("ALTER TABLE companies DROP COLUMN IF EXISTS alerts_enabled")
    op.execute("DROP TABLE IF EXISTS app_settings")
