"""formulacao: unidades e conversoes, perda por linha, bacia e perda do produto

Revision ID: d3f6b8a1c294
Revises: c1e8a5b37d92
Create Date: 2026-10-28 18:00:00.000000

Tudo com padrao que preserva os numeros atuais: unidade 'kg', perda 0, sem bacia (o rendimento atual continua valendo).
"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


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


def upgrade() -> None:
    op.add_column('insumo', sa.Column('unidade', sa.String(length=10), server_default='kg', nullable=False))
    op.add_column('produto', sa.Column('unidade', sa.String(length=10), server_default='kg', nullable=False))
    op.add_column('produto', sa.Column('base_quantidade', sa.Numeric(14, 6), nullable=True))
    op.add_column('produto', sa.Column('perda_pct', sa.Numeric(6, 4), server_default='0', nullable=False))
    op.add_column('roteiro_insumo', sa.Column('unidade', sa.String(length=10), server_default='kg', nullable=False))
    op.add_column('roteiro_insumo', sa.Column('perda_pct', sa.Numeric(6, 4), server_default='0', nullable=False))
    op.create_table(
        'conversao_unidade',
        sa.Column('id', sa.Integer(), primary_key=True),
        sa.Column('insumo_id', sa.Integer(), sa.ForeignKey('insumo.id'), nullable=True),
        sa.Column('produto_id', sa.Integer(), sa.ForeignKey('produto.id'), nullable=True),
        sa.Column('unidade', sa.String(length=10), nullable=False),
        sa.Column('fator', sa.Numeric(18, 8), nullable=False),
        sa.CheckConstraint('(insumo_id IS NOT NULL) <> (produto_id IS NOT NULL)', name='ck_conversao_unidade_item_unico'),
        sa.UniqueConstraint('insumo_id', 'produto_id', 'unidade', name='uq_conversao_unidade_item'),
    )


def downgrade() -> None:
    op.drop_table('conversao_unidade')
    op.drop_column('roteiro_insumo', 'perda_pct')
    op.drop_column('roteiro_insumo', 'unidade')
    op.drop_column('produto', 'perda_pct')
    op.drop_column('produto', 'base_quantidade')
    op.drop_column('produto', 'unidade')
    op.drop_column('insumo', 'unidade')
