"""A data do cabeçalho que a entidade tem guardado.

O nome, a natureza jurídica e a sede vêm do cabeçalho de um acto. Para saber se
um acto novo os deve substituir é preciso saber de **quando é o que lá está** —
e até agora a comparação era feita contra o `last_act_date`, que é o acto mais
recente **listado**, tenha sido lido ou não.

A diferença não é académica. Uma empresa cujo acto mais recente é uma prestação
de contas de 2026 — que nunca se abre, por não trazer pessoas nem quotas — tem
`last_act_date = 2026`. O cabeçalho só pode vir de um acto lido, e o mais recente
que temos é de 2023. Como 2023 < 2026, a condição nunca disparava e a entidade
ficava presa ao primeiro cabeçalho que por acaso lá tivesse chegado: eram 68
sociedades por quotas guardadas como anónimas depois de duas passagens de
correcção, e cada uma delas mostrava a cap table com um aviso a dizer que estava
superada quando não estava.

Fica NULL para quem nunca recebeu um cabeçalho; o `COALESCE` no `upsert_entity`
trata esse caso como "aceita o primeiro que vier".
"""
from alembic import op

revision = "0032"
down_revision = "0031"
branch_labels = None
depends_on = None


def upgrade() -> None:
    op.execute("ALTER TABLE registry_entities ADD COLUMN header_as_of DATE")
    # Ponto de partida honesto para quem já tem cabeçalho: a data do acto lido
    # mais recente. Não é exacta — não sabemos de qual acto veio o que lá está —
    # mas é o limite superior, e a primeira reaplicação corrige-a.
    op.execute(
        """
        UPDATE registry_entities e
           SET header_as_of = a.d
          FROM (SELECT nipc, max(act_date) AS d FROM registry_acts
                 WHERE body IS NOT NULL GROUP BY nipc) a
         WHERE a.nipc = e.nif AND e.natureza_juridica IS NOT NULL
        """
    )


def downgrade() -> None:
    op.execute("ALTER TABLE registry_entities DROP COLUMN header_as_of")
