package com.rjconsultores.ventaboletos.utilerias.archivointegracion;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import com.rjconsultores.ventaboletos.utilerias.UtiliteriasFiscal;
import com.rjconsultores.ventaboletos.vo.impressaofiscal.AgpImpressoraEcfVO;
import com.rjconsultores.ventaboletos.vo.impressaofiscal.AgpImpressoraReducaoZVO;
import com.rjconsultores.ventaboletos.vo.impressaofiscal.ImportacionFiscalReducaoZVO;
import com.rjconsultores.ventaboletos.vo.impressaofiscal.ImportacionFiscalVO;
import com.rjconsultores.ventaboletos.vo.impressaofiscal.SituacaoTributaria;
import com.rjconsultores.ventaboletos.vo.impressaofiscal.TipoPendencia;

public class ArchivoIntegracionECFReducaoZ {

	private List<AgpImpressoraEcfVO> listAgpEcf;
	private List<AgpImpressoraReducaoZVO> listAgpRedZ;

	private List<ImportacionFiscalVO> listEcfValidos;
	private List<ImportacionFiscalReducaoZVO> listRedZValidos;

	private List<ImportacionFiscalVO> listEcfInvalidos;
	private List<ImportacionFiscalReducaoZVO> listRedZInvalidos;

	public ArchivoIntegracionECFReducaoZ() {
		listAgpEcf = new ArrayList<AgpImpressoraEcfVO>();
		listAgpRedZ = new ArrayList<AgpImpressoraReducaoZVO>();

		listEcfValidos = new ArrayList<ImportacionFiscalVO>();
		listRedZValidos = new ArrayList<ImportacionFiscalReducaoZVO>();

		listEcfInvalidos = new ArrayList<ImportacionFiscalVO>();
		listRedZInvalidos = new ArrayList<ImportacionFiscalReducaoZVO>();
	}

	public void importacionFiscalECFValidaReducaoZ(List<ImportacionFiscalVO> listEcf, List<ImportacionFiscalReducaoZVO> listRedZ) {

		listAgpEcf = agruparEcf(listEcf);
		listAgpRedZ = agruparReducaoZ(listRedZ);

		for (AgpImpressoraReducaoZVO agpRedZ : listAgpRedZ) {

			AgpImpressoraEcfVO agpEcf = buscaRegistroEcf(agpRedZ.getNumserie20(), agpRedZ.getDatamov());
			if (agpEcf == null) {

				for (ImportacionFiscalReducaoZVO reZ : agpRedZ.getItens()) {
					reZ.setInconsistente(true);
					listRedZInvalidos.add(reZ);
				}
				continue;
			}

			BigDecimal valorEcf = BigDecimal.ZERO;
			for (ImportacionFiscalVO ecf : agpEcf.getItens()) {
				BigDecimal valorBoleto = UtiliteriasFiscal.arredondar(UtiliteriasFiscal.valorTotalItensECF(ecf));
				valorEcf = valorEcf.add(valorBoleto);
			}

			String valorFormatado = UtiliteriasFiscal.formataZeroDecimal(valorEcf, 0);
			valorEcf = new BigDecimal(valorFormatado);

			BigDecimal valorRedZ = agpRedZ.getItens().get(0).getVendabrutadiaria();
			for (ImportacionFiscalReducaoZVO reZ : agpRedZ.getItens()) {

				String tipoMovimento = reZ.getAliquota();
				if (tipoMovimento.equals(SituacaoTributaria.CANCELADO.getValue()) ||
						tipoMovimento.equals(SituacaoTributaria.DESCONTO.getValue())) {
					BigDecimal valorTrib = reZ.getImposto();
					valorRedZ = valorRedZ.subtract(valorTrib);
				}
			}

			if (valorRedZ.compareTo(valorEcf) == 0) {
				for (ImportacionFiscalVO ecf : agpEcf.getItens()) {
					listEcfValidos.add(ecf);
				}

				for (ImportacionFiscalReducaoZVO reZ : agpRedZ.getItens()) {
					listRedZValidos.add(reZ);
				}

			} else {

				if (valorRedZ.compareTo(valorEcf) > 0) {

					for (ImportacionFiscalVO ecf : agpEcf.getItens()) {
						listEcfValidos.add(ecf);
					}

					BigDecimal dif = valorRedZ.subtract(valorEcf);
					for (ImportacionFiscalReducaoZVO reZv : agpRedZ.getItens()) {
						BigDecimal vendabrutadiaria = reZv.getVendabrutadiaria().subtract(dif);
						reZv.setVendabrutadiaria(vendabrutadiaria);
						listRedZValidos.add(reZv);
					}

					ImportacionFiscalReducaoZVO reZ = new ImportacionFiscalReducaoZVO(agpRedZ.getItens().get(0));
					reZ.setStatus(TipoPendencia.DIF_RED_Z.toString());
					reZ.setAliquota("01");
					reZ.setImposto(dif);
					reZ.setVendabrutadiaria(dif);
					reZ.setInconsistente(true);

					listRedZInvalidos.add(reZ);

				} else if (valorRedZ.compareTo(valorEcf) < 0) {

					for (ImportacionFiscalVO ecf : agpEcf.getItens()) {
						listEcfValidos.add(ecf);
					}

					BigDecimal dif = valorEcf.subtract(valorRedZ);
					for (ImportacionFiscalReducaoZVO reZv : agpRedZ.getItens()) {
						BigDecimal vendabrutadiaria = reZv.getVendabrutadiaria().add(dif);
						reZv.setVendabrutadiaria(vendabrutadiaria);
						listRedZValidos.add(reZv);
					}

					ImportacionFiscalReducaoZVO reZ = new ImportacionFiscalReducaoZVO(agpRedZ.getItens().get(0));
					reZ.setStatus(TipoPendencia.DIF_ECF.toString());
					reZ.setAliquota("01");
					reZ.setImposto(dif);
					reZ.setVendabrutadiaria(dif);
					reZ.setInconsistente(true);
					listRedZInvalidos.add(reZ);
				}
			}
		}
	}

	private AgpImpressoraEcfVO buscaRegistroEcf(String numserie20, String datamov) {
		try {
			int index = listAgpEcf.indexOf(new AgpImpressoraEcfVO(numserie20, datamov));
			return listAgpEcf.get(index);
		} catch (ArrayIndexOutOfBoundsException e) {
		}
		return null;
	}

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

		List<AgpImpressoraReducaoZVO> agps = new ArrayList<AgpImpressoraReducaoZVO>();

		AgpImpressoraReducaoZVO atual = null;
		for (ImportacionFiscalReducaoZVO redz : list) {
			AgpImpressoraReducaoZVO novo = new AgpImpressoraReducaoZVO(redz.getNumserie20(), redz.getDatamov());

			if (atual == null) {
				atual = novo;
				atual.getItens().add(redz);

			} else if (atual.equals(novo)) {
				atual.getItens().add(redz);

			} else {
				agps.add(atual);
				atual = novo;
				atual.getItens().add(redz);
			}
		}

		if (atual != null)
			agps.add(atual);

		return agps;
	}

	private List<AgpImpressoraEcfVO> agruparEcf(List<ImportacionFiscalVO> list) {

		List<AgpImpressoraEcfVO> agps = new ArrayList<AgpImpressoraEcfVO>();

		AgpImpressoraEcfVO atual = null;
		for (ImportacionFiscalVO ecf : list) {
			AgpImpressoraEcfVO novo = new AgpImpressoraEcfVO(ecf.getNumImpressora(), ecf.getDataEmissao());

			if (atual == null) {
				atual = novo;
				atual.getItens().add(ecf);

			} else if (atual.equals(novo)) {
				atual.getItens().add(ecf);

			} else {
				agps.add(atual);
				atual = novo;
				atual.getItens().add(ecf);
			}
		}

		if (atual != null)
			agps.add(atual);

		return agps;
	}

	public List<AgpImpressoraEcfVO> getListAgpEcf() {
		return listAgpEcf;
	}

	public List<AgpImpressoraReducaoZVO> getListAgpRedZ() {
		return listAgpRedZ;
	}

	public List<ImportacionFiscalVO> getListEcfValidos() {
		return listEcfValidos;
	}

	public List<ImportacionFiscalReducaoZVO> getListRedZValidos() {
		return listRedZValidos;
	}

	public List<ImportacionFiscalVO> getListEcfInvalidos() {
		return listEcfInvalidos;
	}

	public List<ImportacionFiscalReducaoZVO> getListRedZInvalidos() {
		return listRedZInvalidos;
	}

}
