"""Configuração do motor de precificação (modo dos impostos) e a composição do preço devolvida pelas telas de preço."""

from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session

from custos_precificacao import motor_preco
from custos_precificacao.api.deps import get_session
from custos_precificacao.api.schemas import ComposicaoPrecoOut, ConfiguracaoPrecoIn, ConfiguracaoPrecoOut
from custos_precificacao.rateio import PrimariaTravada

router = APIRouter(tags=["precificacao"])


@router.get("/precificacao/configuracao", response_model=ConfiguracaoPrecoOut)
def obter_configuracao(session: Session = Depends(get_session)) -> ConfiguracaoPrecoOut:
    return ConfiguracaoPrecoOut(modo_impostos=motor_preco.obter_modo(session))


@router.put("/precificacao/configuracao", response_model=ConfiguracaoPrecoOut)
def definir_configuracao(corpo: ConfiguracaoPrecoIn, session: Session = Depends(get_session)) -> ConfiguracaoPrecoOut:
    try:
        return ConfiguracaoPrecoOut(modo_impostos=motor_preco.definir_modo(session, corpo.modo_impostos))
    except PrimariaTravada as exc:
        raise HTTPException(status_code=409, detail=str(exc)) from exc
    except ValueError as exc:
        raise HTTPException(status_code=422, detail=str(exc)) from exc


def _composicao_out(c: motor_preco.ComposicaoPreco) -> ComposicaoPrecoOut:
    return ComposicaoPrecoOut(
        custo_producao=c.custo_producao, despesa_fixa=c.despesa_fixa, creditos_icms=c.creditos_icms, creditos_cbs=c.creditos_cbs,
        base=c.base, pct_icms=c.pct_icms, pct_cbs=c.pct_cbs, pct_creditos=c.pct_creditos, pct_impostos=c.pct_impostos,
        pct_despesas_variaveis=c.pct_despesas_variaveis, pct_lucro=c.pct_lucro, aliquota_ir_csll=c.aliquota_ir_csll,
        pct_lucro_antes_do_ir=c.pct_lucro_antes_do_ir, divisor=c.divisor, preco_calculado=c.preco,
    )
