package com.rjconsultores.ventaboletos.utilerias;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;

import org.apache.commons.lang.StringUtils;

import com.rjconsultores.ventaboletos.vo.impressaofiscal.ImportacionFiscalVO;

public class UtiliteriasFiscal {

	private static int DECIMALS = 2;
	private static int ROUNDING_MODE = BigDecimal.ROUND_HALF_EVEN;

	public static final String DATE_FORMAT_FISCAL = "yyyyMMdd";
	public static final BigDecimal CEM = BigDecimal.valueOf(100);
	public static final String QUEBRA_LINHA = "\r\n";

	public static BigDecimal divideEFormata(BigDecimal valor) {
		String vlrFormatado = StringHelper.divideEFormata(valor.toString());
		return new BigDecimal(vlrFormatado);
	}

	public static String defineCodigoProduto(Integer idOrigemCorrida, Integer idDestinoCorrida, Integer idLinha) {
		int tamanhoMaximo = 12;

		String codOrigem = Integer.toHexString(idOrigemCorrida);
		String codDestino = Integer.toHexString(idDestinoCorrida);
		String codLinha = Integer.toHexString(idLinha);

		codOrigem = codOrigem.toUpperCase() + StringUtils.repeat("X", 4 - codOrigem.length());
		codDestino = codDestino.toUpperCase() + StringUtils.repeat("X", 4 - codDestino.length());
		codLinha = codLinha.toUpperCase() + StringUtils.repeat("X", 3 - codLinha.length());

		String codProduto = codOrigem + codDestino + codLinha + "-";

		if (codProduto.length() > tamanhoMaximo) {
			codProduto = codProduto.substring(1, tamanhoMaximo + 1);
		}

		return codProduto;
	}

	public static void main(String args[]) {
		System.out.println(formataZeroDecimal(new BigDecimal("3870.00"), 2, 14));
	}

	public static String formataNumerico(final String valor, final int tamanho) {
		return formataNumerico(valor, false, tamanho);
	}

	public static String formataNumerico(final String valor, final boolean removeMascara, final int tamanho) {
		String retorno = StringUtils.trim(valor);

		if (retorno == null) {
			retorno = "";
		}

		if (removeMascara) {
			retorno = retorno.replace("-", "").replace(".", "").replace("/", "");
		}

		retorno = retorno.replace(".", "").replace(",", "");

		if (tamanho > 0) {
			if (retorno.length() > tamanho) {
				retorno = retorno.substring(retorno.length() - tamanho, retorno.length());
			}

			return StringUtils.leftPad(retorno, tamanho, "0");
		}

		return retorno;
	}

	public static String formataZeroDecimal(final BigDecimal valor, final int tamanho) {
		String valorFommat = valor == null ? "" : valor.toString();
		valorFommat = valorFommat.toString().replace(".", "").replace(",", "");
		valorFommat = formataNumerico(valorFommat, valorFommat.length());
		valorFommat = StringUtils.leftPad(valorFommat, (tamanho), "0");
		return valorFommat;
	}

	public static String formataEspacosDecimalEsquerda(final BigDecimal valor, final int tamanho) {
		String valorFommat = valor == null ? "" : valor.toString();
		valorFommat = valorFommat.toString().replace(".", "").replace(",", "");
		valorFommat = UtiliteriasFiscal.formataNumerico(valorFommat, valorFommat.length());
		valorFommat = StringUtils.leftPad(valorFommat, (tamanho), " ");
		return valorFommat;
	}

	public static String formataEspacosDecimalDireita(final BigDecimal valor, final int tamanho) {
		String valorFommat = valor == null ? "" : valor.toString();
		valorFommat = valorFommat.toString().replace(".", "").replace(",", "");
		valorFommat = UtiliteriasFiscal.formataNumerico(valorFommat, valorFommat.length());
		valorFommat = StringUtils.rightPad(valorFommat, (tamanho), " ");
		return valorFommat;
	}

	public static BigDecimal arredondar(BigDecimal aNumber) {
		return aNumber.setScale(DECIMALS, ROUNDING_MODE);
	}

	public static String formataZeroDecimal(final BigDecimal valor, final int casasDecimais, final int tamanho) {
		NumberFormat df = DecimalFormat.getInstance();
		df.setMinimumFractionDigits(casasDecimais);
		df.setMaximumFractionDigits(casasDecimais);

		String valorFommat = valor == null ? "" : df.format(valor).replaceAll("[^0-9]", "");
		valorFommat = formataNumerico(valorFommat, tamanho);
		return valorFommat;
	}

	public static BigDecimal valorTotalItensECF(ImportacionFiscalVO item) {
		BigDecimal valorTotal = BigDecimal.ZERO;

		BigDecimal valorPedagio = item.getValorPedagio() == null ? BigDecimal.ZERO : item.getValorPedagio();
		BigDecimal valorEmbarque = item.getValorEmbarque() == null ? BigDecimal.ZERO : item.getValorEmbarque();
		BigDecimal valorTarifa = item.getValorTarifa() == null ? BigDecimal.ZERO : item.getValorTarifa();
		BigDecimal valorSeguro = item.getValorSeguro() == null ? BigDecimal.ZERO : item.getValorSeguro();
		if (valorTarifa.equals(BigDecimal.ZERO))
			valorTarifa = BigDecimal.ONE.divide(CEM);

		valorTotal = valorTotal.add(valorTarifa).add(valorPedagio).add(valorEmbarque).add(valorSeguro);

		return valorTotal;
	}

	public static String aberturaDeArquivo(String identificador, String data, String cnpjFilial, String brancos372,
			String sequencial) {

		StringBuilder abertura = new StringBuilder();
		abertura.append(identificador);
		abertura.append(data);
		abertura.append(cnpjFilial);
		abertura.append(brancos372);
		abertura.append(sequencial);

		return abertura.toString();
	}

	public static String headerDocumentoFiscal(String identificador, String data, String cnpjImpressora, String coo,
			String serie, String especie, String codigoCliente, String filialCliente, String condicaoPagamento,
			String valorTotalDocumanto, String valorItens, String aliquota, String imposto, String valorPIS,
			String valorCofins, String valorCSLL, String totalICMSIsento, String totalICMSNaotributado, String origenUf,
			String origen, String destinoUf, String destino, String subSerie, String aidf, String status,
			String motivocancelacion, String valorMulta, String brancos, String claseServicio, String sequencial) {

		StringBuilder header = new StringBuilder();
		header.append(identificador);
		header.append(data);
		header.append(cnpjImpressora);
		header.append(coo);
		header.append(serie);
		header.append(especie);
		header.append(codigoCliente);
		header.append(filialCliente);
		header.append(condicaoPagamento);
		header.append(valorTotalDocumanto);
		header.append(valorItens);
		header.append(aliquota);
		header.append(imposto);
		header.append(valorPIS);
		header.append(valorCofins);
		header.append(valorCSLL);
		header.append(totalICMSIsento);
		header.append(totalICMSNaotributado);
		header.append(origenUf);
		header.append(origen);
		header.append(destinoUf);
		header.append(destino);
		header.append(subSerie == null ? "" : subSerie);
		header.append(aidf == null ? "" : aidf);
		header.append(status);
		header.append(motivocancelacion == null ? "" : motivocancelacion);
		header.append(valorMulta == null ? "" : valorMulta);
		header.append(brancos);
		header.replace(226, 256, claseServicio);

		header.append(sequencial);

		return header.toString();
	}

	public static String itensDocumentoFiscal(String identificador, String numItem, String cfop, String codigoTES,
			String codProduto, String unidade, String quantidade, String valorUnitario, String valorTotal,
			String aliquotaItem, String impostoItem, String valorPIS, String aliquotaPIS, String aliquotaCofins,
			String valorCofins, String aliquotaCSLL, String valorCSLL, String aliquotaISS, String valorISS,
			String totalICMSIsentoItem, String totalICMSNaotributadoItem, String numeroPDV, String numeroSeriePDV,
			String modeloImpressora, String numCaixa, String status, String coo, String serie,
			String brancos, String sequencial) {

		StringBuilder item = new StringBuilder();
		item.append(identificador);
		item.append(numItem);
		item.append(cfop);
		item.append(codigoTES);
		item.append(codProduto);
		item.append(unidade);
		item.append(quantidade);
		item.append(valorUnitario);
		item.append(valorTotal);
		item.append(aliquotaItem);
		item.append(impostoItem);
		item.append(aliquotaPIS);
		item.append(valorPIS);
		item.append(aliquotaCofins);
		item.append(valorCofins);
		item.append(aliquotaCSLL);
		item.append(valorCSLL);
		item.append(aliquotaISS);
		item.append(valorISS);
		item.append(totalICMSIsentoItem);
		item.append(totalICMSNaotributadoItem);
		item.append(numeroPDV == null ? "" : numeroPDV);
		item.append(numeroSeriePDV == null ? "" : numeroSeriePDV);
		item.append(modeloImpressora);
		item.append(numCaixa);
		item.append(status);
		item.append(coo == null ? "" : coo);
		item.append(serie == null ? "" : serie);
		item.append(brancos);
		item.append(sequencial);

		return item.toString();
	}

	public static String fechamentoDeArquivo(String identificador, String qtdeDocGerados, String qtdeItensDocGerados,
			String brancos, String sequencial) {

		StringBuilder fechamento = new StringBuilder();
		fechamento.append(identificador);
		fechamento.append(qtdeDocGerados == null ? "" : qtdeDocGerados);
		fechamento.append(qtdeItensDocGerados == null ? "" : qtdeItensDocGerados);
		fechamento.append(brancos);
		fechamento.append(sequencial);

		return fechamento.toString();
	}

	public static String reducaoZ(String identificador, String dataMovimento, String cnpj, String numRelatorio, String numPDV,
			String numSeriePDV, String numReducaoZ, String gtInicial, String gtFinal, String docFiscalInic,
			String docFiscalFinal, String valorCancel, String valorContabil, String subtributaria, String descontos,
			String isento, String naoTributado, String aliquota, String aliquota2, String aliquota3, String aliquota4,
			String coo, String outrosRecebimentos, String impostoDebitado, String dataReducaoZ, String horaReducaoZ,
			String valorDocFiscal, String cro, String status, String brancos, String sequencial) {

		StringBuilder reducaoZ = new StringBuilder();
		reducaoZ.append(identificador);
		reducaoZ.append(dataMovimento);
		reducaoZ.append(cnpj);
		reducaoZ.append(numRelatorio);
		reducaoZ.append(numPDV);
		reducaoZ.append(numSeriePDV);
		reducaoZ.append(numReducaoZ);
		reducaoZ.append(gtInicial);
		reducaoZ.append(gtFinal);
		reducaoZ.append(docFiscalInic);
		reducaoZ.append(docFiscalFinal);
		reducaoZ.append(valorCancel);
		reducaoZ.append(valorContabil);
		reducaoZ.append(subtributaria);
		reducaoZ.append(descontos);
		reducaoZ.append(isento);
		reducaoZ.append(naoTributado);
		reducaoZ.append(aliquota);
		reducaoZ.append(aliquota2);
		reducaoZ.append(aliquota3);
		reducaoZ.append(aliquota4);
		reducaoZ.append(coo);
		reducaoZ.append(outrosRecebimentos);
		reducaoZ.append(impostoDebitado);
		reducaoZ.append(dataReducaoZ);
		reducaoZ.append(horaReducaoZ);
		reducaoZ.append(valorDocFiscal);
		reducaoZ.append(cro);
		reducaoZ.append(status);
		reducaoZ.append(brancos);
		reducaoZ.append(sequencial);

		return reducaoZ.toString();
	}

}
