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.List;
import java.util.Map;

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

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

public class RelatorioEncerramentoCheckin extends Relatorio {
	
	public static final String DATA_INICIO_SERVICO = "DATA_INICIO_SERVICO";
	public static final String DATA_FIM_SERVICO = "DATA_FIM_SERVICO";
	public static final String DATA_INICIO_ENCERRAMENTO = "DATA_INICIO_ENCERRAMENTO";
	public static final String DATA_FIM_ENCERRAMENTO = "DATA_FIM_ENCERRAMENTO";
	private List<RelatorioEncerramentoCheckinBean> lsDadosRelatorio;
	
	public RelatorioEncerramentoCheckin(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 dataInicioServico = null;
				if (parametros.containsKey(DATA_INICIO_SERVICO)) {
					dataInicioServico = parametros.get(DATA_INICIO_SERVICO).toString() + " 00:00";
				}

				String dataFimServico = null;
				if (parametros.containsKey(DATA_FIM_SERVICO)) {
					dataFimServico = parametros.get(DATA_FIM_SERVICO).toString() + " 23:59";
				}

				String dataInicioEncerramento = null;
				if (parametros.containsKey(DATA_INICIO_ENCERRAMENTO)) {
					dataInicioEncerramento = parametros.get(DATA_INICIO_ENCERRAMENTO).toString() + " 00:00";
				}

				String dataFimEncerramento = null;
				if (parametros.containsKey(DATA_FIM_ENCERRAMENTO)) {
					dataFimEncerramento = parametros.get(DATA_FIM_ENCERRAMENTO).toString() + " 23:59";
				}

				Integer empresa_id = (Integer) parametros.get("empresa_id");
				Integer localidade_id = (Integer) parametros.get("localidade_id");

				String sql = getSql(dataInicioServico, dataFimServico, dataInicioEncerramento, dataFimEncerramento, empresa_id, localidade_id);
				
				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);

				if (dataInicioServico != null && dataFimServico != null) {
					stmt.setString("dataInicioServico", dataInicioServico);
					stmt.setString("dataFimServico", dataFimServico);
				}

				if (dataInicioEncerramento != null && dataFimEncerramento != null) {
					stmt.setString("dataInicioEncerramento", dataInicioEncerramento);
					stmt.setString("dataFimEncerramento", dataFimEncerramento);
				}

				if (empresa_id != null) {
					stmt.setInt("empresa_id", empresa_id);
				}

				if (localidade_id != null) {
					stmt.setInt("localidade_id", localidade_id);
				}

				ResultSet rs = stmt.executeQuery();
		
				lsDadosRelatorio = new ArrayList<RelatorioEncerramentoCheckinBean>();
				
				SimpleDateFormat formatadorData = new SimpleDateFormat("dd/MM/yyyy");
				SimpleDateFormat formatadorDataHora = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

				while (rs.next()) {
					RelatorioEncerramentoCheckinBean bean = new RelatorioEncerramentoCheckinBean();
					bean.setServico(rs.getInt("servico"));
					bean.setDataServico(formatadorData.format(rs.getDate("data_servico")));
					bean.setLocalidade(rs.getString("localidade"));
					bean.setDataEncerramento(formatadorDataHora.format(rs.getDate("data_encerramento")));
					bean.setUsuario(rs.getString("usuario"));
					bean.setImei(rs.getString("imei"));
					
					lsDadosRelatorio.add(bean);
				}

				if (lsDadosRelatorio.size() > 0) {
					setLsDadosRelatorio(lsDadosRelatorio);
				}
			}
		});
	}
	
	@Override
	protected void processaParametros() throws Exception {
		if (parametros.containsKey(DATA_INICIO_SERVICO) && parametros.containsKey(DATA_FIM_SERVICO)) {
			this.parametros.put("PERIODO_SERVICO", parametros.get(DATA_INICIO_SERVICO) + " à " + parametros.get(DATA_FIM_SERVICO));
		}

		if (parametros.containsKey(DATA_INICIO_ENCERRAMENTO) && parametros.containsKey(DATA_FIM_ENCERRAMENTO)) {
			this.parametros.put("PERIODO_ENCERRAMENTO", parametros.get(DATA_INICIO_ENCERRAMENTO) + " à " + parametros.get(DATA_FIM_ENCERRAMENTO));
		}
	}

	private void setLsDadosRelatorio(List<RelatorioEncerramentoCheckinBean> lsDadosRelatorio) {
		this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio));
		this.lsDadosRelatorio = lsDadosRelatorio;
	}
	
	private String getSql(String dataInicioServico, String dataFimServico, String dataInicioEncerramento, String dataFimEncerramento, Integer empresa_id, Integer localidade_id) {
		StringBuilder sb = new StringBuilder();
		sb.append("select c.corrida_id as servico, ");
		sb.append("cc.feccorrida as data_servico, ");
		sb.append("p.cveparada || ' - ' || p.descparada as localidade, ");
		sb.append("cc.fechorcerrado as data_encerramento, ");
		sb.append("u.nombusuario as usuario, ");
		sb.append("cc.imei_embarcada as imei ");
		sb.append("from checkin_cerrado cc ");
		sb.append("join corrida c on c.corrida_id = cc.corrida_id and c.feccorrida = cc.feccorrida ");
		sb.append("join parada p on p.parada_id = cc.origen_id ");
		sb.append("join usuario u on u.usuario_id = cc.usuario_id ");
		
		if (empresa_id!=null) {
			sb.append("join marca m on m.marca_id = c.marca_id ");
		}
		
		sb.append("where cc.activo = 1 ");

		if (dataInicioServico != null && dataFimServico != null) {
			sb.append("and cc.feccorrida between to_date(:dataInicioServico, 'dd/mm/yyyy hh24:mi') and to_date(:dataFimServico, 'dd/mm/yyyy hh24:mi') ");
		}

		if (dataInicioEncerramento != null && dataFimEncerramento != null) {
			sb.append("and cc.fechorcerrado between to_date(:dataInicioEncerramento, 'dd/mm/yyyy hh24:mi') and to_date(:dataFimEncerramento, 'dd/mm/yyyy hh24:mi') ");
		}
		
		if (empresa_id != null) {
			sb.append("and m.empresa_id = :empresa_id ");
		}

		if (localidade_id != null) {
			sb.append("and p.parada_id = :localidade_id ");
		}

		sb.append("order by 2, 1, 4, 3, 5");

		return sb.toString();
	}
}