package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
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.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioBpeNumeracaoReusoBean;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

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

public class RelatorioBpeNumeracaoReuso extends Relatorio {
	
	private List<RelatorioBpeNumeracaoReusoBean> lsDadosRelatorio;

	public RelatorioBpeNumeracaoReuso(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();
				Map<String, Object> parametros = this.relatorio.getParametros();

				String sql = getSql(parametros);
				
				Date dtInicio = (Date) parametros.get("DATA_INICIO");
				Date dtFim = (Date) parametros.get("DATA_FIM");
			
				NamedParameterStatement ps = new NamedParameterStatement(conexao, sql.toString());
				if(dtInicio != null && dtFim != null) {
					ps.setString("dataInicio", DateUtil.getStringDate(dtInicio, "dd/MM/yyyy") + " 00:00:00");
					ps.setString("dataFinal", DateUtil.getStringDate(dtFim, "dd/MM/yyyy") + " 23:59:59");
				}

				ResultSet rset = ps.executeQuery();
				lsDadosRelatorio = new ArrayList<RelatorioBpeNumeracaoReusoBean>();

				while (rset.next()) {					
						RelatorioBpeNumeracaoReusoBean bean = new RelatorioBpeNumeracaoReusoBean();
						bean.setEstado(rset.getString("estado"));
						bean.setSerieBPE(rset.getString("serieBPE"));
						bean.setNumeroBPE( rset.getInt("numeroBPE"));
						lsDadosRelatorio.add(bean);	
					}								
				buscarInicialFinalPorUf();
				setLsDadosRelatorio(lsDadosRelatorio);
				this.resultSet = rset;
			}		
		});
	}

	@Override
	protected void processaParametros() throws Exception {
	}

	private String getSql(Map<String, Object> parametros) {


		String estados = (String) parametros.get("ESTADOS_ID");
		String empresaId = (String) parametros.get("EMPRESA_ID");
		Date dtInicio = (Date) parametros.get("DATA_INICIO");
		Date dtFim = (Date) parametros.get("DATA_FIM");
		
		String sql = getSql( estados, empresaId, dtInicio, dtFim);
			
		return sql.toString();
	}

	private String getSql(String estados, String empresaId, Date dtInicio, Date dtFim) {
		
		StringBuilder sql = new StringBuilder();
		
		sql.append("select tabela.estado as estado , tabela.serieBPE as serieBPE, to_number(tabela.numeroBPE) as numeroBPE, estadoId as estadoId  from ( select (to_number(bol.num_bpe) + 1) as numeroBPE,  BOL.NUMSERIE_BPE as serieBPE, E.NOMBESTADO as estado,  e.estado_id as estadoId   ");
		sql.append(" FROM BOLETO bol ");
		sql.append("   LEFT outer JOIN BOLETO  r on bol.num_bpe + 1 = r.num_bpe ");
		sql.append("   inner join parada origem  on origem.parada_id = bol.origen_id    ");
		sql.append("    inner join ciudad cidade  on cidade.ciudad_id = origem.ciudad_id   ");
		sql.append("   inner join estado e on (e.estado_id = cidade.estado_id)    ");
		if (empresaId != null) {
			sql.append(" AND bol.EMPRESACORRIDA_ID IN(  " + empresaId + " ) ");
		}
		if (estados != null) {
			sql.append(" AND e.ESTADO_ID IN ( " + estados + " )");
		}
		sql.append("  and bol.fechorventa between to_date(:dataInicio,'dd/MM/yyyy hh24:mi:ss') and to_date(:dataFinal,'dd/MM/yyyy hh24:mi:ss') ");
		sql.append("  minus ");
		sql.append("select  to_number(bol.num_bpe) as numeroBPE ,  BOL.NUMSERIE_BPE as serieBPE, E.NOMBESTADO as estado, e.estado_id as estadoId  ");
		sql.append(" FROM BOLETO bol ");
		sql.append("   inner join parada origem  on origem.parada_id = bol.origen_id    ");
		sql.append("    inner join ciudad cidade  on cidade.ciudad_id = origem.ciudad_id   ");
		sql.append("    inner join estado e on (e.estado_id = cidade.estado_id)    ");
		if (empresaId != null) {
			sql.append(" AND bol.EMPRESACORRIDA_ID IN(  " + empresaId + " ) ");
		}
		if (estados != null) {
			sql.append(" AND e.ESTADO_ID IN ( " + estados + " )");
		}
		sql.append(" ) tabela ");
		sql.append("  group by tabela.estado, tabela.serieBPE,  numeroBPE, estadoId ");
		sql.append("  ORDER BY tabela.estado,  tabela.serieBPE, tabela.numeroBPE ASC  ");
		return sql.toString();
	}
	public void setLsDadosRelatorio(List<RelatorioBpeNumeracaoReusoBean> lsDadosRelatorio) {
		this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio));
		this.lsDadosRelatorio = lsDadosRelatorio;
	}
	private void buscarInicialFinalPorUf() {
				
		String estado = "";
		List<Integer> bpes = new ArrayList<Integer>();
		 Map<String, String> estados = converterListaParaMap(lsDadosRelatorio);
		 
		 for (Map.Entry<String, String> entry : estados.entrySet()) {
			 estado = entry.getValue();
				if(estado != null){
					for (RelatorioBpeNumeracaoReusoBean relatorio2 : lsDadosRelatorio) {
						if(estado.equals(relatorio2.getEstado())){				
							bpes.add(relatorio2.getNumeroBPE());
						}
					}
					for (RelatorioBpeNumeracaoReusoBean relatorio2 : lsDadosRelatorio) {
						if(estado.equals(relatorio2.getEstado())){				
							relatorio2.setFinalAutorizado(bpes.get(bpes.size()-1));
						}
					}				
				}
		    }		
	}
	
	public Map<String, String> converterListaParaMap(List<RelatorioBpeNumeracaoReusoBean> list) {
	    Map<String, String> map = new HashMap<String,String>();
	    for (RelatorioBpeNumeracaoReusoBean relatorio : list) {
	        map.put(relatorio.getEstado(), relatorio.getEstado());
	    }
	    return map;
	}	
}