"""ICMS: crédito por origem da compra, Desenvolve-BA simplificado

Revision ID: e7a9c1d3f5b6
Revises: d6f8a0b2c4e5
Create Date: 2026-10-31 10:00:00.000000

`icms_compra` (alíquota do crédito por origem do fornecedor: Bahia, Sul/Sudeste exceto ES, demais), `classificacao_credito.faixa` (origem da
compra do item com ICMS) e o Desenvolve-BA sem vigência, prazo nem taxas: só % dilatado, % pago à vista e % de Fundo de Pobreza. 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 = 'e7a9c1d3f5b6'
down_revision: Union[str, None] = 'd6f8a0b2c4e5'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None

ALIQUOTAS = {'BA': '0.205', 'SUL_SUDESTE': '0.07', 'NORTE_NE_CO_ES': '0.12'}
# colunas do Desenvolve de antes: (nome, tipo, valor ao voltar)
ANTIGAS = [
    ('vigencia_inicio', sa.Date(), None), ('vigencia_fim', sa.Date(), None),
    ('piso_mensal', sa.Numeric(14, 6), '0'), ('prazo_meses', sa.Integer(), '0'),
    ('desconto_liquidacao_pct', sa.Numeric(8, 6), '0'), ('taxa_atualizacao_aa', sa.Numeric(8, 6), '0'), ('taxa_desconto_aa', sa.Numeric(8, 6), '0'),
]


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
    compra = op.create_table(
        'icms_compra',
        sa.Column('id', sa.Integer(), primary_key=True),
        sa.Column('faixa', sa.String(15), nullable=False, unique=True),
        sa.Column('aliquota_pct', sa.Numeric(8, 6), nullable=False),
        sa.CheckConstraint("faixa in ('BA', 'SUL_SUDESTE', 'NORTE_NE_CO_ES')", name='ck_icms_compra_faixa'),
    )
    op.bulk_insert(compra, [{'faixa': f, 'aliquota_pct': a} for f, a in ALIQUOTAS.items()])
    op.add_column('classificacao_credito', sa.Column('faixa', sa.String(15), nullable=True))
    op.add_column('icms_desenvolve', sa.Column('pct_pago_a_vista', sa.Numeric(8, 6), server_default='0', nullable=False))
    op.add_column('icms_desenvolve', sa.Column('pct_fundo_pobreza', sa.Numeric(8, 6), server_default='0', nullable=False))
    for nome, _, _ in ANTIGAS:
        op.drop_column('icms_desenvolve', nome)


def downgrade() -> None:
    if _no_schema_comum():
        return
    for nome, tipo, padrao in ANTIGAS:
        if padrao is None:
            op.add_column('icms_desenvolve', sa.Column(nome, tipo, nullable=True))
        else:
            op.add_column('icms_desenvolve', sa.Column(nome, tipo, server_default=padrao, nullable=False))
    op.drop_column('icms_desenvolve', 'pct_fundo_pobreza')
    op.drop_column('icms_desenvolve', 'pct_pago_a_vista')
    op.drop_column('classificacao_credito', 'faixa')
    op.drop_table('icms_compra')
