"""totvs: origem das linhas e itens, produto de revenda e snapshot da estrutura

Revision ID: f1a9c3d7e284
Revises: e8c1b7a45d93
Create Date: 2026-10-29 18:00:00.000000

Tudo é do Planejamento: no Postgres só roda no schema de cada Planejamento (`version_table_schema` definido, ver o
docstring de e8c1b7a45d93); no schema comum a revisão só é registrada. Para reverter além de e8c1b7a45d93, reverta primeiro esta.
"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = 'f1a9c3d7e284'
down_revision: Union[str, None] = 'e8c1b7a45d93'
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
    for tabela in ('insumo', 'produto', 'roteiro_insumo'):
        op.add_column(tabela, sa.Column('origem', sa.String(length=10), server_default='manual', nullable=False))
    op.add_column('produto', sa.Column('custo_compra', sa.Numeric(14, 6), nullable=True))
    op.drop_constraint('ck_produto_tipo', 'produto', type_='check')
    op.create_check_constraint('ck_produto_tipo', 'produto', "tipo in ('acabado', 'semi_acabado', 'revenda')")

    op.create_table(
        'totvs_carga',
        sa.Column('id', sa.Integer(), primary_key=True),
        sa.Column('fonte', sa.String(length=20), nullable=False),
        sa.Column('arquivo', sa.String(length=300), nullable=True),
        sa.Column('sha256', sa.String(length=64), nullable=False),
        sa.Column('emitido_em', sa.Date(), nullable=True),
        sa.Column('vigencia', sa.Date(), nullable=False),
        sa.Column('carregado_em', sa.DateTime(), nullable=False),
        sa.Column('carregado_por', sa.String(length=200), nullable=True),
        sa.Column('resumo', sa.JSON(), nullable=False),
        sa.CheckConstraint("fonte in ('estrutura', 'ndc')", name='ck_totvs_carga_fonte'),
    )
    op.create_table(
        'totvs_estrutura_cab',
        sa.Column('id', sa.Integer(), primary_key=True),
        sa.Column('carga_id', sa.Integer(), sa.ForeignKey('totvs_carga.id'), nullable=False),
        sa.Column('codigo', sa.String(length=20), nullable=False, unique=True),
        sa.Column('descricao', sa.String(length=300), nullable=False),
        sa.Column('tipo', sa.String(length=5), nullable=False),
        sa.Column('grupo', sa.String(length=10), nullable=True),
        sa.Column('unidade', sa.String(length=10), nullable=False),
        sa.Column('base', sa.Numeric(18, 8), nullable=False),
    )
    op.create_table(
        'totvs_estrutura_linha',
        sa.Column('id', sa.Integer(), primary_key=True),
        sa.Column('carga_id', sa.Integer(), sa.ForeignKey('totvs_carga.id'), nullable=False),
        sa.Column('pai_codigo', sa.String(length=20), nullable=False),
        sa.Column('ordem', sa.Integer(), nullable=False),
        sa.Column('componente_codigo', sa.String(length=20), nullable=False),
        sa.Column('tp', sa.String(length=5), nullable=False),
        sa.Column('descricao', sa.String(length=300), nullable=False),
        sa.Column('um', sa.String(length=10), nullable=False),
        sa.Column('quantidade', sa.Numeric(18, 8), nullable=False),
        sa.Column('perda_percentual', sa.Numeric(10, 4), nullable=False),
        sa.Column('qtde_necessaria', sa.Numeric(18, 8), nullable=False),
        sa.Column('qtd_base', sa.Numeric(18, 8), nullable=True),
    )
    op.create_index('ix_totvs_estrutura_linha_pai_codigo', 'totvs_estrutura_linha', ['pai_codigo'])


def downgrade() -> None:
    if _no_schema_comum():
        return
    op.drop_index('ix_totvs_estrutura_linha_pai_codigo', table_name='totvs_estrutura_linha')
    op.drop_table('totvs_estrutura_linha')
    op.drop_table('totvs_estrutura_cab')
    op.drop_table('totvs_carga')
    op.execute("update produto set tipo = 'acabado' where tipo = 'revenda'")
    op.drop_constraint('ck_produto_tipo', 'produto', type_='check')
    op.create_check_constraint('ck_produto_tipo', 'produto', "tipo in ('acabado', 'semi_acabado')")
    op.drop_column('produto', 'custo_compra')
    for tabela in ('roteiro_insumo', 'produto', 'insumo'):
        op.drop_column(tabela, 'origem')
