/**
 * 
 */
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(" with vendidos as ( ");
				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("   nvl(ct.PLATAFORMA,'') PLATAFORMA, ");
				sql.append("   e.NOMBEMPRESA EMPRESA,");
				sql.append("   COUNT(bol.BOLETO_ID) OCUPACAO, ");
				sql.append("   r.NUMRUTA CODLINHA , ");
				sql.append("  r.INDSENTIDOIDA SENTIDO  ");
				sql.append(" FROM boleto bol  ");
				sql.append(" LEFT JOIN ruta r               ON r.RUTA_ID = bol.RUTA_ID ");
				sql.append(" LEFT JOIN parada p_origem      ON p_origem.PARADA_ID = bol.ORIGEN_ID ");
				sql.append(" LEFT JOIN parada p_destino     ON p_destino.PARADA_ID = bol.DESTINO_ID ");
				sql.append(" LEFT JOIN CLASE_SERVICIO cs    ON cs.CLASESERVICIO_ID = bol.CLASESERVICIO_ID ");
				sql.append(" LEFT JOIN TIPO_SERVICIO ts     ON ts.TIPOSERVICIO_ID = cs.TIPOSERVICO ");
				sql.append(" LEFT JOIN corrida_tramo ct     ON ct.CORRIDA_ID = bol.CORRIDA_ID AND ct.FECCORRIDA = bol.FECCORRIDA ");
				sql.append(" and  ct.numsecuencia = 1 ");
				sql.append(" LEFT JOIN corrida c  		    ON c.CORRIDA_ID = bol.CORRIDA_ID AND c.FECCORRIDA = bol.FECCORRIDA ");
				sql.append(" LEFT JOIN rol_operativo ro     ON ro.ROLOPERATIVO_ID = c.ROLOPERATIVO_ID ");
				sql.append(" LEFT JOIN diagrama_autobus da  ON da.diagramaautobus_id = ro.diagramaautobus_id ");
				sql.append(" LEFT JOIN empresa e            ON e.EMPRESA_ID = bol.EMPRESACORRIDA_ID ");
				sql.append(" WHERE ");
				sql.append(" BOL.MOTIVOCANCELACION_ID IS NULL ");
				if (parametros.get("HORA_INICIAL") == null && parametros.get("HORA_FINAL") == null) {
					sql.append(" and 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 c.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("   r.NUMRUTA, ");
				sql.append("   r.INDSENTIDOIDA ");

				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 ");

				sql.append("   )  , nao_vendidos as ( ");

				sql.append(" select distinct c.FECCORRIDA data, ");
				sql.append(" r.DESCRUTA LINHA, ");
				sql.append(" c.CORRIDA_ID SERVICO, ");
				sql.append(" c.FECHORSALIDA 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(" NVL(ct.PLATAFORMA,'') PLATAFORMA, ");
				sql.append(" e.NOMBEMPRESA EMPRESA, ");
				sql.append(" 0 as OCUPACAO, ");
				sql.append(" r.NUMRUTA CODLINHA, ");
				sql.append(" r.INDSENTIDOIDA SENTIDO ");

				sql.append(" from corrida c ");
				sql.append(" LEFT JOIN ruta r ");
				sql.append(" ON r.RUTA_ID = c.RUTA_ID ");
				sql.append(" LEFT JOIN parada p_origem ");
				sql.append(" ON p_origem.PARADA_ID = c.ORIGEN_ID ");
				sql.append(" LEFT JOIN parada p_destino ");
				sql.append(" ON p_destino.PARADA_ID = c.DESTINO_ID ");
				sql.append(" LEFT JOIN CLASE_SERVICIO cs ");
				sql.append(" ON cs.CLASESERVICIO_ID = c.CLASESERVICIO_ID ");
				sql.append(" LEFT JOIN TIPO_SERVICIO ts ");
				sql.append(" ON ts.TIPOSERVICIO_ID = cs.TIPOSERVICO ");
				sql.append(" LEFT JOIN corrida_tramo ct ");
				sql.append(" ON ct.CORRIDA_ID  = c.CORRIDA_ID ");
				sql.append(" AND ct.FECCORRIDA = c.FECCORRIDA ");
				sql.append(" LEFT JOIN rol_operativo ro ");
				sql.append(" ON ro.ROLOPERATIVO_ID = c.ROLOPERATIVO_ID ");
				sql.append(" LEFT JOIN diagrama_autobus da ");
				sql.append(" ON da.diagramaautobus_id = ro.diagramaautobus_id ");
				sql.append(" LEFT JOIN empresa e ");
				sql.append(" ON e.EMPRESA_ID               = c.EMPRESACORRIDA_ID ");
				sql.append(" WHERE ");
				sql.append(" c.activo = 1 ");
				if (parametros.get("HORA_INICIAL") == null && parametros.get("HORA_FINAL") == null) {
					sql.append(" and c.FECHORSALIDA >= :DATA_INICIAL ");
					sql.append(" AND c.FECHORSALIDA <= :DATA_FINAL ");
				}
				
				if (parametros.get("PARADA_ID") != null) {
					sql.append(" AND p_origem.PARADA_ID = :PARADA_ID ");
				}

				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("HORA_INICIAL") != null && parametros.get("HORA_FINAL") != null) {
					sql.append(" AND ");
					sql.append(" ( ");
					do {
						mesclarDataHora(dataInicial, horaInicial);
						sql.append(" C.FECHORSALIDA 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 c.TIPOSERVICIO_ID = :TIPO_SERVICO ");
				}
				sql.append(" and (c.corrida_id, c.feccorrida) not in (select  SERVICO, data from  vendidos ) ");
				sql.append(" ) ");
				
				sql.append(" select * from ( ");
				
				sql.append(" select * from vendidos union select  * from  nao_vendidos ");
				
				sql.append(" ) order by empresa ");



				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()));
				}
				if (parametros.get("HORA_INICIAL") == null && parametros.get("HORA_FINAL") == null) {
					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"));
					dataResult.put("CODLINHA", rset.getString("CODLINHA"));
					dataResult.put("SENTIDO", rset.getString("SENTIDO"));

					this.dados.add(dataResult);

				}

				this.resultSet = rset;

			}
		});
	}
}
