"""meta de lucro única e preço definido da precificação primária

Revision ID: d3f5a7b9c1e2
Revises: c2e4a6b8d0f1
Create Date: 2026-11-02 10:00:00.000000

`meta_lucro` (um registro por Planejamento: sócios, reserva, expansão, outros e a soma) e `preco_primario` (preço definido por produto; nulo = segue o
sugerido). A meta nasce com a Regra de Margem do primeiro Centro de Resultado, se houver. 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 = 'd3f5a7b9c1e2'
down_revision: Union[str, None] = 'c2e4a6b8d0f1'
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(
        'meta_lucro',
        sa.Column('id', sa.Integer(), primary_key=True),
        sa.Column('percentual_socios', sa.Numeric(6, 4), nullable=False, server_default='0'),
        sa.Column('percentual_reserva', sa.Numeric(6, 4), nullable=False, server_default='0'),
        sa.Column('percentual_expansao', sa.Numeric(6, 4), nullable=False, server_default='0'),
        sa.Column('percentual_outros', sa.Numeric(6, 4), nullable=False, server_default='0'),
        sa.Column('percentual_margem', sa.Numeric(6, 4), nullable=False, server_default='0'),
    )
    op.create_table(
        'preco_primario',
        sa.Column('id', sa.Integer(), primary_key=True),
        sa.Column('produto_id', sa.Integer(), sa.ForeignKey('produto.id'), nullable=False, unique=True),
        sa.Column('preco_definido', sa.Numeric(14, 6), nullable=True),
    )
    op.get_bind().execute(sa.text(
        "insert into meta_lucro (percentual_socios, percentual_reserva, percentual_expansao, percentual_outros, percentual_margem) "
        "select percentual_socios, percentual_reserva, percentual_expansao, percentual_outros, percentual_margem "
        "from regra_de_margem order by id limit 1"
    ))


def downgrade() -> None:
    if _no_schema_comum():
        return
    op.drop_table('preco_primario')
    op.drop_table('meta_lucro')
