"""A data a que os factos de um acto pertencem, quando não é a da publicação.

Um acto de rectificação **reimprime uma inscrição anterior**. O corpo da
publicação de 2015-08-26 da IGPS PROTEK é a inscrição 1, `AP. 2/20081110` — a
criação da sucursal em 2008, com a designação original do representante. O parser
lia essa designação e carimbava-a com a data de publicação, portanto um facto de
2008 passava a ser o mais recente do processo e a renúncia de 2010 ficava "antes"
dele. É a razão de o Luís Miguel de Sousa Leal continuar a aparecer como
administrador de uma empresa que deixou há quinze anos.

O `act_date` continua a ser o que é — a data de publicação, que é por onde a
interface ordena as publicações. Esta coluna guarda, **só quando difere**, a data
da inscrição reimpressa. Fica NULL no caso normal, que é a esmagadora maioria, e
é isso que permite a `COALESCE(parse_effective_date, act_date)` tratar os dois
casos na mesma consulta sem escrever nada em meio milhão de linhas.

Medido no corpus de 505.961 actos com corpo: 134 republicações, das quais **40
estão elegíveis como a estrutura societária actual** da respectiva empresa — ou
seja, podiam estar a apresentar uma lista de sócios antiga como se fosse a de
hoje. E são só 64 das 10.175 rectificações que já têm corpo lido: o problema
cresce sozinho à medida que a recolha avança.
"""
from alembic import op

revision = "0030"
down_revision = "0029"
branch_labels = None
depends_on = None


def upgrade() -> None:
    op.execute("ALTER TABLE registry_acts ADD COLUMN parse_effective_date DATE")
    # O índice que escolhe a cap table passa a ordenar pela data efectiva. Sem
    # isto a correcção ficava só no papel: a consulta continuaria a ir buscar o
    # acto mais recente por data de publicação.
    op.execute("DROP INDEX IF EXISTS ix_racts_captable_pick")
    op.execute(
        """
        CREATE INDEX ix_racts_captable_pick
            ON registry_acts (nipc, (COALESCE(parse_effective_date, act_date)) DESC NULLS LAST)
         WHERE parse_captable_eligible
        """
    )


def downgrade() -> None:
    op.execute("DROP INDEX IF EXISTS ix_racts_captable_pick")
    op.execute(
        """
        CREATE INDEX ix_racts_captable_pick
            ON registry_acts (nipc, act_date DESC NULLS LAST)
         WHERE parse_captable_eligible
        """
    )
    op.execute("ALTER TABLE registry_acts DROP COLUMN parse_effective_date")
