/**
 * 
 */
package com.rjconsultores.ventaboletos.web.gui.controladores.relatorios;

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.impl.RelatorioDemandas;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.ArrayDataSource;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

/**
 * @author Thiago
 *
 */
public class RelatorioDemandasConsolidado extends RelatorioDemandas {
	public RelatorioDemandasConsolidado(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("   r.DESCRUTA LINHA,  ");
				sql.append("   cs.DESCCLASE CLASSE, ");
				sql.append("   e.NOMBEMPRESA EMPRESA,");
				sql.append("   COUNT(ts_normal.TIPOSERVICIO_ID) OCUPACAO_NORMAL, ");
				sql.append("   COUNT(ts_extra.TIPOSERVICIO_ID) OCUPACAO_EXTRA ");
				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 CLASE_SERVICIO cs ");
				sql.append(" ON ");
				sql.append("   cs.CLASESERVICIO_ID = bol.CLASESERVICIO_ID ");
				sql.append(" LEFT JOIN TIPO_SERVICIO ts_normal ");
				sql.append(" ON ");
				sql.append("   ts_normal.TIPOSERVICIO_ID = cs.TIPOSERVICO ");
				sql.append("   and ts_normal.TIPOSERVICIO_ID = 1 ");
				sql.append(" LEFT JOIN TIPO_SERVICIO ts_extra ");
				sql.append(" ON ");
				sql.append("   ts_extra.TIPOSERVICIO_ID = cs.TIPOSERVICO ");
				sql.append("   and ts_extra.TIPOSERVICIO_ID = 2 ");
				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("   cs.DESCCLASE ");
				

				sql.append(" ORDER BY ");
				sql.append(" e.NOMBEMPRESA, ");
				sql.append("   r.DESCRUTA, ");
				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("LINHA", rset.getString("LINHA"));
					dataResult.put("CLASSE", rset.getString("CLASSE"));
					dataResult.put("EMPRESA", rset.getString("EMPRESA"));
					dataResult.put("OCUPACAO_NORMAL", rset.getInt("OCUPACAO_NORMAL"));
					dataResult.put("OCUPACAO_EXTRA", rset.getInt("OCUPACAO_EXTRA"));

					this.dados.add(dataResult);

				}

				this.resultSet = rset;

			}
		});
	}
}
