"""alocacao: direcionador nas linhas de elemento de custo (maquina, ambiente e mao de obra)

Revision ID: b5e2f8a1c746
Revises: f1a9c3d7e284
Create Date: 2026-10-29 21:00:00.000000

Cada linha de elemento passa a poder apontar o Direcionador (de base tempo) pelo qual foi alocada ao produto; a etapa
(`atividade_id`) vem dele. Linhas existentes ganham o direcionador quando a atividade tem **um único** direcionador de base
tempo; as demais ficam sem (a tela de Alocação as sinaliza). Só roda nos schemas de Planejamento (ver f1a9c3d7e284).
"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = 'b5e2f8a1c746'
down_revision: Union[str, None] = 'f1a9c3d7e284'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None

TABELAS = ('roteiro_maquina', 'roteiro_ambiente', 'roteiro_mao_de_obra')


def _no_schema_comum() -> bool:
    contexto = op.get_context()
    return contexto.dialect.name == 'postgresql' and contexto.version_table_schema is None


def upgrade() -> None:
    if _no_schema_comum():
        return
    for tabela in TABELAS:
        op.add_column(tabela, sa.Column('direcionador_id', sa.Integer(), nullable=True))
        op.create_foreign_key(f'fk_{tabela}_direcionador', tabela, 'direcionador', ['direcionador_id'], ['id'])
        op.execute(
            f"update {tabela} set direcionador_id = ("
            f"select d.id from direcionador d where d.atividade_id = {tabela}.atividade_id and d.base = 'tempo') "
            f"where (select count(*) from direcionador d where d.atividade_id = {tabela}.atividade_id and d.base = 'tempo') = 1"
        )


def downgrade() -> None:
    if _no_schema_comum():
        return
    for tabela in TABELAS:
        op.drop_constraint(f'fk_{tabela}_direcionador', tabela, type_='foreignkey')
        op.drop_column(tabela, 'direcionador_id')
