"""custeio do Planejamento: execução sem Centro de Resultado e divisão do custo de insumos

Revision ID: c5e7a9b1d3f4
Revises: b4d6f8a0c2e3
Create Date: 2026-10-30 20:00:00.000000

`custeio_execucao.cenario_id` passa a aceitar nulo (o custeio do Planejamento não é de um Centro) e `custeio_produto` ganha a
divisão do custo de insumos (matéria-prima, embalagem, intermediários). Só roda nos schemas de Planejamento (ver f1a9c3d7e284).
"""
from typing import Sequence, Union

import sqlalchemy as sa
from alembic import op


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

DIVISAO = ('custo_materia_prima', 'custo_embalagem', 'custo_intermediarios')


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
    op.alter_column('custeio_execucao', 'cenario_id', existing_type=sa.Integer(), nullable=True)
    for coluna in DIVISAO:
        op.add_column('custeio_produto', sa.Column(coluna, sa.Numeric(14, 6), server_default='0', nullable=False))


def downgrade() -> None:
    if _no_schema_comum():
        return
    for coluna in reversed(DIVISAO):
        op.drop_column('custeio_produto', coluna)
    # execuções do Planejamento (sem Centro) não cabem na coluna obrigatória: saem, com os resultados delas
    liga = op.get_bind()
    ids = [i for (i,) in liga.execute(sa.text('select id from custeio_execucao where cenario_id is null')).fetchall()]
    for i in ids:
        liga.execute(sa.text('delete from custeio_produto where execucao_id = :i'), {'i': i})
        liga.execute(sa.text('delete from custeio_execucao where id = :i'), {'i': i})
    op.alter_column('custeio_execucao', 'cenario_id', existing_type=sa.Integer(), nullable=False)
