/**
 * 
 */
package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

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

/**
 * @author Thiago
 *
 */
public class RelatorioDemandasDetalhado extends RelatorioDemandas {
	public RelatorioDemandasDetalhado(Map<String, Object> parametros, Connection conexao) throws Exception {
		super(parametros, conexao);
		this.setCustomDataSource(new ArrayDataSource(this) {
			@Override
			public void initDados() throws Exception {
				Connection conexao = this.relatorio.getConexao();
				Map<String, Object> parametros = this.relatorio.getParametros();

				Calendar dataInicial = Calendar.getInstance();
				dataInicial.setTime((Date) parametros.get("DATA_INICIAL"));

				Calendar dataFinal = Calendar.getInstance();
				dataFinal.setTime((Date) parametros.get("DATA_FINAL"));

				Calendar horaInicial = Calendar.getInstance();
				if (parametros.get("HORA_INICIAL") != null) {
					horaInicial.setTime((Date) parametros.get("HORA_INICIAL"));
				}
				Calendar horaFinal = Calendar.getInstance();
				if (parametros.get("HORA_FINAL") != null) {
					horaFinal.setTime((Date) parametros.get("HORA_FINAL"));
				}

				SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

				StringBuilder sql = new StringBuilder();

				sql.append(" SELECT  ");
				sql.append("   bol.fechorviaje DATA,  ");
				sql.append("   r.DESCRUTA LINHA,  ");
				sql.append("   bol.CORRIDA_ID SERVICO, ");
				sql.append("   bol.fechorviaje HORARIO, ");
				sql.append("   p_origem.DESCPARADA ORIGEM,  ");
				sql.append("   p_destino.DESCPARADA DESTINO, ");
				sql.append("   cs.DESCCLASE CLASSE, ");
				sql.append("   da.CANTASIENTOSVENDIBLES CAPACIDADE, ");
				sql.append("   ts.DESCSERVICIO TIPO_SERVICO, ");
				sql.append("   ct.PLATAFORMA PLATAFORMA, ");
				sql.append("   e.NOMBEMPRESA EMPRESA,");
				sql.append("   COUNT(bol.BOLETO_ID) OCUPACAO ");
				sql.append("   FROM ");
				sql.append("   boleto bol  ");
				sql.append(" LEFT JOIN ruta r ");
				sql.append(" ON ");
				sql.append("   r.RUTA_ID = bol.RUTA_ID ");
				sql.append(" LEFT JOIN parada p_origem ");
				sql.append(" ON ");
				sql.append("   p_origem.PARADA_ID = bol.ORIGEN_ID ");
				sql.append(" LEFT JOIN parada p_destino ");
				sql.append(" ON ");
				sql.append("   p_destino.PARADA_ID = bol.DESTINO_ID ");
				sql.append(" LEFT JOIN CLASE_SERVICIO cs ");
				sql.append(" ON ");
				sql.append("   cs.CLASESERVICIO_ID = bol.CLASESERVICIO_ID ");
				sql.append(" LEFT JOIN TIPO_SERVICIO ts ");
				sql.append(" ON ");
				sql.append("   ts.TIPOSERVICIO_ID = cs.TIPOSERVICO ");
				sql.append(" LEFT JOIN corrida_tramo ct ");
				sql.append(" ON ");
				sql.append("   ct.CORRIDA_ID   = bol.CORRIDA_ID ");
				sql.append(" AND ct.FECCORRIDA = bol.FECCORRIDA ");
				sql.append(" LEFT JOIN corrida c ");
				sql.append(" ON ");
				sql.append("   c.CORRIDA_ID   = bol.CORRIDA_ID ");
				sql.append(" AND c.FECCORRIDA = bol.FECCORRIDA ");
				sql.append(" LEFT JOIN rol_operativo ro ");
				sql.append(" ON ");
				sql.append("   ro.ROLOPERATIVO_ID = c.ROLOPERATIVO_ID ");
				sql.append(" LEFT JOIN diagrama_autobus da ");
				sql.append(" ON ");
				sql.append("   da.diagramaautobus_id = ro.diagramaautobus_id ");
				sql.append(" LEFT JOIN empresa e ");
				sql.append(" ON ");
				sql.append("   e.EMPRESA_ID = bol.EMPRESACORRIDA_ID ");
				sql.append(" WHERE ");
				sql.append(" bol.FECHORVIAJE >= :DATA_INICIAL ");
				sql.append(" AND bol.FECHORVIAJE <= :DATA_FINAL ");
				if (parametros.get("RUTA_ID") != null) {
					sql.append(" AND r.RUTA_ID  = :RUTA_ID  ");
				}
				if (parametros.get("EMPRESA_ID") != null) {
					sql.append(" AND e.EMPRESA_ID      = :EMPRESA_ID ");
				}
				if (parametros.get("PARADA_ID") != null) {
					sql.append(" AND bol.ORIGEN_ID      = :PARADA_ID ");
				}
				if (parametros.get("HORA_INICIAL") != null && parametros.get("HORA_FINAL") != null) {
					sql.append(" AND ");
					sql.append(" ( ");
					do {
						mesclarDataHora(dataInicial, horaInicial);
						sql.append(" bol.FECHORVIAJE BETWEEN to_date('" + format.format(dataInicial.getTime()) + "', 'dd/MM/yyyy HH24:MI:ss') ");
						mesclarDataHora(dataInicial, horaFinal);
						sql.append(" AND to_date('" + format.format(dataInicial.getTime()) + "', 'dd/MM/yyyy HH24:MI:ss')");
						dataInicial.add(Calendar.DAY_OF_MONTH, 1);
						if (!dataInicial.after(dataFinal)) {
							sql.append(" OR ");
						}

					} while (!dataInicial.after(dataFinal));
					sql.append("   ) ");
				}
				if (parametros.get("TIPO_SERVICO") != null) {
					sql.append(" AND ts.TIPOSERVICIO_ID = :TIPO_SERVICO ");
				}
				sql.append(" GROUP BY ");
				sql.append("   e.NOMBEMPRESA, ");
				sql.append("   r.DESCRUTA, ");
				sql.append("   bol.fechorviaje, ");
				sql.append("   bol.CORRIDA_ID, ");
				sql.append("   bol.ORIGEN_ID, ");
				sql.append("   bol.DESTINO_ID, ");
				sql.append("   p_origem.DESCPARADA, ");
				sql.append("   p_destino.DESCPARADA, ");
				sql.append("   cs.DESCCLASE, ");
				sql.append("   ts.DESCSERVICIO, ");
				sql.append("   ct.PLATAFORMA, ");
				sql.append("   da.CANTASIENTOSVENDIBLES ");

				sql.append(" ORDER BY ");
				sql.append("   e.NOMBEMPRESA, ");
				sql.append("   bol.FECHORVIAJE, ");
				sql.append("   bol.CORRIDA_ID, ");
				sql.append("   p_origem.DESCPARADA, ");
				sql.append("   p_destino.DESCPARADA, ");
				sql.append("   cs.DESCCLASE ");

				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql.toString());
				if (parametros.get("EMPRESA_ID") != null) {
					stmt.setInt("EMPRESA_ID", Integer.valueOf(parametros.get("EMPRESA_ID").toString()));
				}
				if (parametros.get("PARADA_ID") != null) {
					stmt.setInt("PARADA_ID", Integer.valueOf(parametros.get("PARADA_ID").toString()));
				}
				if (parametros.get("RUTA_ID") != null) {
					stmt.setInt("RUTA_ID", Integer.valueOf(parametros.get("RUTA_ID").toString()));
				}
				if (parametros.get("TIPO_SERVICO") != null) {
					stmt.setInt("TIPO_SERVICO", Integer.valueOf(parametros.get("TIPO_SERVICO").toString()));
				}
				stmt.setTimestamp("DATA_INICIAL", new Timestamp(DateUtil.inicioFecha((Date) parametros.get("DATA_INICIAL")).getTime()));
				stmt.setTimestamp("DATA_FINAL", new Timestamp(DateUtil.fimFecha((Date) parametros.get("DATA_FINAL")).getTime()));

				ResultSet rset = stmt.executeQuery();

				while (rset.next()) {

					Map<String, Object> dataResult = new HashMap<String, Object>();

					dataResult.put("DATA", rset.getDate("DATA"));
					dataResult.put("LINHA", rset.getString("LINHA"));
					dataResult.put("SERVICO", rset.getBigDecimal("SERVICO"));
					dataResult.put("HORARIO", rset.getTimestamp("HORARIO"));
					dataResult.put("ORIGEM", rset.getString("ORIGEM"));
					dataResult.put("DESTINO", rset.getString("DESTINO"));
					dataResult.put("CLASSE", rset.getString("CLASSE"));
					dataResult.put("CAPACIDADE", rset.getInt("CAPACIDADE"));
					dataResult.put("TIPO_SERVICO", rset.getString("TIPO_SERVICO"));
					dataResult.put("PLATAFORMA", rset.getString("PLATAFORMA"));
					dataResult.put("OCUPACAO", rset.getInt("OCUPACAO"));
					dataResult.put("EMPRESA", rset.getString("EMPRESA"));

					this.dados.add(dataResult);

				}

				this.resultSet = rset;

			}
		});
	}
}
