"""rateio das despesas fixas por Direcionador e trava da Precificação Primária

Revision ID: a1c3e5f7b9d2
Revises: b8d0f2a4c6e8
Create Date: 2026-11-08 10:00:00.000000

`rateio_grupo` (critério da sugestão de cada Direcionador), `rateio_despesa` (o % de cada produto no pool de despesas fixas do Direcionador) e
`trava_primaria` (um registro: a primária travada libera os Centros de Resultados). As tabelas nascem vazias: sem rateio gravado o preço usa a sugestão
(o critério da base do Direcionador), igual ao rateio de antes. 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 = 'a1c3e5f7b9d2'
down_revision: Union[str, None] = 'b8d0f2a4c6e8'
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.create_table(
        'rateio_grupo',
        sa.Column('id', sa.Integer(), primary_key=True),
        sa.Column('direcionador_id', sa.Integer(), sa.ForeignKey('direcionador.id'), nullable=False, unique=True),
        sa.Column('criterio', sa.String(20), nullable=False),
        sa.Column('peso_quantidade', sa.Numeric(6, 4), nullable=True),
        sa.CheckConstraint("criterio in ('custo_volume', 'quantidade', 'mistura', 'tempo', 'igual')", name='ck_rateio_grupo_criterio'),
    )
    op.create_table(
        'rateio_despesa',
        sa.Column('id', sa.Integer(), primary_key=True),
        sa.Column('direcionador_id', sa.Integer(), sa.ForeignKey('direcionador.id'), nullable=False),
        sa.Column('produto_id', sa.Integer(), sa.ForeignKey('produto.id'), nullable=False),
        sa.Column('percentual', sa.Numeric(9, 6), nullable=False),
        sa.UniqueConstraint('direcionador_id', 'produto_id', name='uq_rateio_despesa'),
    )
    op.create_table(
        'trava_primaria',
        sa.Column('id', sa.Integer(), primary_key=True),
        sa.Column('travada', sa.Boolean(), nullable=False, server_default=sa.false()),
        sa.Column('travada_em', sa.DateTime(), nullable=True),
        sa.Column('travada_por', sa.String(200), nullable=True),
        sa.Column('assinatura', sa.String(64), nullable=True),
    )


def downgrade() -> None:
    if _no_schema_comum():
        return
    op.drop_table('trava_primaria')
    op.drop_table('rateio_despesa')
    op.drop_table('rateio_grupo')
