"""produto.tabela_de_precos: produto cabeça da Tabela de Preços (o custeio parte dele)

Revision ID: b4d6f8a0c2e3
Revises: a3c5e7b9d1f2
Create Date: 2026-10-30 18:00:00.000000

Marca quem já tem preço na vigência mais recente de algum Centro de Resultado (a regra implícita até aqui). Se não há nenhum
preço, marca os Acabados e Revendas (Semiacabado fica de fora). 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 = 'b4d6f8a0c2e3'
down_revision: Union[str, None] = 'a3c5e7b9d1f2'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


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.add_column('produto', sa.Column('tabela_de_precos', sa.Boolean(), nullable=False, server_default=sa.true()))
    liga = op.get_bind()
    com_preco = liga.execute(sa.text(
        'select count(*) from tabela_de_preco where preco_praticado > 0 or preco_sugerido > 0'
    )).scalar()
    if com_preco:
        liga.execute(sa.text(
            'update produto set tabela_de_precos = :falso where id not in ('
            ' select t.produto_id from tabela_de_preco t'
            ' join (select cenario_id, max(vigencia) as vigencia from tabela_de_preco group by cenario_id) u'
            '   on t.cenario_id = u.cenario_id and t.vigencia = u.vigencia'
            ' where t.preco_praticado > 0 or t.preco_sugerido > 0)'
        ), {'falso': False})
    else:
        liga.execute(sa.text("update produto set tabela_de_precos = :falso where tipo = 'semi_acabado'"), {'falso': False})


def downgrade() -> None:
    if _no_schema_comum():
        return
    op.drop_column('produto', 'tabela_de_precos')
