package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioImpressaoPosteriorBean;
import com.rjconsultores.ventaboletos.utilerias.LocalizadorHelper;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

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

public class RelatorioImpressaoPosterior extends Relatorio {

	private static Logger log = LogManager.getLogger(RelatorioImpressaoPosterior.class);
	
	private List<RelatorioImpressaoPosteriorBean> lsDadosRelatorio;

	public RelatorioImpressaoPosterior(Map<String, Object> parametros, Connection conexao) throws Exception {
		super(parametros, conexao);

		this.setCustomDataSource(new DataSource(this) {
			@Override
			public void initDados() throws Exception {

				Connection conexao = this.relatorio.getConexao();

				Map<String, Object> parametros = this.relatorio.getParametros();
				
				String datVendaInicial = null;
				String datVendaFinal = null;
				String datViagemInicial = null;
				String datViagemFinal = null;

				if(parametros.get("datVendaInicial") != null ) {
					datVendaInicial = parametros.get("datVendaInicial").toString(); 
					datVendaInicial += parametros.get("horVendaInicial") != null ? " "+parametros.get("horVendaInicial").toString(): " 00:00:00";
				}
				
				if(parametros.get("datVendaFinal") != null ) {
					datVendaFinal = parametros.get("datVendaFinal").toString();
					datVendaFinal += parametros.get("horVendaFinal") != null ? " "+parametros.get("horVendaFinal").toString(): " 23:59:59";
				}
				
				if(parametros.get("datViagemInicial") != null ) {
					datViagemInicial = parametros.get("datViagemInicial").toString();
					datViagemInicial += parametros.get("horViagemInicial") != null ? " "+parametros.get("horViagemInicial").toString(): " 00:00:00";
				}
				
				if(parametros.get("datViagemFinal") != null ) {
					datViagemFinal = parametros.get("datViagemFinal").toString();
					datViagemFinal += parametros.get("horViagemFinal") != null ? " "+parametros.get("horViagemFinal").toString(): " 23:59:59";
				}
				
				String empresa = parametros.get("empresa") != null ? parametros.get("empresa").toString() : null;
				String origemIds = parametros.get("NUMORIGEM") != null ? parametros.get("NUMORIGEM").toString() : null;
				String destinoIds = parametros.get("NUMDESTINO") != null ? parametros.get("NUMDESTINO").toString() : null;
				
				lsDadosRelatorio = new ArrayList<RelatorioImpressaoPosteriorBean>();

				String sql = carregarQuery(datVendaInicial, datVendaFinal, datViagemInicial, datViagemFinal, origemIds, destinoIds, empresa);

				log.debug(sql);

				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);
				ResultSet rset1 = null;
				SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
				
				

				if( StringUtils.isNotEmpty(datVendaInicial) ) {
					stmt.setTimestamp("datVendaInicial", new java.sql.Timestamp(sdf.parse(datVendaInicial).getTime()));
				}
				
				if( StringUtils.isNotEmpty(datVendaFinal) ) {
					stmt.setTimestamp("datVendaFinal", new java.sql.Timestamp(sdf.parse(datVendaFinal).getTime()));
				}
				
				if( StringUtils.isNotEmpty(datViagemInicial) ) {
					stmt.setTimestamp("datViagemInicial", new java.sql.Timestamp(sdf.parse(datViagemInicial).getTime()));
				}
				
				if( StringUtils.isNotEmpty(datViagemFinal) ) {
					stmt.setTimestamp("datViagemFinal", new java.sql.Timestamp(sdf.parse(datViagemFinal).getTime()));
				}
				
				if( StringUtils.isNotEmpty(empresa) ) {
					stmt.setInt("empresaId", Integer.parseInt(empresa));
				}

				rset1= stmt.executeQuery();
				
				LocalizadorHelper helper = new LocalizadorHelper();

				while (rset1.next()) {
					RelatorioImpressaoPosteriorBean ImpressaoPosterior = new RelatorioImpressaoPosteriorBean();
					
					ImpressaoPosterior.setEmpresa(rset1.getString("empresa"));
					ImpressaoPosterior.setDocumento(rset1.getString("documento"));
					ImpressaoPosterior.setLocalizador(helper.getLocalizadorAlfa(rset1.getString("localizador")));
					ImpressaoPosterior.setNome(rset1.getString("nome"));
					ImpressaoPosterior.setReserva(rset1.getString("reserva"));
					ImpressaoPosterior.setOrigem(rset1.getString("origem"));
					ImpressaoPosterior.setDestino(rset1.getString("destino"));
					ImpressaoPosterior.setTelefone(rset1.getString("telefone"));
					ImpressaoPosterior.setDataVenda((Date)rset1.getObject("dataVenda"));
					ImpressaoPosterior.setDataEmbarque((Date)rset1.getObject("dataEmbarque"));

					lsDadosRelatorio.add(ImpressaoPosterior);
				}
				
				rset1.close();

				if (lsDadosRelatorio.size() > 0) {
					setLsDadosRelatorio(lsDadosRelatorio);
				}

			}
		});
	}

	public void setLsDadosRelatorio(List<RelatorioImpressaoPosteriorBean> lsDadosRelatorio) {
		this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio));
		this.lsDadosRelatorio = lsDadosRelatorio;
	}

	@Override
	protected void processaParametros() throws Exception {
	}

	private String carregarQuery(String datVendaInicial, String datVendaFinal, String datViagemInicial, String datViagemFinal, String origem, String destino, String empresa) {

		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT ");
		sql.append("   e.NOMBEMPRESA as empresa, ");
		sql.append("   ORIGINAL.DESCNUMDOC as documento, ");
		sql.append("   ORIGINAL.NUMOPERACION as localizador, ");
		sql.append("   ORIGINAL.NOMBPASAJERO as nome, ");
		sql.append("   ORIGINAL.NUMFOLIOSISTEMA as reserva, ");
		sql.append("   po.DESCPARADA as origem, ");
		sql.append("   pd.DESCPARADA as destino, ");
		sql.append("   ORIGINAL.DESCTELEFONO as telefone, ");
		sql.append("   ORIGINAL.FECHORVENTA as dataVenda, ");
		sql.append("   ORIGINAL.FECHORVIAJE as dataEmbarque ");
		sql.append(" FROM BOLETO ORIGINAL ");
		sql.append(" INNER JOIN EMPRESA e ON ORIGINAL.EMPRESACORRIDA_ID = e.EMPRESA_ID ");
		sql.append(" INNER JOIN PARADA po ON (original.ORIGEN_ID = po.PARADA_ID) ");
		sql.append(" INNER JOIN PARADA pd ON (original.DESTINO_ID = pd.PARADA_ID) ");
		sql.append(" WHERE ORIGINAL.TIPOVENTA_ID IN (5,12,18,41,49) ");
		sql.append("   AND (original.MOTIVOCANCELACION_ID is null or original.MOTIVOCANCELACION_ID = 16 ) ");
		
		if( StringUtils.isNotEmpty(datVendaInicial) ) {
			sql.append("   AND original.FECHORVENTA >= :datVendaInicial ");
		}
		
		if( StringUtils.isNotEmpty(datVendaFinal) ) {
			sql.append("   AND original.FECHORVENTA <= :datVendaFinal ");
		}
		
		if( StringUtils.isNotEmpty(datViagemInicial) ) {
			sql.append("   AND original.FECHORVIAJE >= :datViagemInicial ");
		}
		
		if( StringUtils.isNotEmpty(datViagemFinal) ) {
			sql.append("   AND original.FECHORVIAJE <= :datViagemFinal ");
		}

        if( StringUtils.isNotEmpty(origem) ) {
        	sql.append("    AND original.ORIGEN_ID in (" + origem + ") ");
        }
        
        if (StringUtils.isNotEmpty(destino)) {
        	sql.append("    AND original.DESTINO_ID in (" + destino + ") ");
        }
        
        if (StringUtils.isNotEmpty(empresa)) {
            sql.append(" AND original.EMPRESACORRIDA_ID = :empresaId ");
        }
        
        sql.append(" ORDER BY  ");
		sql.append("   e.NOMBEMPRESA, ");
		sql.append("   po.DESCPARADA, ");
		sql.append("   ORIGINAL.FECHORVENTA ");

		return sql.toString();

	}

}
