package com.rjconsultores.ventaboletos.utilerias.archivointegracion;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Calendar;
import java.util.List;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.rjconsultores.ventaboletos.constantes.Constantes;
import com.rjconsultores.ventaboletos.exception.BusinessException;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.StringHelper;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.utilerias.UtiliteriasFiscal;
import com.rjconsultores.ventaboletos.vo.impressaofiscal.ImportacionNaoFiscalVO;

public class ArchivoIntegracionNaoFiscal {
	
	private static final Logger log = LogManager.getLogger(ArchivoIntegracionNaoFiscal.class);
	
	private String cnpjFilial;
	private Integer sequencial = 0;
	
	private List<ImportacionNaoFiscalVO> importacionNaoFiscalVOs;
	
	private StringBuilder getAberturaArquivo() {
		StringBuilder aberturaArquivo = new StringBuilder();
		aberturaArquivo.append("0") //Identificador Registro = "0"
					   .append(DateUtil.getStringCurrentDate("yyyyMMdd")) //Data geração arquivo
					   .append(StringHelper.preencherStringEspacoEsquerda(cnpjFilial.replace("[^0-9]", ""), 14)) //Cnpj filial
					   .append(StringHelper.preencherStringEspacoEsquerda(null, 371)) //Brancos
					   .append(StringHelper.preencherZeroEsquerda((++sequencial).toString(), 6)) //Sequencial
					   .append(StringHelper.QUEBRA_LINHA);
		return aberturaArquivo;
	}

	private StringBuilder getHeaderArquivo() {
		StringBuilder headerArquivo = new StringBuilder();
		for (ImportacionNaoFiscalVO importacionNaoFiscalVO : importacionNaoFiscalVOs) {
			headerArquivo.append("1") //Identificador Registro = "1"
			   			 .append(DateUtil.getStringDate(importacionNaoFiscalVO.getFechorvta(),"yyyyMMdd")) //Data emissão documento
			   			 .append(StringHelper.preencherStringEspacoEsquerda(cnpjFilial.replace("[^0-9]", ""), 14)) //Cnpj filial
			   			 .append(StringHelper.preencherStringEspacoEsquerda(importacionNaoFiscalVO.getNumeroDocumento(), 9)) //Numero do Documento
			   			 .append(StringHelper.preencherStringEspacoEsquerda(null, 3)) //Série
			   			 .append(StringHelper.preencherStringEspacoEsquerda("SVP", 5)) //Prefixo = "SVP"
			   			 .append(StringHelper.preencherStringEsquerda(null, 6, "9")) //Codigo Cliente "999999"
			   			 .append(StringHelper.preencherStringEsquerda(null, 2, "9")) //Filial cliente="99"
			   			 .append(StringHelper.preencherStringEsquerda(null, 3, "9")) //condição pagamento = "999"
			   			 .append(UtiliteriasFiscal.formataZeroDecimal(importacionNaoFiscalVO.getTotal(), 2, 14)) //Valor Total documento
			   			 .append(StringHelper.preencherStringEspacoEsquerda("REC", 3)) //Tipo = "REC"
			   			 .append(StringHelper.preencherStringEspacoEsquerda(importacionNaoFiscalVO.getTipoeventoextraId()+"", 10)) //Natureza
			   			 .append(StringHelper.preencherStringEspacoEsquerda(null, 316)) //Brancos
			   			 .append(StringHelper.preencherZeroEsquerda((++sequencial).toString(), 6)) //Sequencial
			   			 .append(StringHelper.QUEBRA_LINHA);
		}
		return headerArquivo;
	}

	private StringBuilder getFechamentoArquivo() {
		StringBuilder fechamentoArquivo = new StringBuilder();
		fechamentoArquivo.append("3") //Identificador Registro = "3"
					   	 .append(StringHelper.preencherZeroEsquerda((importacionNaoFiscalVOs.size())+"", 6)) //Qtde de Documentos gerados = 1
					   	 .append(StringHelper.preencherZeroEsquerda((importacionNaoFiscalVOs.size())+"", 6)) //Qtde de Itens Documentos gerados = 2
					   	 .append(StringHelper.preencherStringEspacoEsquerda(null, 381)) //Brancos
					   	 .append(StringHelper.preencherZeroEsquerda((++sequencial).toString(), 6)); //Sequencial
		return fechamentoArquivo;
	}
	
	public File gerarArquivo(String cnpjFilial, List<ImportacionNaoFiscalVO> importacionNaoFiscalVOs) throws BusinessException {
		try {
			String nomeArquivo = UsuarioLogado.getUsuarioLogado().getNombusuario() + "_" + Calendar.getInstance().getTime().getTime() + "_" + "naofiscal";
			File arquivo = File.createTempFile(nomeArquivo, ".tmp");
			PrintWriter gravarArq = new PrintWriter(new OutputStreamWriter(new FileOutputStream(arquivo), Constantes.UTF_8));
			
			/* Gerando arquivo */
			this.cnpjFilial = cnpjFilial;
			this.importacionNaoFiscalVOs = importacionNaoFiscalVOs;
			gravarArq.print(getAberturaArquivo());
			gravarArq.print(getHeaderArquivo());
			gravarArq.print(getFechamentoArquivo());
			
			gravarArq.close();
			
			return arquivo;			
		} catch (Exception e) {
			log.error(e.getMessage(), e);
			throw new BusinessException(e.getMessage(), e);
		}
	}

}
