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.ImportacionManualFiscalVO;
import com.rjconsultores.ventaboletos.vo.impressaofiscal.SubItens;

public class ArchivoIntegracionECFManual {

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

	public File importacionFiscalECFManual(Date inicio, Date fim, Empresa empresa, List<ImportacionManualFiscalVO> listManual) {

		try {
			String nomeArquivo = "fiscal_ecf_manual_" + 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 = 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);

			Integer qtdDoc = 0;
			Integer qtdItens = 0;

			inicio = DateUtil.inicioFecha(inicio);
			fim = DateUtil.fimFecha(fim);

			List<ImportacionManualFiscalVO> list = agruparItensFiscaisManual(listManual);
			for (ImportacionManualFiscalVO imf : list) {

				qtdDoc++;

				String data = imf.getDataEmissao();

				String coo = StringHelper.preencherZeroEsquerda(imf.getCoo(), 9);
				String serie = StringHelper.preencherStringEspacoEsquerda(imf.getSerie(), 3);
				String especie = StringHelper.preencherStringEspacoDireita("RMD", 5);

				String codigoCliente = StringHelper.preencherStringEsquerda(null, 6, "9");
				String filialCliente = StringHelper.preencherStringEsquerda(null, 2, "9");
				String condicaoPagamento = StringHelper.preencherStringEsquerda(null, 3, "9");

				BigDecimal valorTotal = UtiliteriasFiscal.arredondar(calculaValorTotalECFManual(imf));
				String valorTotalDocumanto = UtiliteriasFiscal.formataEspacosDecimalDireita(valorTotal, 14);
				String valorItens = valorTotalDocumanto;

				BigDecimal valorICMS = imf.getIcms() == null ? BigDecimal.ZERO : UtiliteriasFiscal.arredondar(imf.getIcms());
				String baseCalICMS = UtiliteriasFiscal.formataZeroDecimal(valorICMS, 14);

				BigDecimal aliquotaCalc = imf.getIcms() == null ? BigDecimal.ZERO : UtiliteriasFiscal.arredondar(imf.getIcms());
				BigDecimal baseCalculo = UtiliteriasFiscal.arredondar(imf.getValorTotal());
				BigDecimal valorImposto = UtiliteriasFiscal.arredondar(baseCalculo.multiply(aliquotaCalc.divide(UtiliteriasFiscal.CEM)));
				String valorTotalICMS = UtiliteriasFiscal.formataZeroDecimal(valorImposto, 14);

				String valorPIS = StringHelper.preencherZeroEsquerda("", 14);
				String valorCofins = StringHelper.preencherZeroEsquerda("", 14);
				String valorCSLL = StringHelper.preencherZeroEsquerda("", 14);
				String totalICMSIsento = StringHelper.preencherZeroEsquerda("", 14);
				String totalICMSNaotributado = StringHelper.preencherZeroEsquerda("", 14);

				String origenUf = StringHelper.preencherStringEspacoEsquerda(imf.getOrigenUf(), 2);
				String origen = imf.getOrigenId().toString();
				if (origen.length() > 2) {
					origen = origen.substring(2);
					origen = StringHelper.preencherStringEspacoEsquerda(origen, 5);
				} else {
					origen = StringHelper.preencherStringEspacoEsquerda(origen, 5);
				}

				String destinoUf = StringHelper.preencherStringEspacoEsquerda(imf.getDestinoUf(), 2);
				String destino = imf.getDestinoId().toString();
				if (destino.length() > 2) {
					destino = destino.substring(2);
					destino = StringHelper.preencherStringEspacoEsquerda(destino, 5);
				} else {
					destino = StringHelper.preencherStringEspacoEsquerda(destino, 5);
				}

				String subSerie = StringHelper.preencherStringEspacoEsquerda(imf.getSubSerie(), 2);
				String aidf = StringHelper.preencherStringEspacoEsquerda(imf.getAidf(), 30);
				String status = StringHelper.preencherStringEspacoEsquerda(imf.getStatus(), 1);
				String claseServicio = StringHelper.preencherStringEspacoDireita(imf.getClaseServicio(), 30);
				String brancos170 = StringHelper.preencherStringEspacoEsquerda(null, 170);

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

				String header = UtiliteriasFiscal.headerDocumentoFiscal("1", data, cnpjFilial, coo, serie, especie, codigoCliente,
						filialCliente, condicaoPagamento, valorTotalDocumanto, valorItens, baseCalICMS, valorTotalICMS,
						valorPIS, valorCofins, valorCSLL, totalICMSIsento, totalICMSNaotributado, origenUf, origen,
						destinoUf, destino, subSerie,
						aidf, status, null, null, brancos170, claseServicio, sequencial);
				gravarArq.print(header + UtiliteriasFiscal.QUEBRA_LINHA);

				for (String itemDoc : montarItensFiscaisManual(imf, imf.getSubItens(), seq)) {

					qtdItens++;
					gravarArq.print(itemDoc + UtiliteriasFiscal.QUEBRA_LINHA);
					seq++;
				}
			}

			seq++;

			String qtdeDocGerados = StringHelper.preencherZeroEsquerda(qtdDoc.toString(), 6);
			String qtdeItensDocGerados = StringHelper.preencherZeroEsquerda(qtdItens.toString(), 6);
			String brancos381 = StringHelper.preencherStringEspacoEsquerda(null, 381);
			sequencial = StringHelper.preencherZeroEsquerda(seq.toString(), 6);

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

			gravarArq.close();
			return arquivo;

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

		return null;
	}

	private BigDecimal calculaValorTotalECFManual(ImportacionManualFiscalVO imf) {
		BigDecimal valorTotal = BigDecimal.ZERO;
		valorTotal = valorTotal.add(imf.getValorTotal());
		valorTotal = valorTotal.add(imf.getImporteoutros() == null ? BigDecimal.ZERO : imf.getImporteoutros());
		valorTotal = valorTotal.add(imf.getImportepedagio() == null ? BigDecimal.ZERO : imf.getImportepedagio());
		valorTotal = valorTotal.add(imf.getImporteseguro() == null ? BigDecimal.ZERO : imf.getImporteseguro());
		valorTotal = valorTotal.add(imf.getImportetaxaembarque() == null ? BigDecimal.ZERO : imf.getImportetaxaembarque());
		return valorTotal;
	}

	private List<String> montarItensFiscaisManual(ImportacionManualFiscalVO imf, List<SubItens> itensFiscais, Integer seq) {

		List<String> itensDocs = new ArrayList<String>();
		Integer num = 0;

		for (SubItens item : itensFiscais) {

			num++;
			String numItem = StringHelper.preencherZeroEsquerda(num.toString(), 3);

			String cfop = null;
			if (imf.getEstadoIdOrigen() != imf.getEstadoIdDestino()) {
				cfop = StringHelper.preencherStringEspacoDireita("6357", 5);
			} else {
				cfop = StringHelper.preencherStringEspacoDireita("5357", 5);
			}

			String codigoTES = StringHelper.preencherStringEsquerda(null, 3, "9");
			String prod = imf.getCodProduto() == null ? item.getCodProduto() : imf.getCodProduto();
			String codProduto = StringHelper.preencherStringEspacoEsquerda(prod, 15);

			String unidade = "UN";
			String quantidade = "001";

			BigDecimal valorItem = UtiliteriasFiscal.arredondar(item.getValor());
			String valorUnitario = UtiliteriasFiscal.formataZeroDecimal(valorItem, 15);
			String valorTotal = UtiliteriasFiscal.formataZeroDecimal(valorItem, 15);

			String aliquotaItem = UtiliteriasFiscal.formataZeroDecimal(null, 7);
			String impostoItem = UtiliteriasFiscal.formataZeroDecimal(null, 15);
			String totalICMSIsentoItem = StringHelper.preencherZeroEsquerda("", 15);
			String totalICMSNaotributadoItem = StringHelper.preencherZeroEsquerda("", 15);

			if (codProduto.indexOf("TA") >= 0) {
				BigDecimal aliquotaCalc = UtiliteriasFiscal.arredondar(imf.getIcms() == null ? BigDecimal.ZERO : imf.getIcms());
				BigDecimal baseCalculo = UtiliteriasFiscal.arredondar(imf.getValorTotal() == null ? BigDecimal.ZERO : imf.getValorTotal());
				BigDecimal valorImposto = UtiliteriasFiscal.arredondar(baseCalculo.multiply(aliquotaCalc.divide(UtiliteriasFiscal.CEM)));
				impostoItem = UtiliteriasFiscal.formataZeroDecimal(valorImposto, 15);
			} else {
				totalICMSNaotributadoItem = StringHelper.preencherZeroEsquerda(valorTotal, 15);
			}

			String aliquotaPIS = StringHelper.preencherZeroEsquerda("", 7);
			String valorPIS = StringHelper.preencherZeroEsquerda("", 15);
			String aliquotaCofins = StringHelper.preencherZeroEsquerda("", 7);
			String valorCofins = StringHelper.preencherZeroEsquerda("", 15);
			String aliquotaCSLL = StringHelper.preencherZeroEsquerda("", 7);
			String valorCSLL = StringHelper.preencherZeroEsquerda("", 15);
			String aliquotaISS = StringHelper.preencherZeroEsquerda("", 7);
			String valorISS = StringHelper.preencherZeroEsquerda("", 15);

			String numeroPDV = StringHelper.preencherStringEspacoDireita(imf.getNumpdv(), 10);
			String numeroSeriePDV = StringHelper.preencherStringEspacoDireita(imf.getNumImpressora(), 20);
			String modeloImpressora = StringHelper.preencherStringEspacoDireita(imf.getModeloImpressora(), 40);
			String numCaixa = StringHelper.preencherStringEspacoDireita(imf.getNumCaixa(), 10);
			String status = StringHelper.preencherStringEspacoEsquerda(imf.getStatus(), 1);

			seq++;
			String sequencial = StringHelper.preencherZeroEsquerda(seq.toString(), 6);
			String brancos111 = StringHelper.preencherStringEspacoDireita(null, 111);

			String itemDoc = UtiliteriasFiscal.itensDocumentoFiscal("2", numItem, cfop, codigoTES, codProduto,
					unidade, quantidade, valorUnitario, valorTotal, aliquotaItem, impostoItem,
					aliquotaPIS, valorPIS, aliquotaCofins, valorCofins, aliquotaCSLL, valorCSLL,
					aliquotaISS, valorISS, totalICMSIsentoItem, totalICMSNaotributadoItem,
					numeroPDV, numeroSeriePDV, modeloImpressora, numCaixa, status, null, null,
					brancos111, sequencial);
			itensDocs.add(itemDoc);
		}

		return itensDocs;
	}

	private List<ImportacionManualFiscalVO> agruparItensFiscaisManual(List<ImportacionManualFiscalVO> list) {

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

		for (ImportacionManualFiscalVO imf : list) {

			List<SubItens> itens = new ArrayList<SubItens>();
			if (imf.getImportepedagio() != null) {
				itens.add(new SubItens(imf.getImportepedagio(), "00000000000-PE"));
			}

			if (imf.getImporteseguro() != null) {
				if (imf.getImporteseguro().signum() > BigDecimal.ZERO.intValue())
					itens.add(new SubItens(imf.getImporteseguro(), "00000000000-SE"));
			}

			if (imf.getImportetaxaembarque() != null) {
				itens.add(new SubItens(imf.getImportetaxaembarque(), "00000000000-TX"));
			}
			
			if (imf.getValorTotal() != null) {
				itens.add(new SubItens(imf.getValorTotal(), "00000000000-TA"));
			}

			imf.setSubItens(itens);
			aux.add(imf);
		}

		return aux;
	}
}
