package br.com.swconsultoria.nfe.util;

import br.com.swconsultoria.nfe.Assinar;
import br.com.swconsultoria.nfe.dom.ConfiguracoesNfe;
import br.com.swconsultoria.nfe.dom.enuns.AssinaturaEnum;
import br.com.swconsultoria.nfe.dom.enuns.DocumentoEnum;
import br.com.swconsultoria.nfe.exception.NfeException;
import br.com.swconsultoria.nfe.schema_4.inutNFe.TInutNFe;
import br.com.swconsultoria.nfe.schema_4.inutNFe.TProcInutNFe;
import br.com.swconsultoria.nfe.schema_4.inutNFe.TRetInutNFe;

import javax.xml.bind.JAXBException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * @author Samuel Oliveira - samuk.exe@hotmail.com
 * Data: 02/03/2019 - 22:51
 */
public class InutilizacaoUtil {

    /**
     * Monta o Evento de Inutilização
     * @param tipoDocumento
     * @param cnpj
     * @param serie
     * @param numeroInicial
     * @param numeroFinal
     * @param justificativa
     * @param configuracao
     * @return
     * @throws NfeException
     */
    public static TInutNFe montaInutilizacao(DocumentoEnum tipoDocumento, String cnpj, int serie, int numeroInicial, int numeroFinal, String justificativa, LocalDateTime dataInutilizacao, ConfiguracoesNfe configuracao){

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yy");
        String cUf = configuracao.getEstado().getCodigoUF();
        String ano = dataInutilizacao.format(formatter);
        String serieCompleta = ChaveUtil.completarComZerosAEsquerda(String.valueOf(serie), 3);
        String nInicial = ChaveUtil.completarComZerosAEsquerda(String.valueOf(numeroInicial), 9);
        String nFinal = ChaveUtil.completarComZerosAEsquerda(String.valueOf(numeroFinal), 9);

        String id = "ID" + cUf + ano + cnpj + tipoDocumento.getModelo() + serieCompleta + nInicial + nFinal;

        TInutNFe inutNFe = new TInutNFe();
        inutNFe.setVersao(ConstantesUtil.VERSAO.INUTILIZACAO);

        TInutNFe.InfInut infInut = new TInutNFe.InfInut();
        infInut.setId(id);
        infInut.setTpAmb(configuracao.getAmbiente().getCodigo());
        infInut.setXServ("INUTILIZAR");
        infInut.setCUF(cUf);
        infInut.setAno(ano);

        infInut.setCNPJ(cnpj);
        infInut.setMod(tipoDocumento.getModelo());
        infInut.setSerie(String.valueOf(serie));

        infInut.setNNFIni(String.valueOf(numeroInicial));
        infInut.setNNFFin(String.valueOf(numeroFinal));

        infInut.setXJust(justificativa);
        inutNFe.setInfInut(infInut);

        return inutNFe;

    }

    /**
     * Cria o ProcEvento da Inutilização
     * @param inutNFe
     * @param retorno
     * @param configuracoesNfe
     * @return
     * @throws JAXBException
     * @throws NfeException
     */
    public static String criaProcInutilizacao(ConfiguracoesNfe configuracoesNfe, TInutNFe inutNFe, TRetInutNFe retorno) throws JAXBException, NfeException {


        String xml = XmlNfeUtil.objectToXml(inutNFe, configuracoesNfe.getEncode());
        xml = xml.replaceAll(" xmlns:ns2=\"http://www.w3.org/2000/09/xmldsig#\"", "");
        xml = Assinar.assinaNfe(configuracoesNfe, xml, AssinaturaEnum.INUTILIZACAO);

        String assinado = Assinar.assinaNfe(ConfiguracoesUtil.iniciaConfiguracoes(configuracoesNfe), xml, AssinaturaEnum.INUTILIZACAO);

        // Criação do ProcInutNfe
        TProcInutNFe procInutNFe = new TProcInutNFe();
        procInutNFe.setInutNFe(XmlNfeUtil.xmlToObject(assinado, TInutNFe.class));
        procInutNFe.setRetInutNFe(retorno);
        procInutNFe.setVersao(ConstantesUtil.VERSAO.INUTILIZACAO);

        return XmlNfeUtil.objectToXml(procInutNFe, configuracoesNfe.getEncode());
    }

}
