"""Fora o `entity_relations`: eram coincidências judiciais, não relações societárias.

A tabela tinha 14 060 linhas `shared_person` e 87 `same_process`, e era derivada
exclusivamente do `process_parties`. Desse universo, **578 420 das 588 966 partes
têm o papel de credor** — portanto o que a tabela dizia era, na prática, "estas
duas empresas partilham alguém que reclamou créditos numa insolvência de cada
uma". Não é uma relação entre as empresas.

Havia ainda três limites estruturais que impediam qualquer correcção:

* `CHECK (source_company_id < target_company_id)` força arestas não dirigidas, e
  propriedade é dirigida — "a xyz tem quotas na abc" e o inverso são factos
  diferentes;
* o filtro de NIFs começados por 1/2/3 excluía **por construção** os sócios que
  são empresas, que é metade do que interessa num grupo;
* a chave de junção `coalesce(nif, lower(trim(name)))` fundia homónimos quando
  não havia NIF, o que era a maior parte dos casos.

O substituto é o `registry_edges`, do registo comercial: dirigido, com quota
numérica, com o acto de origem e a data de cada afirmação.

Esta migration é destrutiva **por decisão explícita** — a alternativa oferecida
era manter o sinal judicial numa secção à parte. Os dados de origem
(`process_parties`, 588 966 linhas) ficam intactos, portanto isto é reversível
por recomputação, e não uma perda de informação recolhida.
"""
from alembic import op

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


def upgrade() -> None:
    op.execute("DROP TABLE IF EXISTS entity_relations")


def downgrade() -> None:
    # Recria a estrutura; o conteúdo obtinha-se correndo de novo a derivação
    # sobre o `process_parties`, que não foi tocado.
    op.execute(
        """
        CREATE TABLE IF NOT EXISTS entity_relations (
            id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
            source_company_id UUID NOT NULL REFERENCES companies(id) ON DELETE CASCADE,
            target_company_id UUID NOT NULL REFERENCES companies(id) ON DELETE CASCADE,
            relation_type TEXT NOT NULL CHECK (relation_type IN ('shared_person','same_process')),
            shared_name TEXT,
            shared_nif TEXT,
            shared_processes TEXT[],
            process_count INT NOT NULL DEFAULT 1,
            confidence NUMERIC(3,2) NOT NULL,
            computed_at TIMESTAMPTZ NOT NULL DEFAULT now(),
            CHECK (source_company_id < target_company_id)
        )
        """
    )
    op.execute("CREATE INDEX IF NOT EXISTS ix_rel_source ON entity_relations(source_company_id)")
    op.execute("CREATE INDEX IF NOT EXISTS ix_rel_target ON entity_relations(target_company_id)")
    op.execute("CREATE INDEX IF NOT EXISTS ix_rel_type ON entity_relations(relation_type, confidence DESC)")
