package com.rjconsultores.ventaboletos.relatorios.impl;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.rjconsultores.ventaboletos.relatorios.utilitarios.ArrayDataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.ItemReporteControleEstoqueBoletos;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class RelatorioEstoque extends Relatorio {

	private List<ItemReporteControleEstoqueBoletos> lsDadosRelatorio;
	
	public RelatorioEstoque(Map<String, Object> parametros, Connection conexao) throws Exception {
		super(parametros, conexao);

		this.setCustomDataSource(new ArrayDataSource(this) {

			public void initDados() throws Exception {
				
				Connection conexao = this.relatorio.getConexao();
				Integer empresaId = null;
				String puntoVentaId = null;
				
				Date dtInicio = (Date) parametros.get("DATA_INICIO");
				Date dtFim = (Date) parametros.get("DATA_FIM");
				Integer aidfTipoId = (Integer) parametros.get("AIDFTIPO_ID");
				Integer aidfId = (Integer) parametros.get("AIDF_ID");
								
				if (parametros.get("EMPRESA_ID") != null) {
					empresaId = Integer.valueOf(parametros.get("EMPRESA_ID").toString());
				}
				if (parametros.get("NUMPUNTOVENTA") != null) {
					puntoVentaId = String.valueOf(parametros.get("NUMPUNTOVENTA"));
				}
				String sql = retornarItensConsultaPorPuloFolio(puntoVentaId,empresaId, dtInicio, dtFim, aidfTipoId, aidfId);
				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);
				if(dtInicio != null && dtFim != null) {
					stmt.setString("dataInicio", DateUtil.getStringDate(dtInicio, "dd/MM/yyyy") + " 00:00:00");
					stmt.setString("dataFinal", DateUtil.getStringDate(dtFim, "dd/MM/yyyy") + " 23:59:59");
				}else if(dtInicio != null) {
					stmt.setString("dataInicio", DateUtil.getStringDate(dtInicio, "dd/MM/yyyy") + " 00:00:00");
				}
				if(aidfTipoId != null) {
					stmt.setInt("aidfTipo",aidfTipoId);
				}
				if(aidfId != null) {
					stmt.setInt("aidfId",aidfId);
				}
				
				lsDadosRelatorio = new ArrayList<ItemReporteControleEstoqueBoletos>();
				ResultSet rset = null;
				rset = stmt.executeQuery();
				List<ItemReporteControleEstoqueBoletos> lsEstoquePorSalto = new ArrayList<>();
				
				while (rset.next()) {

					ItemReporteControleEstoqueBoletos item = new ItemReporteControleEstoqueBoletos();
					item.setAidfId(rset.getInt("aidfId") > 0 ? rset.getInt("aidfId") : null);
					item.setNombEmpresa((String) rset.getObject("nombEmpresa"));
					item.setNomeEstado((String) rset.getObject("nomeEstado"));
					item.setDescPuntoVenta((String) rset.getObject("descPuntoVenta"));
					item.setSerie((String) rset.getObject("serie"));
					item.setTipo((String) rset.getObject("tipoAidf"));
					item.setFolioInicial((String) rset.getObject("folioInicial"));
					item.setFolioFinal((String) rset.getString("folioFinal"));
					item.setFolioCaja((BigDecimal) rset.getObject("folioCaja"));
					item.setArticuloId(rset.getInt("articuloId") > 0 ? rset.getInt("articuloId") : null);
					item.setFechorAquisicion((Date) rset.getObject("fechorAquisicion"));
					item.setFecVencimento((Date) rset.getObject("fecVencimento"));
					item.setID((String) rset.getObject("ID"));
					item.setPuntoVentaId(rset.getInt("puntoVentaId") > 0 ? rset.getInt("puntoVentaId") : null);
					lsEstoquePorSalto.add(item);
				}

				this.resultSet = rset;
				
				
				String sqlretornEstoque = sQLretornarEstoque(puntoVentaId, dtInicio, dtFim,empresaId, aidfTipoId, aidfId);
				
				NamedParameterStatement stmt2 = new NamedParameterStatement(conexao, sqlretornEstoque);
	
				if(dtInicio != null && dtFim != null) {
					stmt2.setString("dataInicio", DateUtil.getStringDate(dtInicio, "dd/MM/yyyy") + " 00:00:00");
					stmt2.setString("dataFinal", DateUtil.getStringDate(dtFim, "dd/MM/yyyy") + " 23:59:59");
				}else if(dtInicio != null) {
					stmt2.setString("dataInicio", DateUtil.getStringDate(dtInicio, "dd/MM/yyyy") + " 00:00:00");
				}
				if(aidfTipoId != null) {
					stmt2.setInt("aidfTipo",aidfTipoId);
				}
				if(aidfId != null) {
					stmt2.setInt("aidfId",aidfId);
				}
				
				ResultSet rset2 = null;
				rset2 = stmt2.executeQuery();
				 List<ItemReporteControleEstoqueBoletos> lsEstoque = new ArrayList<>() ;
				while (rset2.next()) {

					ItemReporteControleEstoqueBoletos item = new ItemReporteControleEstoqueBoletos();
					item.setAidfId(rset2.getInt("aidfId") > 0 ? rset2.getInt("aidfId") : null);
					item.setNombEmpresa((String) rset2.getObject("nombEmpresa"));
					item.setDescPuntoVenta((String) rset2.getObject("descPuntoVenta"));
					item.setNomeEstado((String) rset2.getObject("nomeEstado"));
					item.setSerie((String) rset2.getObject("serie"));
					item.setTipo((String) rset2.getObject("tipoAidf"));
					item.setFolioInicial((String) rset2.getObject("folioInicial"));
					item.setFolioFinal((String) rset2.getObject("folioFinal"));
					item.setFolioCaja((BigDecimal) rset2.getObject("folioCaja"));
					item.setArticuloId(rset2.getInt("articuloId") > 0 ? rset2.getInt("articuloId") : null);
					item.setFechorAquisicion((Date) rset2.getObject("fechorAquisicion"));
					item.setFecVencimento((Date) rset2.getObject("fecVencimento"));
					item.setID((String) rset2.getObject("ID"));
					item.setCveUsuario((String) rset2.getObject("cveUsuario"));
					item.setDescArticulo(rset2.getObject("descArticulo") != null ? rset2.getBigDecimal("descArticulo").toString(): null);
					item.setDescEstacion((String) rset2.getObject("descEstacion"));
					item.setFolioAtual((String) rset2.getObject("folioAtual"));
					lsEstoque.add(item);
				}
				
				
				
				Map<String, String> map = new HashMap<String, String>();
				List<ItemReporteControleEstoqueBoletos> lsTemp = new ArrayList<>();
				List<ItemReporteControleEstoqueBoletos> lsTempRetorno  =  new ArrayList<>();
				List<ItemReporteControleEstoqueBoletos> lsTempRetornoAux = new ArrayList<>();
				lsEstoquePorSalto = removeFoliosDuplicados(lsEstoquePorSalto);
				lsEstoquePorSalto = validarFolioPreImpressoPuntoventa(lsEstoquePorSalto, puntoVentaId);
				validarFormularioSeUsado(lsEstoquePorSalto,lsEstoque);
				lsTempRetornoAux = criarRangesBilhetes(puntoVentaId, lsEstoquePorSalto, lsEstoque, map, lsTemp,	lsTempRetorno, lsTempRetornoAux);

				
				List<ItemReporteControleEstoqueBoletos> lsBlocoJaTodoUtilizado = tratarBlocoJaTodoUtilizado(lsTempRetornoAux);
				
				Collections.sort(lsBlocoJaTodoUtilizado, new Comparator<ItemReporteControleEstoqueBoletos>() {
					@Override
					public int compare(ItemReporteControleEstoqueBoletos rel1, ItemReporteControleEstoqueBoletos rel2) {
						Integer aidf1 = ((ItemReporteControleEstoqueBoletos) rel1).getAidfId();
						Integer aidf2 = ((ItemReporteControleEstoqueBoletos) rel2).getAidfId();
						int sComp = aidf1.compareTo(aidf2);

						if (sComp != 0) {
							return sComp;
						}

						String folioInicial1 = ((ItemReporteControleEstoqueBoletos) rel1).getFolioInicial();
						String folioInicial2 = ((ItemReporteControleEstoqueBoletos) rel2).getFolioInicial();
						return Integer.valueOf(folioInicial1).compareTo(Integer.valueOf(folioInicial2));
					}
				});
				
				lsDadosRelatorio.addAll(lsBlocoJaTodoUtilizado);
				
				setLsDadosRelatorio(lsDadosRelatorio);
			}

			private List<ItemReporteControleEstoqueBoletos> criarRangesBilhetes(String puntoVentaId,
					List<ItemReporteControleEstoqueBoletos> lsEstoquePorSalto,
					List<ItemReporteControleEstoqueBoletos> lsEstoque, Map<String, String> map,
					List<ItemReporteControleEstoqueBoletos> lsTemp,
					List<ItemReporteControleEstoqueBoletos> lsTempRetorno,
					List<ItemReporteControleEstoqueBoletos> lsTempRetornoAux) {
				for (ItemReporteControleEstoqueBoletos i : lsEstoquePorSalto) {
					if(map.get(i.getID()) == null) {
						for (ItemReporteControleEstoqueBoletos item : lsEstoquePorSalto) {
							if(i.getID().equals(item.getID())) {
								lsTemp.add(item);
							}
						}
						map.put(i.getID(), i.getID());
						lsTempRetorno.addAll(gerarRangesDeFolios(recuperarOsFaltantes(lsTemp), lsTemp));
						lsTemp = new ArrayList<ItemReporteControleEstoqueBoletos>();
					}					
				}
				lsTempRetornoAux.addAll(lsTempRetorno);
				
				for (ItemReporteControleEstoqueBoletos itemEstoque : lsEstoque) {
					if(!lsTempRetornoAux.contains(itemEstoque)) {
						if(Boolean.FALSE.equals(itemEstoque.getIsConsumido()) || itemEstoque.getIsConsumido() == null) {
							itemEstoque.setQuantidade(calcularQuantidade(itemEstoque.getFolioInicial(), itemEstoque.getFolioFinal()));
							lsTempRetornoAux.add(itemEstoque);
						}
		
					}
				}
				return lsTempRetornoAux;
			}
		});
	}

	@Override
	protected void processaParametros() throws Exception {
	}
	
	public void setLsDadosRelatorio(List<ItemReporteControleEstoqueBoletos> lsDadosRelatorio) {
		this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio));
		this.lsDadosRelatorio = lsDadosRelatorio;
	}
	
	public List<ItemReporteControleEstoqueBoletos> getLsDadosRelatorio() {
		return lsDadosRelatorio;
	}	
	
	private String retornarItensConsultaPorPuloFolio(String puntoVentaId, Integer empresaId, Date dataInicio, Date dataFim, Integer aidfTipo, Integer aidfId) {
		
		StringBuilder sb = new StringBuilder();
	
		sb.append(" select DISTINCT TB.aidfId as aidfId,                                                                                            ");
		sb.append("       TB.serie as serie,                                                                                                        ");
		sb.append("        TB.folioCaja as folioCaja,                                                                                                ");
		sb.append("        TB.folioInicial as folioInicial,                                                                                          ");
		sb.append("        TB.folioFinal as folioFinal,                                                                                              ");
		sb.append("        TB.descPuntoVenta as descPuntoVenta,                                                                                     ");
		sb.append("        TB.articuloId as articuloId,                                                                                             ");
		sb.append("        TB.nombEmpresa as nombEmpresa,                                                                                            ");
		sb.append("        TB.empresaId as empresaId,                                                                                                ");
		sb.append("      TB.marcaId as marcaId,                                                                                                       ");
		sb.append("      TB.fechorAquisicion as fechorAquisicion,                                                                                    ");
		sb.append("      TB.tipo as tipo,                                                                                                            ");
		sb.append("      TB.fecVencimento as fecVencimento,                                                                                            ");
		sb.append("      TB.ID  as ID , TB.nomeEstado  as nomeEstado,                                                                                  ");
		sb.append("      TB.tipoAidf as tipoAidf,  TB.puntoVentaId as puntoVentaId                                                                                                       ");
		sb.append("        from (SELECT DAB.AIDF_ID AS aidfId,  est.NOMBESTADO as nomeEstado,                                                          ");
		sb.append("        dab.NUMSERIEPREIMPRESA AS serie,                                                                                           ");
		sb.append("        TO_NUMBER( TRIM(LEADING '0' FROM Cj.NUMFOLIOPREIMPRESO)) AS folioCaja,                                                                             ");
		sb.append("        DAB.NUMFOLIOINICIAL AS folioInicial,                                                                                       ");
		sb.append("        DAB.NUMFOLIOFINAL AS folioFinal,                                                                                           ");
		sb.append("        PV.NOMBPUNTOVENTA AS descPuntoVenta,                                                                                       ");
		sb.append("        AB.ARTICULO_ID AS articuloId,                                                                                              ");
		sb.append("        EM.NOMBEMPRESA AS nombEmpresa,                                                                                             ");
		sb.append("        EM.EMPRESA_ID AS empresaId,                                                                                                ");
		sb.append("        M.MARCA_ID AS marcaId,                                                                                                     ");
		sb.append("        DAB.AIDF_ID || DAB.NUMSERIEPREIMPRESA || DAB.NUMFOLIOINICIAL || DAB.NUMFOLIOFINAL || EM.EMPRESA_ID AS ID,                  ");
		sb.append("        CASE                                                                                                                       ");
		sb.append("            WHEN dab.STATUSOPERACION = 4 THEN CONCAT(a.descarticulo, ' (DistribuiÃ§Ã£o Estoque)')                                  ");
		sb.append("            ELSE a.descarticulo                                                                                                    ");
		sb.append("        END AS tipo ,                                                                                                              ");
		sb.append("         to_date(to_char(AI.fecadquisicion, 'dd/MM/yyyy'), 'dd/MM/yyyy') AS fechorAquisicion,                                      ");
		sb.append("        to_date(to_char(ai.fecvencimiento, 'dd/MM/yyyy'), 'dd/MM/yyyy') AS fecVencimento,                                           ");
		sb.append("        AIT.DESCTIPO tipoAidf , PV.PUNTOVENTA_ID AS puntoVentaId                                                                                                    ");
		sb.append(" FROM CAJA CJ,                                                                                                                     ");
		sb.append("      ARTICULO A,                                                                                                                  ");
		sb.append("      EMPRESA EM,                                                                                                                  ");
		sb.append("      MARCA M,                                                                                                                     ");
		sb.append("      USUARIO U,                                                                                                                   ");
		sb.append("      AIDF AI,                                                                                                                     ");
		sb.append("      AIDF_TIPO AIT,                                                                                                               ");
		sb.append("     ESTADO est,");
		sb.append("      PUNTO_VENTA PV,                                                                                                              ");
		sb.append("      ABASTO_BOLETO AB                                                                                                             ");
		sb.append(" 																																  ");
		sb.append(" LEFT JOIN DET_ABASTO_BOLETO DAB ON (AB.ABASTOBOLETO_ID = DAB.ABASTOBOLETO_ID)                                                     ");
		sb.append(" WHERE  TO_NUMBER( TRIM(LEADING '0' FROM Cj.NUMFOLIOPREIMPRESO)) BETWEEN TO_NUMBER(DAB.NUMFOLIOINICIAL) AND TO_NUMBER(DAB.NUMFOLIOFINAL)                    ");
//		sb.append("   AND CJ.PUNTOVENTA_ID = AB.PUNTOVENTA_ID                                                                                         ");
		sb.append("   AND DAB.ACTIVO = 1                                                                                                              ");
		sb.append("   AND (cj.NUMSERIEPREIMPRESA = dab.NUMSERIEPREIMPRESA                                                                             ");
		sb.append("        OR (cj.NUMSERIEPREIMPRESA IS NULL                                                                                          ");
		sb.append("            AND dab.NUMSERIEPREIMPRESA IS NULL))                                                                                   ");
//		if (puntoVentaId != null) {
//			sb.append(" AND (cj.PUNTOVENTA_ID in("+puntoVentaId+ ") or  AB.PUNTOVENTA_ID in("+puntoVentaId+")) 										  ");
//		}
		if(empresaId != null) {
			sb.append(" AND Em.empresa_ID = ")
					   .append(empresaId);
		}
		if(dataInicio!= null && dataFim != null) {
			sb.append(" AND AI.fecadquisicion BETWEEN TO_DATE(:dataInicio,'dd/mm/yyyy hh24:mi:ss') AND TO_DATE(:dataFinal,'dd/mm/yyyy hh24:mi:ss') ");
		}else if(dataInicio!= null) {
			sb.append(" AND AI.fecadquisicion >= TO_DATE(:dataInicio,'dd/mm/yyyy hh24:mi:ss') ");
		}
	sb.append("   AND DAB.NUMFOLIOFINAL < 2147483647                                                                                                 ");
		sb.append("   AND DAB.STATUSOPERACION IN(0,                                                                                                   ");
		sb.append("                              1,                                                                                                   ");
		sb.append("                              4)                                                                                                   ");
		sb.append("   AND A.ARTICULO_ID = AB.ARTICULO_ID                                                                                              ");
		sb.append("   AND EM.EMPRESA_ID = AB.EMPRESA_ID                                                                                               ");
		sb.append("   AND M.EMPRESA_ID = EM.EMPRESA_ID                                                                                                ");
		sb.append("   AND M.ACTIVO = 1                                                                                                               ");
		sb.append("   AND CJ.USUARIO_ID = U.USUARIO_ID         and cj.activo =1                                                                                          ");
		sb.append("   AND (CJ.INDREIMPRESION = 0                                                                                                      ");
		sb.append("        OR (CJ.INDREIMPRESION = 1                                                                                                  ");
		sb.append("            AND CJ.INDSTATUSBOLETO = 'E'))                                                                                         ");
		sb.append("   AND CJ.PUNTOVENTA_ID = PV.PUNTOVENTA_ID                                                                                         ");
		sb.append("   AND DAB.ACTIVO = 1                                                                                                              ");
		sb.append("   AND AB.activo =1  AND AI.activo = 1  and est.estado_id = ai.ESTADO_ID                                                            ");
		sb.append(aidfTipo != null ?  " AND (AI.AIDFTIPO_ID =:aidfTipo  AND AIT.AIDFTIPO_ID = AI.AIDFTIPO_ID) " : "  AND AIT.AIDFTIPO_ID = AI.AIDFTIPO_ID  ");
		sb.append(aidfId != null ?  " AND (AI.AIDF_ID =:aidfId  AND DAB.AIDF_ID = AI.AIDF_ID) " : "  AND DAB.AIDF_ID = AI.AIDF_ID  ");
		sb.append(" GROUP BY DAB.AIDF_ID,                                                                                                             ");
		sb.append("          DAB.NUMSERIEPREIMPRESA,                                                                                                  ");
		sb.append("          CJ.NUMFOLIOPREIMPRESO,                                                                                                   ");
		sb.append("          DAB.NUMFOLIOINICIAL,                                                                                                     ");
		sb.append("          DAB.NUMFOLIOFINAL,                                                                                                       ");
		sb.append("          PV.NOMBPUNTOVENTA,                                                                                                       ");
		sb.append("          AB.ARTICULO_ID,                                                                                                          ");
		sb.append("          EM.NOMBEMPRESA,                                                                                                          ");
		sb.append("          U.USUARIO_ID,                                                                                                            ");
		sb.append("          EM.EMPRESA_ID,                                                                                                           ");
		sb.append("          DAB.AIDF_ID,                                                                                                             ");
		sb.append("          M.MARCA_ID,                                                                                                              ");
		sb.append("          A.descarticulo,                                                                                                          ");
		sb.append("          dab.STATUSOPERACION ,                                                                                                    ");
		sb.append("          to_char(AI.fecadquisicion, 'dd/MM/yyyy'),                                                                                ");
		sb.append("          to_char(ai.fecvencimiento, 'dd/MM/yyyy'),  est.NOMBESTADO , AIT.DESCTIPO , PV.PUNTOVENTA_ID                                                 ");
		sb.append(" 																																  ");
		sb.append(" UNION ALL                                                                                                                         ");
		sb.append("         SELECT DAB.AIDF_ID AS aidfId,   est.NOMBESTADO as nomeEstado ,                                                            ");
		sb.append("         dab.NUMSERIEPREIMPRESA AS serie,                                                                                          ");
		sb.append("       TO_NUMBER( TRIM(LEADING '0' FROM Cj.NUMFOLIOPREIMPRESO)) AS folioCaja,                                                                             ");
		sb.append("        DAB.NUMFOLIOINICIAL AS folioInicial,                                                                                       ");
		sb.append("        DAB.NUMFOLIOFINAL AS folioFinal,                                                                                           ");
		sb.append("        PV.NOMBPUNTOVENTA AS descPuntoVenta,                                                                                       ");
		sb.append("        AB.ARTICULO_ID AS articuloId,                                                                                              ");
		sb.append("        EM.NOMBEMPRESA AS nombEmpresa,                                                                                             ");
		sb.append("        EM.EMPRESA_ID AS empresaId,                                                                                                ");
		sb.append("        M.MARCA_ID AS marcaId,                                                                                                     ");
		sb.append("        DAB.AIDF_ID || DAB.NUMSERIEPREIMPRESA || EM.EMPRESA_ID AS ID,                  ");
		sb.append("        CASE                                                                                                                       ");
		sb.append("            WHEN dab.STATUSOPERACION = 4 THEN CONCAT(a.descarticulo, ' (DistribuiÃ§Ã£o Estoque)')                                  ");
		sb.append("            ELSE a.descarticulo                                                                                                    ");
		sb.append("        END AS tipo,                                                                                                               ");
		sb.append("            to_date(to_char(AI.fecadquisicion, 'dd/MM/yyyy'), 'dd/MM/yyyy') AS fechorAquisicion,                                   ");
		sb.append("        to_date(to_char(ai.fecvencimiento, 'dd/MM/yyyy'), 'dd/MM/yyyy') AS fecVencimento,                                           ");
		sb.append("        AIT.DESCTIPO tipoAidf , PV.PUNTOVENTA_ID AS puntoVentaId                                                                                                     ");
		sb.append("        FROM CAJA_DIVERSOS CJ,                                                                                                     ");
		sb.append("      ARTICULO A,                                                                                                                  ");
		sb.append("      EMPRESA EM,                                                                                                                  ");
		sb.append("      MARCA M,                                                                                                                     ");
		sb.append("     AIDF AI,                                                                                                                      ");
		sb.append("     AIDF_TIPO AIT,                                                                                                                      ");
		sb.append("     ESTADO est,");
		sb.append("      USUARIO U,                                                                                                                   ");
		sb.append("      PUNTO_VENTA PV,                                                                                                              ");
		sb.append("      ABASTO_BOLETO AB                                                                                                             ");
		sb.append(" LEFT JOIN DET_ABASTO_BOLETO DAB ON (AB.ABASTOBOLETO_ID = DAB.ABASTOBOLETO_ID)                                                     ");
		sb.append(" WHERE TO_NUMBER( TRIM(LEADING '0' FROM Cj.NUMFOLIOPREIMPRESO)) BETWEEN TO_NUMBER(DAB.NUMFOLIOINICIAL) AND TO_NUMBER(DAB.NUMFOLIOFINAL)                    ");
//		sb.append(" AND CJ.PUNTOVENTA_ID = AB.PUNTOVENTA_ID                                                                                           ");
		sb.append("   AND (cj.NUMSERIEPREIMPRESA = dab.NUMSERIEPREIMPRESA                                                                             ");
		sb.append("        OR (cj.NUMSERIEPREIMPRESA IS NULL                                                                                          ");
		sb.append("            AND dab.NUMSERIEPREIMPRESA IS NULL))                                                                                   ");
//		if (puntoVentaId != null) {
//			sb.append(" AND (cj.PUNTOVENTA_ID in("+puntoVentaId+ ") or  AB.PUNTOVENTA_ID in("+puntoVentaId+")) ");
//		}
		if(empresaId != null) {
			sb.append(" AND Em.empresa_ID = ")
					   .append(empresaId);
		}
		if(dataInicio!= null && dataFim != null) {
			sb.append(" AND AI.fecadquisicion BETWEEN TO_DATE(:dataInicio,'dd/mm/yyyy hh24:mi:ss') AND TO_DATE(:dataFinal,'dd/mm/yyyy hh24:mi:ss') ");
		}else if(dataInicio!= null) {
			sb.append(" AND AI.fecadquisicion >= TO_DATE(:dataInicio,'dd/mm/yyyy hh24:mi:ss') ");
		}
		sb.append("   AND DAB.NUMFOLIOFINAL < 2147483647                                                                                              ");
		sb.append("   AND DAB.STATUSOPERACION IN(0,                                                                                                   ");
		sb.append("                              1,                                                                                                   ");
		sb.append("                              4)                                                                                                   ");
		sb.append("   AND A.ARTICULO_ID = AB.ARTICULO_ID                                                                                              ");
		sb.append("   AND EM.EMPRESA_ID = AB.EMPRESA_ID                                                                                               ");
		sb.append("   AND M.EMPRESA_ID = EM.EMPRESA_ID                                                                                                ");
		sb.append("   AND M.ACTIVO = 1                                                                                                                ");
		sb.append("   AND CJ.USUARIO_ID = U.USUARIO_ID           and cj.activo =1                                                                                     ");
		sb.append("   AND CJ.PUNTOVENTA_ID = PV.PUNTOVENTA_ID                                                                                         ");
		sb.append("   AND DAB.ACTIVO = 1                                                                                                              ");
		sb.append("   AND AB.activo =1  AND AI.activo = 1  and  est.estado_id = ai.ESTADO_ID                                                          ");
		sb.append(aidfTipo != null ?  " AND (AI.AIDFTIPO_ID =:aidfTipo  AND AIT.AIDFTIPO_ID = AI.AIDFTIPO_ID) " : "  AND AIT.AIDFTIPO_ID = AI.AIDFTIPO_ID  ");
		sb.append(aidfId != null ?  " AND (AI.AIDF_ID =:aidfId  AND DAB.AIDF_ID = AI.AIDF_ID) " : "  AND DAB.AIDF_ID = AI.AIDF_ID  ");
		sb.append("   GROUP BY DAB.AIDF_ID,                                                                                                           ");
		sb.append("          DAB.NUMSERIEPREIMPRESA,                                                                                                  ");
		sb.append("          CJ.NUMFOLIOPREIMPRESO,                                                                                                   ");
		sb.append("          DAB.NUMFOLIOINICIAL,                                                                                                     ");
		sb.append("          DAB.NUMFOLIOFINAL,                                                                                                       ");
		sb.append("          PV.NOMBPUNTOVENTA,                                                                                                       ");
		sb.append("          AB.ARTICULO_ID,                                                                                                          ");
		sb.append("          EM.NOMBEMPRESA,                                                                                                          ");
		sb.append("          U.USUARIO_ID,                                                                                                            ");
		sb.append("          EM.EMPRESA_ID,                                                                                                           ");
		sb.append("          DAB.AIDF_ID,                                                                                                             ");
		sb.append("          M.MARCA_ID,                                                                                                              ");
		sb.append("          A.descarticulo,                                                                                                          ");
		sb.append("          dab.STATUSOPERACION,                                                                                                     ");
		sb.append("            to_char(AI.fecadquisicion, 'dd/MM/yyyy'),                                                                              ");
		sb.append("          to_char(ai.fecvencimiento, 'dd/MM/yyyy') ,  est.NOMBESTADO , AIT.DESCTIPO, PV.PUNTOVENTA_ID  ) TB                                           ");                 
		sb.append("       ORDER BY  TB.aidfId,                                                                                                        ");
		sb.append("          TB.serie,                                                                                                                ");
		sb.append("          TB.folioCaja                                                                                                             ");
		System.out.println(sb);
		
		return sb.toString();
		
	}
	
	private String sQLretornarEstoque(String puntoVentaId, Date dataInicio, Date dataFim, Integer empresaId, Integer aidfTipo, Integer aidfId) {
		
		StringBuilder queryString = new StringBuilder("SELECT DISTINCT to_date(to_char(ai.fecvencimiento, 'dd/MM/yyyy'), 'dd/MM/yyyy')  as fecVencimento,  to_date(to_char(AI.fecadquisicion, 'dd/MM/yyyy'), 'dd/MM/yyyy') as fechorAquisicion, ")
				.append("dab.NUMSERIEPREIMPRESA as serie, ")
				.append("dab.NUMFOLIOINICIAL as folioInicial, ")
				.append("dab.NUMFOLIOFINAL as folioFinal, ")
				.append("pv.NOMBPUNTOVENTA as descPuntoVenta, ")
				.append("to_number(dab.NUMFOLIOINICIAl) as ultimoFolioCaja, ")
			    .append("   CASE                                                                                                        ")
		        .append("  WHEN dab.STATUSOPERACION = 1 THEN fp.FOLIOPREIMPRESO                                                      ")
		        .append("   ELSE COALESCE(                                                                                           ")
		        .append("                                                                                                            ")
		         .append("                (SELECT TO_CHAR(MAX(c.numfoliopreimpreso)+1)                                                  ")
		         .append("                 FROM caja c                                                                                ")
		        .append("                 WHERE (c.numseriepreimpresa = dab.numseriepreimpresa                                       ")
		         .append("                        OR (c.numseriepreimpresa IS NULL                                                    ")
		         .append("                            AND dab.numseriepreimpresa IS NULL))                                            ")
		        .append("                   AND to_number(c.numfoliopreimpreso) BETWEEN dab.numfolioinicial AND dab.numfoliofinal    ")
		        .append("                   AND (c.indreimpresion = 0                                                                ")
		        .append("                        OR (c.indreimpresion = 1                                                            ")
		        .append("                            AND c.indstatusboleto = 'E'))                                                   ")
		        .append("                   AND c.marca_id = m.marca_id), (SELECT to_char(MAX(cd.numfoliopreimpreso)+1)                ")
		        .append("                 FROM caja_diversos cd                                                                      ")
		        .append("                 WHERE cd.numseriepreimpresa = dab.numseriepreimpresa  AND to_number(cd.numfoliopreimpreso) BETWEEN dab.numfolioinicial AND dab.numfoliofinal ) , dab.NUMFOLIOINICIAL)              ")
				.append("END as folioAtual, ")
				.append("ab.ARTICULO_ID as articuloId, ")
				.append("a.ARTICULO_ID as descArticulo, ")
				.append("CASE WHEN dab.STATUSOPERACION = 4 THEN CONCAT(a.descarticulo,' (DistribuiÃ§Ã£o Estoque)') ELSE a.descarticulo END as tipo, ")
				.append("em.nombEmpresa as \"nombEmpresa\", ")
				.append("em.EMPRESA_ID as \"empresaId\", ")
				.append("CASE WHEN dab.STATUSOPERACION = 1 THEN to_number(fp.FOLIOPREIMPRESO) ELSE NULL END as folioCaja, ")
				.append("dab.AIDF_ID as aidfId, ")
				.append("m.MARCA_ID as marcaId, ")
				.append("ai.SUBSERIE as subSerie, ")
				.append("us.CVEUSUARIO as cveUsuario, ") 
				.append(" DAB.AIDF_ID || DAB.NUMSERIEPREIMPRESA ||  EM.EMPRESA_ID AS ID,  " )
				.append("est.NOMBESTADO as nomeEstado, ")
				.append("coalesce(es.descestacion, 'Todas') AS descEstacion, ")
				.append("ait.DESCTIPO as tipoAidf ")
				.append("FROM DET_ABASTO_BOLETO dab ")
				.append("INNER JOIN ABASTO_BOLETO ab ON dab.ABASTOBOLETO_ID = ab.ABASTOBOLETO_ID ")
				.append("LEFT JOIN USUARIO us ON ab.USUARIOESTOQUE_ID = us.USUARIO_ID ")
				.append("INNER JOIN PUNTO_VENTA pv ON  ab.PUNTOVENTA_ID = pv.PUNTOVENTA_ID ")
				.append("LEFT JOIN FOLIO_PREIMPRESO fp ON fp.EMPRESA_ID = ab.EMPRESA_ID  ")
				.append("	AND (fp.NUMESERIE = dab.NUMSERIEPREIMPRESA OR (fp.NUMESERIE IS NULL AND dab.NUMSERIEPREIMPRESA IS NULL)) ")
				.append("	AND to_number(fp.FOLIOPREIMPRESO)   BETWEEN to_number(dab.NUMFOLIOINICIAL) AND to_number(dab.NUMFOLIOFINAL)  ")
				.append("	AND (fp.ACTIVO = 1) ")
				.append("LEFT  JOIN ARTICULO a ON a.ARTICULO_ID = ab.ARTICULO_ID ")
				.append("LEFT  JOIN EMPRESA em ON em.EMPRESA_ID = ab.EMPRESA_ID ")
				.append("LEFT  JOIN MARCA m ON m.EMPRESA_ID = em.EMPRESA_ID AND m.ACTIVO = 1 ")
				.append("LEFT  JOIN AIDF ai ON dab.AIDF_ID = ai.AIDF_ID ")
				.append("LEFT  JOIN aidf_tipo ait ON ait.AIDFTIPO_ID= ai.AIDFTIPO_ID ")
				.append("LEFT  JOIN ESTADO est ON est.ESTADO_ID = ai.ESTADO_ID ")
				.append("LEFT JOIN ESTACION ES ON es.ESTACION_ID = ab.ESTACION_ID  ")
				.append("WHERE dab.STATUSOPERACION IN(0,1,4) ")
				.append("AND dab.ACTIVO = 1 ")
				.append(" and dab.NUMFOLIOFINAL < 2147483647 ")
				.append("  AND DAB.AIDF_ID = AI.AIDF_ID and ai.activo = 1   ")
				.append(aidfTipo != null ?  " AND AI.AIDFTIPO_ID = :aidfTipo " : " ")
				.append(aidfId != null ?  " AND AI.AIDF_ID = :aidfId " : " ");


		
		if (puntoVentaId != null) {
			queryString.append(" AND pv.PUNTOVENTA_ID in("+puntoVentaId+ ")");
		}
		
		if (empresaId != null) {
			queryString.append(" AND em.EMPRESA_ID = ")
					   .append(empresaId);
		}
		if(dataInicio!= null && dataFim != null) {
			queryString.append(" AND fecadquisicion BETWEEN TO_DATE(:dataInicio,'dd/mm/yyyy hh24:mi:ss') AND TO_DATE(:dataFinal,'dd/mm/yyyy hh24:mi:ss') ");
		}else if(dataInicio!= null) {
			queryString.append(" AND fecadquisicion >= TO_DATE(:dataInicio,'dd/mm/yyyy hh24:mi:ss') ");
		}
		queryString.append(" ORDER BY 5,11,1,7");

		return queryString.toString();
		
	}
		
	 private List<ItemReporteControleEstoqueBoletos> gerarRangesDeFolios(int[] a, List<ItemReporteControleEstoqueBoletos> lsTemp){
		 
	        int length = 1;
	        List<ItemReporteControleEstoqueBoletos> list   = new ArrayList<ItemReporteControleEstoqueBoletos>();
	        ItemReporteControleEstoqueBoletos ItemReporteStockBoletos=  null;
	        
	        if (a.length == 0) {
	            return list;
	        }

	        for (int i = 1; i <= a.length; i++) {
	           
	        	if (i == a.length || a[i] - a[i - 1] != 1) {
	            	
	            	ItemReporteStockBoletos = new ItemReporteControleEstoqueBoletos();
	        		ItemReporteStockBoletos.setEstacionId(lsTemp.get(0).getEstacionId());
	        		ItemReporteStockBoletos.setDescEstacion((lsTemp.get(0).getDescEstacion()));
	        		ItemReporteStockBoletos.setDescPuntoVenta((lsTemp.get(0).getDescPuntoVenta()));
	        		ItemReporteStockBoletos.setAidfId(lsTemp.get(0).getAidfId());
	        		ItemReporteStockBoletos.setNombEmpresa(lsTemp.get(0).getNombEmpresa());
	        		ItemReporteStockBoletos.setNombreUsuario(lsTemp.get(0).getNombreUsuario());
	        		ItemReporteStockBoletos.setCveUsuario(lsTemp.get(0).getCveUsuario());
	        		ItemReporteStockBoletos.setTipo(lsTemp.get(0).getTipo());
	        		ItemReporteStockBoletos.setID(lsTemp.get(0).getID());
	        		ItemReporteStockBoletos.setFechorAquisicion(lsTemp.get(0).getFechorAquisicion());
	        		ItemReporteStockBoletos.setFecVencimento(lsTemp.get(0).getFecVencimento());
	        		ItemReporteStockBoletos.setSerie(lsTemp.get(0).getSerie());
	        		ItemReporteStockBoletos.setNomeEstado(lsTemp.get(0).getNomeEstado());
	        		ItemReporteStockBoletos.setDescEstacion("Todas");
	        		ItemReporteStockBoletos.setPuntoVentaId(lsTemp.get(0).getPuntoVentaId());
	            	
	                if (length == 1) {
	                	if(a[i - length] != 0) {
	                			                		
	                		ItemReporteStockBoletos.setFolioInicial(String.valueOf(a[i - length]));
	                		ItemReporteStockBoletos.setFolioAtual(String.valueOf(a[i - length]));
	                		ItemReporteStockBoletos.setFolioFinal(String.valueOf(a[i - length]));  
	                		ItemReporteStockBoletos.setQuantidade(calcularQuantidade(ItemReporteStockBoletos.getFolioInicial(), ItemReporteStockBoletos.getFolioFinal()));
	                		list.add(ItemReporteStockBoletos);
	                	}                  
	                }
	                else {

	            		ItemReporteStockBoletos.setFolioInicial(String.valueOf(a[i - length]));
	            		ItemReporteStockBoletos.setFolioAtual(String.valueOf(a[i - length]));
	            		ItemReporteStockBoletos.setFolioFinal(String.valueOf(a[i - 1]));   
                		ItemReporteStockBoletos.setQuantidade(calcularQuantidade(ItemReporteStockBoletos.getFolioInicial(), ItemReporteStockBoletos.getFolioFinal()));
	            		list.add(ItemReporteStockBoletos);	            		
	                }
	                length = 1;
	            }
	            else {
	                length++;
	            }
	        }
	 
	        return list;
	    }
	 
	 private Integer calcularQuantidade(String folioInicial, String folioFinal) {
		 
		 Integer folioInicialInt = Integer.valueOf(folioInicial);
		 Integer folioFinalInt = Integer.valueOf(folioFinal);
		 return folioInicialInt == folioFinalInt ? 1 :  (folioFinalInt - folioInicialInt)+1;
		 
	 }
	 
    private int[] recuperarOsFaltantes(List<ItemReporteControleEstoqueBoletos> listEstoque) {

    	int arrayTemp[] = new int[listEstoque.size()];
    	int array[] = new int[listEstoque.size()];
    	int i = 0;
    	for (ItemReporteControleEstoqueBoletos item : listEstoque) {
    		arrayTemp[i] = item.getFolioCaja().intValue();
    		i++;
		}
    	array = recuperarFaltantes(arrayTemp,  Integer.parseInt(listEstoque.get(0).getFolioCaja().toString()),  Integer.valueOf(listEstoque.get(listEstoque.size()-1).getFolioFinal()));
		return array;
	}
    
	private int[] recuperarFaltantes(int arr[], int menor, int maior) {

		int[] array = new int[maior];
		int j = 0;
		if (maior - menor + 1 > 0) {
			// System.out.println();
			boolean[] range = new boolean[maior - menor + 1];

			for (int i = 0; i < arr.length; i++) {
				if (menor <= arr[i] && arr[i] <= maior)
					range[arr[i] - menor] = true;
			}
			for (int x = 0; x <= maior - menor; x++) {
				if (range[x] == false) {
					// System.out.println((menor + x) + " ");
					array[j] = (menor + x);
					j++;
				}
			}
		}
		return array;
	}

	private List<ItemReporteControleEstoqueBoletos> tratarBlocoJaTodoUtilizado(List<ItemReporteControleEstoqueBoletos> lsTempRetornoAux) {
		List<ItemReporteControleEstoqueBoletos> lsBlocoJaTodoUtilizado = new ArrayList<ItemReporteControleEstoqueBoletos>();
		for (ItemReporteControleEstoqueBoletos itemReporteStockBoletos : lsTempRetornoAux) {
			if(itemReporteStockBoletos.getFolioAtual() != null) {
				if(Integer.valueOf(itemReporteStockBoletos.getFolioAtual()) <= Integer.valueOf(itemReporteStockBoletos.getFolioFinal())) {
					lsBlocoJaTodoUtilizado.add(itemReporteStockBoletos);
				}	
			}
		}
		return lsBlocoJaTodoUtilizado;
	}

	private List<ItemReporteControleEstoqueBoletos> removeFoliosDuplicados(List<ItemReporteControleEstoqueBoletos> lsTemp) {
		
		  
		Map<Integer,ItemReporteControleEstoqueBoletos> map = new HashMap<>();
		for (ItemReporteControleEstoqueBoletos itemReporteControleEstoqueBoletos : lsTemp) {
			map.put(itemReporteControleEstoqueBoletos.getFolioCaja().intValue(), itemReporteControleEstoqueBoletos);
		}
		
		List<ItemReporteControleEstoqueBoletos> list = new ArrayList<ItemReporteControleEstoqueBoletos>();
		for (Map.Entry<Integer, ItemReporteControleEstoqueBoletos> entry : map.entrySet())
		{
			list.add(entry.getValue());    
		}
		return list;
	}
	private List<ItemReporteControleEstoqueBoletos>  validarFolioPreImpressoPuntoventa(List<ItemReporteControleEstoqueBoletos> lsEstoquePorSalto, String puntoVentaId) {
		
		List<ItemReporteControleEstoqueBoletos> lsEstoquePorSaltoaux = new ArrayList<>();
		String[] puntoVentaIds = null;
		if (puntoVentaId == null) {
			return lsEstoquePorSalto;
		}
		if (puntoVentaId != null) {
			 puntoVentaIds = puntoVentaId.split(",");
			for (ItemReporteControleEstoqueBoletos itemReporteControleEstoqueBoletos : lsEstoquePorSalto) {
				for (String id : puntoVentaIds) {				
					if(itemReporteControleEstoqueBoletos.getPuntoVentaId().equals(Integer.valueOf(id))) {
						lsEstoquePorSaltoaux.add(itemReporteControleEstoqueBoletos);
					}
				}
			}
		}
		return lsEstoquePorSaltoaux;
	}
	
	private void validarFormularioSeUsado(List<ItemReporteControleEstoqueBoletos> lsEstoquePorSalto, List<ItemReporteControleEstoqueBoletos> lsEstoque) {
		
		for (ItemReporteControleEstoqueBoletos item : lsEstoque) {
			for (ItemReporteControleEstoqueBoletos item2 : lsEstoquePorSalto) {
				if(item.getFolioInicial().equals(item2.getFolioInicial()) && item.getFolioFinal().equals(item2.getFolioFinal()) && item.getSerie().equals(item2.getSerie()) || item.getAidfId().equals(item2.getAidfId())) {
					item.setIsConsumido(Boolean.TRUE);
				}
			}
		}
	}
}
