from typing import List
from uuid import UUID

from nasajon.dto_handler.item_nota import ItemNota
from nasajon.dto_handler.nfce import NFCE
from nasajon.utils import utilidades


class Lf_ItensDAO:
    """ Classe de Domínio para Itens de Lançamento Fiscal """

    @staticmethod
    def obterSQLInsertLfItens() -> str:
        """ Retorna o comando SQL para insert na tabela scritta.lf_itens """
        return """ WITH valor(id_ano, descricao, incentivo, ignorasoma, semmov, vinculoreceita, 
                    valor, quantidade, unidade, desconto, descnaotrib, valorcontabil, 
                    cst_ipi, enq_ipi, tipoipi, ipi, baseipi, valoripi, baseipinaotrib, 
                    reducaoipi, valorredipi, valorabatipi, valoripinaotrib, cst_icms, 
                    csosn, icmsdest, baseicms, valoricms, baseicmsnaotrib, reducaoicms, 
                    valorredicms, valorabaticms, valoricmsnaotrib, valordificms, 
                    valorantecicms, valorciap, valoradic, basesubst, valorsubstprop, 
                    valorsubstterc, valorsubstnaoret, valorstcomp, cst_pis, pis, 
                    valorpis, cst_cofins, cofins, valorcofins, ordem, id_item, id, 
                    id_lanfis, fci, picmsufdest, pfcpufdest, picmsinter, vicmsufdest, 
                    vicmsufremet, vfcpufdest, cest, cenq, valorcontabilpis, valorcontabilcofins, 
                    frete, seguro, despesas, pfcp, vfcp, vbcfcp, vbcfcpst, 
                    pfcpst, vfcpst, pfcpstret, vfcpstret, vbcfcpufdest, vbcfcpstret, 
                    pst, lastupdate, tenant, tipi, origem, cbenef, nbenef)
                    AS (VALUES %s)
                    INSERT INTO scritta.lf_itens(id_ano, descricao, incentivo, ignorasoma, semmov, vinculoreceita, 
                    valor, quantidade, unidade, desconto, descnaotrib, valorcontabil, 
                    cst_ipi, enq_ipi, tipoipi, ipi, baseipi, valoripi, baseipinaotrib, 
                    reducaoipi, valorredipi, valorabatipi, valoripinaotrib, cst_icms, 
                    csosn, icmsdest, baseicms, valoricms, baseicmsnaotrib, reducaoicms, 
                    valorredicms, valorabaticms, valoricmsnaotrib, valordificms, 
                    valorantecicms, valorciap, valoradic, basesubst, valorsubstprop, 
                    valorsubstterc, valorsubstnaoret, valorstcomp, cst_pis, pis, 
                    valorpis, cst_cofins, cofins, valorcofins, ordem, id_item, id, 
                    id_lanfis, fci, picmsufdest, pfcpufdest, picmsinter, vicmsufdest, 
                    vicmsufremet, vfcpufdest, cest, cenq, valorcontabilpis, valorcontabilcofins, 
                    frete, seguro, despesas, pfcp, vfcp, vbcfcp, vbcfcpst, 
                    pfcpst, vfcpst, pfcpstret, vfcpstret, vbcfcpufdest, vbcfcpstret, 
                    pst, lastupdate, tenant, tipi, origem, cbenef, nbenef)
                    SELECT lanf.id_ano::integer, lanf.descricao, lanf.incentivo, lanf.ignorasoma::boolean, lanf.semmov::boolean, lanf.vinculoreceita::integer, 
                    lanf.valor::numeric, lanf.quantidade::numeric, lanf.unidade, lanf.desconto::numeric, lanf.descnaotrib::numeric, lanf.valorcontabil::numeric, 
                    lanf.cst_ipi, lanf.enq_ipi, lanf.tipoipi::integer, lanf.ipi::numeric, lanf.baseipi::numeric, lanf.valoripi::numeric, lanf.baseipinaotrib::numeric, 
                    lanf.reducaoipi::numeric, lanf.valorredipi::numeric, lanf.valorabatipi::numeric, lanf.valoripinaotrib::numeric, lanf.cst_icms, 
                    lanf.csosn, lanf.icmsdest::numeric, lanf.baseicms::numeric, lanf.valoricms::numeric, lanf.baseicmsnaotrib::numeric, lanf.reducaoicms::numeric, 
                    lanf.valorredicms::numeric, lanf.valorabaticms::numeric, lanf.valoricmsnaotrib::numeric, lanf.valordificms::numeric, 
                    lanf.valorantecicms::numeric, lanf.valorciap::numeric, lanf.valoradic::numeric, lanf.basesubst::numeric, lanf.valorsubstprop::numeric, 
                    lanf.valorsubstterc::numeric, lanf.valorsubstnaoret::numeric, lanf.valorstcomp::numeric, lanf.cst_pis, lanf.pis::numeric, 
                    lanf.valorpis::numeric, lanf.cst_cofins, lanf.cofins::numeric, lanf.valorcofins::numeric, lanf.ordem::bigint, lanf.id_item::uuid, lanf.id::uuid, 
                    lanf.id_lanfis::uuid, lanf.fci::uuid, lanf.picmsufdest::numeric, lanf.pfcpufdest::numeric, lanf.picmsinter::numeric, lanf.vicmsufdest::numeric, 
                    lanf.vicmsufremet::numeric, lanf.vfcpufdest::numeric, lanf.cest, lanf.cenq, lanf.valorcontabilpis::numeric, lanf.valorcontabilcofins::numeric, 
                    lanf.frete::numeric, lanf.seguro::numeric, lanf.despesas::numeric, lanf.pfcp::numeric, lanf.vfcp::numeric, lanf.vbcfcp::numeric, lanf.vbcfcpst::numeric, 
                    lanf.pfcpst::numeric, lanf.vfcpst::numeric, lanf.pfcpstret::numeric, lanf.vfcpstret::numeric, lanf.vbcfcpufdest::numeric, lanf.vbcfcpstret::numeric, 
                    lanf.pst::numeric, lanf.lastupdate::timestamp without time zone, lanf.tenant::bigint, lanf.tipi, lanf.origem::integer, lanf.cbenef, lanf.nbenef
                    FROM valor lanf
                    WHERE EXISTS(SELECT 1 FROM scritta.lf_lanfis lf WHERE lanf.id_lanfis::uuid = lf.id) """


    @staticmethod
    def obterListaValoresLfItensNFCe(nfe: NFCE, item: ItemNota, idLanfis: UUID) -> List:
        item.id_lanfis = idLanfis
        valores = list()
        valores.append(nfe.dhEmi.year) #  id_ano integer,
        valores.append(item.xProd) #  descricao character varying(150),
        valores.append(None) #  incentivo character varying(12),
        valores.append(False) #  ignorasoma boolean,
        valores.append(False) #  semmov boolean,
        valores.append(None) #  vinculoreceita integer,
        valores.append(item.vProd) #  valor numeric(20,2),
        valores.append(item.qCom) #  quantidade numeric(20,4),
        valores.append(item.uCom) #  unidade character varying(6),
        valores.append(item.vDesc) #  desconto numeric(20,2),
        valores.append(item.icms.retornarValorDesoneracao()) #  descnaotrib numeric(20,2),
        valores.append(item.valorContabil) #  valorcontabil numeric(20,2),
        valores.append(52) #  cst_ipi character varying(2),
        valores.append(None) #  enq_ipi character varying(20),
        valores.append(None) #  tipoipi integer,
        valores.append(0) #  ipi numeric(20,2),
        valores.append(0) #  baseipi numeric(20,2),
        valores.append(0) #  valoripi numeric(20,2),
        valores.append(0) #  baseipinaotrib numeric(20,2),
        valores.append(0) #  reducaoipi numeric(20,2),
        valores.append(0) #  valorredipi numeric(20,2),
        valores.append(0) #  valorabatipi numeric(20,2),
        valores.append(0) #  valoripinaotrib numeric(20,2),
        valores.append(str(item.icms.orig) + item.icms.CST) #  cst_icms character varying(3),
        valores.append(None) #  csosn character varying(3),
        valores.append(item.icms.aliquotaICMSTotal) #  icmsdest numeric(20,2),
        valores.append(item.icms.vBC) #  baseicms numeric(20,2),
        valores.append(item.icms.valorICMSTotal) #  valoricms numeric(20,2),
        valores.append(item.icms.retornarBaseNaoTributada(item.vProd - item.vDesc)) #  baseicmsnaotrib numeric(20,2),
        valores.append(item.icms.pRedBC) #  reducaoicms numeric(20,2),
        valores.append(item.icms.retornarValorReducao(item.vProd - item.vDesc)) #  valorredicms numeric(20,2),
        valores.append(item.icms.vICMSDeson) #  valorabaticms numeric(20,2),
        valores.append(0) #  valoricmsnaotrib numeric(20,2),
        valores.append(0) #  valordificms numeric(20,2),
        valores.append(0) #  valorantecicms numeric(20,2),
        valores.append(0) #  valorciap numeric(20,2),
        valores.append(0) #  valoradic numeric(20,2),
        valores.append(0) #  basesubst numeric(20,2),
        valores.append(0) #  valorsubstprop numeric(20,2),
        valores.append(0) #  valorsubstterc numeric(20,2),
        valores.append(0) #  valorsubstnaoret numeric(20,2),
        valores.append(0) #  valorstcomp numeric(20,2),
        valores.append(None) #  cst_pis character varying(2),
        valores.append(None) #  pis numeric(20,2),
        valores.append(None) #  valorpis numeric(20,2),
        valores.append(None) #  cst_cofins character varying(2),
        valores.append(None) #  cofins numeric(20,2),
        valores.append(None) #  valorcofins numeric(20,2),
        valores.append(item.ordem) #  ordem bigint NOT NULL,
        valores.append(str(item.id_produto)) #  id_item uuid,
        valores.append(str(item.id)) #  id uuid NOT NULL DEFAULT uuid_generate_v4(),
        valores.append(str(idLanfis)) #  id_lanfis uuid,
        valores.append(None) #  fci uuid,
        valores.append(None) #  picmsufdest numeric(20,2),
        valores.append(None) #  pfcpufdest numeric(20,2),
        valores.append(None) #  picmsinter numeric(20,2),
        valores.append(None) #  vicmsufdest numeric(20,2),
        valores.append(None) #  vicmsufremet numeric(20,2),
        valores.append(None) #  vfcpufdest numeric(20,2),
        valores.append(str(item.CEST)) #  cest character varying(7),
        valores.append(None) #  cenq character varying(3),
        valores.append(0) #  valorcontabilpis numeric(20,2),
        valores.append(0) #  valorcontabilcofins numeric(20,2),
        valores.append(0) #  frete numeric(20,2),
        valores.append(0) #  seguro numeric(20,2),
        valores.append(item.vOutro) #  despesas numeric(20,2),
        valores.append(0) #  pfcp numeric(15,2),
        valores.append(0) #  vfcp numeric(15,2),
        valores.append(0) #  vbcfcp numeric(15,2),
        valores.append(0) #  vbcfcpst numeric(15,2),
        valores.append(0) #  pfcpst numeric(15,2),
        valores.append(0) #  vfcpst numeric(15,2),
        valores.append(0) #  pfcpstret numeric(15,2),
        valores.append(0) #  vfcpstret numeric(15,2),
        valores.append(0) #  vbcfcpufdest numeric(15,2),
        valores.append(0) #  vbcfcpstret numeric(15,2),
        valores.append(0) #  pst numeric(15,2),
        valores.append(utilidades.now_brazil()) #  lastupdate timestamp without time zone DEFAULT now(),
        valores.append(0) #  tenant bigint,
        valores.append(item.NCM)  # tipi
        valores.append(item.icms.orig)  # origem
        valores.append(item.cBenef)  # cbenef
        valores.append(item.nBenef)  # nbenef
        return valores

    # @staticmethod
    # def obterListaValoresLfItensSAT(sat: SAT, item: ItemNota, idLanfis: UUID) -> List:
    #     item.id_lanfis = idLanfis
    #     valores = list()
    #     valores.append(sat.dEmi.year) #  id_ano integer,
    #     valores.append(item.xProd) #  descricao character varying(150),
    #     valores.append(None) #  incentivo character varying(12),
    #     valores.append(False) #  ignorasoma boolean,
    #     valores.append(False) #  semmov boolean,
    #     valores.append(None) #  vinculoreceita integer,
    #     valores.append(item.vProd) #  valor numeric(20,2),
    #     valores.append(item.qCom) #  quantidade numeric(20,4),
    #     valores.append(item.uCom) #  unidade character varying(6),
    #     valores.append(item.vDesc) #  desconto numeric(20,2),
    #     valores.append(item.icms.retornarValorDesoneracao()) #  descnaotrib numeric(20,2),
    #     valores.append(item.valorContabil) #  valorcontabil numeric(20,2),
    #     valores.append(52) #  cst_ipi character varying(2),
    #     valores.append(None) #  enq_ipi character varying(20),
    #     valores.append(None) #  tipoipi integer,
    #     valores.append(0) #  ipi numeric(20,2),
    #     valores.append(0) #  baseipi numeric(20,2),
    #     valores.append(0) #  valoripi numeric(20,2),
    #     valores.append(0) #  baseipinaotrib numeric(20,2),
    #     valores.append(0) #  reducaoipi numeric(20,2),
    #     valores.append(0) #  valorredipi numeric(20,2),
    #     valores.append(0) #  valorabatipi numeric(20,2),
    #     valores.append(0) #  valoripinaotrib numeric(20,2),
    #     valores.append(str(item.icms.orig) + item.icms.CST) #  cst_icms character varying(3),
    #     valores.append(None) #  csosn character varying(3),
    #     valores.append(item.icms.aliquotaICMSTotal) #  icmsdest numeric(20,2),
    #     valores.append(item.icms.vBC) #  baseicms numeric(20,2),
    #     valores.append(item.icms.valorICMSTotal) #  valoricms numeric(20,2),
    #     valores.append(item.icms.retornarBaseNaoTributada(item.vProd - item.vDesc)) #  baseicmsnaotrib numeric(20,2),
    #     valores.append(item.icms.pRedBC) #  reducaoicms numeric(20,2),
    #     valores.append(item.icms.retornarValorReducao(item.vProd - item.vDesc)) #  valorredicms numeric(20,2),
    #     valores.append(item.icms.vICMSDeson) #  valorabaticms numeric(20,2),
    #     valores.append(0) #  valoricmsnaotrib numeric(20,2),
    #     valores.append(0) #  valordificms numeric(20,2),
    #     valores.append(0) #  valorantecicms numeric(20,2),
    #     valores.append(0) #  valorciap numeric(20,2),
    #     valores.append(0) #  valoradic numeric(20,2),
    #     valores.append(0) #  basesubst numeric(20,2),
    #     valores.append(0) #  valorsubstprop numeric(20,2),
    #     valores.append(0) #  valorsubstterc numeric(20,2),
    #     valores.append(0) #  valorsubstnaoret numeric(20,2),
    #     valores.append(0) #  valorstcomp numeric(20,2),
    #     valores.append(None) #  cst_pis character varying(2),
    #     valores.append(None) #  pis numeric(20,2),
    #     valores.append(None) #  valorpis numeric(20,2),
    #     valores.append(None) #  cst_cofins character varying(2),
    #     valores.append(None) #  cofins numeric(20,2),
    #     valores.append(None) #  valorcofins numeric(20,2),
    #     valores.append(item.ordem) #  ordem bigint NOT NULL,
    #     valores.append(str(item.id_produto)) #  id_item uuid,
    #     valores.append(str(item.id)) #  id uuid NOT NULL DEFAULT uuid_generate_v4(),
    #     valores.append(str(idLanfis)) #  id_lanfis uuid,
    #     valores.append(None) #  fci uuid,
    #     valores.append(None) #  picmsufdest numeric(20,2),
    #     valores.append(None) #  pfcpufdest numeric(20,2),
    #     valores.append(None) #  picmsinter numeric(20,2),
    #     valores.append(None) #  vicmsufdest numeric(20,2),
    #     valores.append(None) #  vicmsufremet numeric(20,2),
    #     valores.append(None) #  vfcpufdest numeric(20,2),
    #     valores.append(str(item.CEST)) #  cest character varying(7),
    #     valores.append(None) #  cenq character varying(3),
    #     valores.append(0) #  valorcontabilpis numeric(20,2),
    #     valores.append(0) #  valorcontabilcofins numeric(20,2),
    #     valores.append(0) #  frete numeric(20,2),
    #     valores.append(0) #  seguro numeric(20,2),
    #     valores.append(item.vOutro) #  despesas numeric(20,2),
    #     valores.append(0) #  pfcp numeric(15,2),
    #     valores.append(0) #  vfcp numeric(15,2),
    #     valores.append(0) #  vbcfcp numeric(15,2),
    #     valores.append(0) #  vbcfcpst numeric(15,2),
    #     valores.append(0) #  pfcpst numeric(15,2),
    #     valores.append(0) #  vfcpst numeric(15,2),
    #     valores.append(0) #  pfcpstret numeric(15,2),
    #     valores.append(0) #  vfcpstret numeric(15,2),
    #     valores.append(0) #  vbcfcpufdest numeric(15,2),
    #     valores.append(0) #  vbcfcpstret numeric(15,2),
    #     valores.append(0) #  pst numeric(15,2),
    #     valores.append(Miscel.dataHoraAtual()) #  lastupdate timestamp without time zone DEFAULT now(),
    #     valores.append(0) #  tenant bigint,
    #     valores.append(item.NCM)  # tipi
    #     valores.append(item.icms.orig)  # origem
    #     valores.append(item.cBenef)  # cbenef
    #     valores.append(item.nBenef)  # nbenef
    #     return valores
