package com.rjconsultores.ventaboletos.utilerias.archivointegracion;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
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.entidad.Empresa;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.StringHelper;
import com.rjconsultores.ventaboletos.utilerias.UtiliteriasFiscal;
import com.rjconsultores.ventaboletos.vo.impressaofiscal.ImportacionFiscalReducaoZVO;
import com.rjconsultores.ventaboletos.vo.impressaofiscal.SituacaoTributaria;

public class ArchivoIntegracionReducaoZ {

	private static final Logger log = LogManager.getLogger(ArchivoIntegracionReducaoZ.class);

	public File importacionReducaoZ(Date inicio, Date fim, Empresa empresa, boolean isPendencias, List<ImportacionFiscalReducaoZVO> listReducao) {

		try {
			String nomeArquivo = "fiscal_reducao_z_" + DateUtil.getStringDate(Calendar.getInstance().getTime(), "yyyyMMddhhmmss");
			if (isPendencias)
				nomeArquivo = "fiscal_pendencia_reducao_z_" + DateUtil.getStringDate(Calendar.getInstance().getTime(), "yyyyMMddhhmmss");

			File arquivo = File.createTempFile(nomeArquivo, ".txt");

			PrintWriter gravarArq = new PrintWriter(new OutputStreamWriter(new FileOutputStream(arquivo), Constantes.UTF_8));

			Integer seq = 1;

			String cnpjFilial = StringHelper.retornaSomenteNumeros(empresa.getCnpj() == null ? StringHelper.preencherStringEspacoEsquerda(null, 14) : empresa.getCnpj());
			String brancos371 = StringHelper.preencherStringEspacoEsquerda(null, 371);
			String dataAgora = DateUtil.getStringDate(Calendar.getInstance().getTime(), UtiliteriasFiscal.DATE_FORMAT_FISCAL);
			String sequencial = StringHelper.preencherZeroEsquerda(seq.toString(), 6);

			String abertura = UtiliteriasFiscal.aberturaDeArquivo("0", dataAgora, cnpjFilial, brancos371, sequencial);
			gravarArq.print(abertura + UtiliteriasFiscal.QUEBRA_LINHA);

			List<ImportacionFiscalReducaoZVO> list = null;
			if (isPendencias) {
				list = listReducao;
			} else {
				list = agruparReducaoZ(listReducao);
			}

			for (ImportacionFiscalReducaoZVO ifrZ : list) {

				String dataMovimento = ifrZ.getDatamov();
				String cnpj = StringHelper.retornaSomenteNumeros(ifrZ.getCnpj() == null ? StringHelper.preencherStringEspacoEsquerda(null, 14) : ifrZ.getCnpj());

				String impAliquota = ifrZ.getAliquota() == null ? "" : ifrZ.getAliquota().substring(0, 2);
				String numRelatorio = StringHelper.preencherZeroEsquerda(impAliquota, 6);

				String numPDV = StringHelper.preencherStringEspacoEsquerda(ifrZ.getNumpdv(), 10);
				String numSeriePDV = StringHelper.preencherStringEspacoEsquerda(ifrZ.getNumserie20(), 20);
				String numReducaoZ = StringHelper.preencherStringEspacoEsquerda(ifrZ.getCrz(), 5);

				String gtInicial = StringHelper.preencherZeroEsquerda(ifrZ.getGtInicial().toString(), 18);
				String gtFinal = StringHelper.preencherZeroEsquerda(ifrZ.getGtFinal().toString(), 18);

				String docFiscalInic = StringHelper.preencherStringEspacoEsquerda(ifrZ.getCooinicial(), 9);
				String docFiscalFinal = StringHelper.preencherStringEspacoEsquerda(ifrZ.getCoofinal(), 9);

				String valorCancel = StringHelper.preencherZeroEsquerda("", 8);
				String valorContabil = StringHelper.preencherZeroEsquerda(ifrZ.getVendabrutadiaria().toString(), 14);

				String subtributaria = StringHelper.preencherZeroEsquerda("", 14);
				String descontos = StringHelper.preencherZeroEsquerda("", 14);
				String isento = StringHelper.preencherZeroEsquerda("", 14);

				String valorNaoTributado = ifrZ.getValorNaoTributado() == null ? "" : ifrZ.getValorNaoTributado().toString();
				String naoTributado = StringHelper.preencherZeroEsquerda(valorNaoTributado, 14);

				String aliquota = StringHelper.preencherZeroEsquerda("", 14);
				if (ifrZ.getAliquota().length() == 7 && ifrZ.getAliquota().substring(2, 3).equals(SituacaoTributaria.TRIBUTADO.getValue())) {
					aliquota = ifrZ.getAliquota().substring(3, 7);
					aliquota = StringHelper.preencherZeroEsquerda(aliquota, 14);
				}

				String aliquota2 = StringHelper.preencherZeroEsquerda("", 14);
				String aliquota3 = StringHelper.preencherZeroEsquerda("", 14);
				String aliquota4 = StringHelper.preencherZeroEsquerda("", 14);

				String coo = StringHelper.preencherStringEspacoEsquerda(ifrZ.getCoo(), 6);
				String outrosRecebimentos = StringHelper.preencherZeroEsquerda("", 14);

				BigDecimal aliquotaCalc = BigDecimal.valueOf(Double.valueOf(aliquota) / UtiliteriasFiscal.CEM.doubleValue());
				aliquotaCalc = UtiliteriasFiscal.arredondar(aliquotaCalc);

				BigDecimal baseCalculo = UtiliteriasFiscal.arredondar(ifrZ.getImposto().divide(UtiliteriasFiscal.CEM));
				baseCalculo = UtiliteriasFiscal.arredondar(baseCalculo);

				BigDecimal valorImposto = baseCalculo.multiply(aliquotaCalc.divide(UtiliteriasFiscal.CEM));
				valorImposto = UtiliteriasFiscal.arredondar(valorImposto);
				String impostoDebitado = UtiliteriasFiscal.formataZeroDecimal(valorImposto, 13);

				String dataReducaoZ = ifrZ.getDatareducao();
				String horaReducaoZ = ifrZ.getHorareducao();

				String valorDocFiscal = StringHelper.preencherZeroEsquerda(ifrZ.getImposto().toString(), 13);
				
				String cro = StringHelper.preencherZeroEsquerda(ifrZ.getCro(), 4);

				String brancos = StringHelper.preencherStringEspacoEsquerda(null, 68);
				String status = StringHelper.preencherStringEspacoEsquerda(null, 10);
				if (isPendencias)
					status = StringHelper.preencherStringEspacoEsquerda(ifrZ.getStatus(), 10);

				seq++;
				sequencial = StringHelper.preencherZeroEsquerda(seq.toString(), 6);

				String redZ = UtiliteriasFiscal.reducaoZ("1", dataMovimento, cnpj, numRelatorio, numPDV, numSeriePDV, numReducaoZ,
						gtInicial, gtFinal, docFiscalInic, docFiscalFinal, valorCancel, valorContabil, subtributaria,
						descontos, isento, naoTributado, aliquota, aliquota2, aliquota3, aliquota4, coo, outrosRecebimentos,
						impostoDebitado, dataReducaoZ, horaReducaoZ, valorDocFiscal, cro, status, brancos, sequencial);
				gravarArq.print(redZ + UtiliteriasFiscal.QUEBRA_LINHA);
			}

			Integer qtdeDoc = seq - 1;
			seq++;

			String qtdeDocGerados = StringHelper.preencherZeroEsquerda(qtdeDoc.toString(), 6);
			String brancos387 = StringHelper.preencherStringEspacoEsquerda(null, 387);
			sequencial = StringHelper.preencherZeroEsquerda(seq.toString(), 6);

			String fechamento = UtiliteriasFiscal.fechamentoDeArquivo("3", qtdeDocGerados, null, brancos387, sequencial);
			gravarArq.print(fechamento + UtiliteriasFiscal.QUEBRA_LINHA);

			gravarArq.close();
			return arquivo;

		} catch (IOException e) {
			log.error("", e);
		}

		return null;
	}

	private List<ImportacionFiscalReducaoZVO> agruparReducaoZ(List<ImportacionFiscalReducaoZVO> list) {

		List<ImportacionFiscalReducaoZVO> aux = new ArrayList<ImportacionFiscalReducaoZVO>();

		BigDecimal valorNaoTributado = null;
		BigDecimal valorNaoIncluido = BigDecimal.ZERO;

		ImportacionFiscalReducaoZVO item = null;

		for (ImportacionFiscalReducaoZVO ifr : list) {

			if (!ifr.equals(item)) {
				valorNaoIncluido = BigDecimal.ZERO;
				item = ifr;
			}

			String tipoMovimento = ifr.getAliquota();
			if (tipoMovimento.equals(SituacaoTributaria.CANCELADO.getValue()) ||
					tipoMovimento.equals(SituacaoTributaria.DESCONTO.getValue())) {

				valorNaoIncluido = valorNaoIncluido.add(ifr.getImposto());
				ifr.setValorNaoIncluido(valorNaoIncluido);

			} else if (tipoMovimento.equals(SituacaoTributaria.NAO_TRIBUTADO.getValue())) {
				valorNaoTributado = ifr.getImposto();
			} else {

				ifr.setValorNaoTributado(valorNaoTributado);
				ifr.setValorNaoIncluido(valorNaoIncluido);

				BigDecimal valorReducaoZ = ifr.getVendabrutadiaria().subtract(valorNaoIncluido);
				ifr.setVendabrutadiaria(valorReducaoZ);

				aux.add(ifr);

			}
		}

		return aux;
	}

}
