"""cire_announcements — sweep nacional dos anúncios de insolvência do CITIUS.

O scrape CIRE existente é por NIF e só vê empresas já registadas. Estas tabelas
guardam **todos** os anúncios publicados, independentemente de darem match hoje,
porque o cruzamento com a watchlist é retroactivo: quando um cliente novo entrar,
tem de haver histórico para ele. Mesma razão que levou à `dre_raw` (migration
0014).

As partes ficam em tabela própria e **não** são duplicadas no `raw`. O
`processes.raw` faz essa duplicação e custa ~7,7 kB por linha (83 kB no pior
caso, uma insolvência com centenas de credores); a esta escala — ~110 anúncios
por dia — isso seriam ~440 MB/ano em vez dos ~110 MB/ano desta forma.
"""
from alembic import op

revision = "0020"
down_revision = "0019"
branch_labels = None
depends_on = None


def upgrade() -> None:
    op.execute(
        """
        CREATE TABLE cire_announcements (
            id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
            referencia TEXT,
            tribunal TEXT,
            juizo TEXT,
            ato TEXT,
            ato_group TEXT,
            process_number TEXT,
            species TEXT,
            pub_date DATE,
            action_date DATE,
            raw JSONB NOT NULL DEFAULT '{}'::jsonb,

            -- PDF do anúncio: só é puxado para actos que abrem prazo de
            -- reclamação; nos restantes fica a pedido, quando houver match.
            pdf_token TEXT,
            has_pdf BOOLEAN NOT NULL DEFAULT false,
            pdf_text TEXT,
            detail_fetched_at TIMESTAMPTZ,

            claim_days INTEGER,
            claim_days_source TEXT,
            editos_days INTEGER,
            claim_deadline DATE,
            claim_deadline_estimated BOOLEAN NOT NULL DEFAULT false,
            opens_claim_window BOOLEAN NOT NULL DEFAULT false,

            insolvency_date DATE,
            debtor_nif CHAR(9),
            debtor_name TEXT,
            debtor_address TEXT,
            admin_name TEXT,
            admin_email TEXT,
            admin_nif CHAR(9),

            dedup_hash CHAR(64) NOT NULL UNIQUE,
            first_seen_at TIMESTAMPTZ NOT NULL DEFAULT now(),
            last_seen_at TIMESTAMPTZ NOT NULL DEFAULT now()
        );
        CREATE INDEX ix_cire_ann_pub_date ON cire_announcements(pub_date DESC);
        CREATE INDEX ix_cire_ann_deadline ON cire_announcements(claim_deadline)
            WHERE claim_deadline IS NOT NULL;
        CREATE INDEX ix_cire_ann_process ON cire_announcements(process_number);
        CREATE INDEX ix_cire_ann_debtor_nif ON cire_announcements(debtor_nif)
            WHERE debtor_nif IS NOT NULL;
        CREATE INDEX ix_cire_ann_claims ON cire_announcements(opens_claim_window)
            WHERE opens_claim_window;

        CREATE TABLE cire_announcement_parties (
            id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
            announcement_id UUID NOT NULL
                REFERENCES cire_announcements(id) ON DELETE CASCADE,
            role TEXT,
            name TEXT NOT NULL,
            nif CHAR(9)
        );
        CREATE INDEX ix_cire_ann_parties_ann ON cire_announcement_parties(announcement_id);
        CREATE INDEX ix_cire_ann_parties_nif ON cire_announcement_parties(nif)
            WHERE nif IS NOT NULL;
        CREATE INDEX ix_cire_ann_parties_name_trgm
            ON cire_announcement_parties USING gin (name gin_trgm_ops);
        """
    )


def downgrade() -> None:
    op.execute(
        """
        DROP TABLE IF EXISTS cire_announcement_parties;
        DROP TABLE IF EXISTS cire_announcements;
        """
    )
