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

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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


public class RelatorioMmphDer extends Relatorio {
	
	public RelatorioMmphDer(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();

				Date dataInicial = (Date) parametros.get("DATA_INICIAL");

				StringBuilder sql = new StringBuilder();

				sql.append(" select * from ( ");
				sql.append("   SELECT  ");
				sql.append("     r.DESCRUTA as linha, ");
				sql.append("     r.numruta as numlinha, ");
				sql.append("     count( distinct b.boleto_id) as bilhete,  ");
				sql.append("     to_char( b.fechorviaje, 'DD') as dia, ");
				sql.append("     r.indsentidoida as sentido, ");
				sql.append("     da.cantasientos as assentos, ");
				sql.append("     TO_CHAR( ec.horasalida ,'HH24:mi') as horario, ");
				sql.append("     b.CORRIDA_ID as servico, ");
				sql.append("     cs.descclase as classe, ");
				sql.append("     max(ct.fechorllegada-ct.fechorsalida)*24*60 as tempo,"); 
				sql.append("     SUM(distinct NVL( RS.KMORIGINAL,0)) as km, ");	
				sql.append("     e.codder,  ");
				sql.append("     sum(CASE ");
				sql.append("        WHEN co.tiposervicio_id = 2 THEN 1 ELSE 0 ");
				sql.append("     END) AS extra ");
				sql.append("   FROM boleto b ");
				sql.append("   inner join corrida co  ");
				sql.append("     on b.CORRIDA_ID = co.CORRIDA_ID  ");
				sql.append("     and b.FECCORRIDA = co.FECCORRIDA  ");
				sql.append("     and co.ACTIVO = 1  ");
				sql.append("   inner join ruta r  ");
				sql.append("     on b.RUTA_ID = r.RUTA_ID  ");
				sql.append("     and r.ACTIVO = 1 ");
				sql.append("   inner join MARCA m ");
				sql.append("    on m.marca_id = b.marca_id ");
				sql.append("    and m.activo = 1 ");
				sql.append("   INNER JOIN empresa e ");
				sql.append("    on m.empresa_id = e.empresa_id ");
				sql.append("    and e.activo = 1 ");
				sql.append("   INNER JOIN esquema_corrida ec ");
				sql.append("    on co.esquemacorrida_id = ec.esquemacorrida_id ");
				sql.append("   left join rol_operativo ro ");
				sql.append("     on ro.roloperativo_id = co.roloperativo_id ");
				sql.append("   left join diagrama_autobus da  ");
				sql.append("     on ro.diagramaautobus_id = da.diagramaautobus_id ");
				sql.append("   left join clase_servicio cs  "); 
				sql.append("     on co.claseservicio_id = cs.claseservicio_id ");
				sql.append("   left join ruta_secuencia rs ");
				sql.append("     on rs.ruta_id = co.ruta_id "); 
				sql.append("     AND rs.activo = 1 "); 
				sql.append("   left join corrida_tramo ct ");
				sql.append("     on ct.tramo_id = rs.tramo_id ");
				sql.append("     and b.corrida_id = ct.corrida_id ");
				sql.append("     and b.feccorrida = ct.feccorrida ");
				sql.append("     and ct.activo = 1 ");
				sql.append("   WHERE b.activo = 1 ");
				sql.append("     and m.EMPRESA_ID  = :EMPRESA_ID ");
				sql.append("     and b.FECHORVENTA >= :DATA_INICIAL ");
				sql.append("     and b.FECHORVENTA <= :DATA_FINAL ");
				
				if (parametros.get("LINHAS") != null && !possuiFiltroTodos("LINHAS")) {
					sql.append("    and b.ruta_id IN (" + parametros.get("LINHAS").toString() + ")");
				}
				
				sql.append("     and b.MOTIVOCANCELACION_ID is null ");
				sql.append("     and b.INDSTATUSBOLETO = 'V' ");
				
				sql.append("   GROUP BY r.descruta, r.numruta, ");
				sql.append("     to_char(b.fechorviaje, 'DD'), ");
				sql.append("     r.indsentidoida, ");
				sql.append("     da.cantasientos, ");
				sql.append("     to_char(ec.horasalida, 'HH24:mi'), ");
				sql.append("     b.corrida_id, ");
				sql.append("     e.codder,  ");
				sql.append("     cs.descclase ");
				
				sql.append("   ) ");
				sql.append(" PIVOT  ");
				sql.append(" ( ");
				sql.append("   max(bilhete) tot ");
				sql.append("   for dia in ('01','02','03','04','05','06','07','08','09', ");
				sql.append("                 '10','11','12','13','14','15','16','17','18','19', ");
				sql.append("                 '20','21','22','23','24','25','26','27','28','29', ");
				sql.append("                 '30','31') ");
				sql.append(" ) ");
				sql.append(" ORDER BY linha, numlinha, sentido desc");

				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql.toString());

				stmt.setInt("EMPRESA_ID", Integer.valueOf(parametros.get("EMPRESA_ID").toString()));
				stmt.setTimestamp("DATA_INICIAL", new Timestamp(DateUtil.inicioFecha(dataInicial).getTime()));
				stmt.setTimestamp("DATA_FINAL", new Timestamp(DateUtil.fimFecha((Date) parametros.get("DATA_FINAL")).getTime()));

				ResultSet rset = stmt.executeQuery();
				
				rset.setFetchSize(500);
				
				Integer totDiasUteisIda = 0;
				Integer totDomingoIda = 0;
				Integer totSabadoIda = 0;
				BigDecimal totKmIda = BigDecimal.ZERO;
				BigDecimal totTempoIda = BigDecimal.ZERO;
				
				Integer totDiasUteisVolta = 0;
				Integer totDomingoVolta = 0;
				Integer totSabadoVolta = 0;	
				BigDecimal totKmVolta = BigDecimal.ZERO;
				BigDecimal totTempoVolta = BigDecimal.ZERO;

				while (rset.next()) {

					Map<String, Object> dataResult = new HashMap<String, Object>();
					
					String sentido = rset.getString("sentido");
					
					List<Integer> totais = new ArrayList<Integer>(31);
					
					totais.add( rset.getInt("'01'_TOT") );
					totais.add( rset.getInt("'02'_TOT") );
					totais.add( rset.getInt("'03'_TOT") );
					totais.add( rset.getInt("'04'_TOT") );
					totais.add( rset.getInt("'05'_TOT") );
					totais.add( rset.getInt("'06'_TOT") );
					totais.add( rset.getInt("'07'_TOT") );
					totais.add( rset.getInt("'08'_TOT") );
					totais.add( rset.getInt("'09'_TOT") );
					totais.add( rset.getInt("'10'_TOT") );
					totais.add( rset.getInt("'11'_TOT") );
					totais.add( rset.getInt("'12'_TOT") );
					totais.add( rset.getInt("'13'_TOT") );
					totais.add( rset.getInt("'14'_TOT") );
					totais.add( rset.getInt("'15'_TOT") );
					totais.add( rset.getInt("'16'_TOT") );
					totais.add( rset.getInt("'17'_TOT") );
					totais.add( rset.getInt("'18'_TOT") );
					totais.add( rset.getInt("'19'_TOT") );
					totais.add( rset.getInt("'20'_TOT") );
					totais.add( rset.getInt("'21'_TOT") );
					totais.add( rset.getInt("'22'_TOT") );
					totais.add( rset.getInt("'23'_TOT") );
					totais.add( rset.getInt("'24'_TOT") );
					totais.add( rset.getInt("'25'_TOT") );
					totais.add( rset.getInt("'26'_TOT") );
					totais.add( rset.getInt("'27'_TOT") );
					totais.add( rset.getInt("'28'_TOT") );
					totais.add( rset.getInt("'29'_TOT") );
					totais.add( rset.getInt("'30'_TOT") );
					totais.add( rset.getInt("'31'_TOT") );
					
					BigDecimal km = limpaNulo(rset.getBigDecimal("km"));
					totKmIda = totKmIda.add( sentido.equals("1")?km:BigDecimal.ZERO );
					totKmVolta = totKmVolta.add( sentido.equals("0")?km:BigDecimal.ZERO );
					
					BigDecimal tempo = limpaNulo(rset.getBigDecimal("tempo"));
					totTempoIda = totTempoIda.add( sentido.equals("1")?tempo:BigDecimal.ZERO );
					totTempoVolta = totTempoVolta.add( sentido.equals("0")?tempo:BigDecimal.ZERO );
					
					Calendar c = Calendar.getInstance();
					c.setTime(dataInicial);
					
					for (int i = 1; i < 32; i++) {
						c.set(Calendar.DAY_OF_MONTH, i);
						Integer dia = c.get(Calendar.DAY_OF_WEEK);
						Integer tot = totais.get(i-1);
						
						switch (dia) {
						case 1:
							dataResult.put("DIA"+i, "DOM");
							totDomingoIda += (sentido.equals("1") && tot>0)?1:0;
							totDomingoVolta += (sentido.equals("0") && tot>0)?1:0;
							dataResult.put("TOT"+i, tot);
							break;
						case 2:
							dataResult.put("DIA"+i, "SEG");
							totDiasUteisIda += (sentido.equals("1") && tot>0)?1:0;
							totDiasUteisVolta += (sentido.equals("0") && tot>0)?1:0;
							dataResult.put("TOT"+i, tot);
							break;
						case 3:
							dataResult.put("DIA"+i, "TER");
							totDiasUteisIda += (sentido.equals("1") && tot>0)?1:0;
							totDiasUteisVolta += (sentido.equals("0") && tot>0)?1:0;
							dataResult.put("TOT"+i, tot);
							break;
						case 4:
							dataResult.put("DIA"+i, "QUA");
							totDiasUteisIda += (sentido.equals("1") && tot>0)?1:0;
							totDiasUteisVolta += (sentido.equals("0") && tot>0)?1:0;
							dataResult.put("TOT"+i, tot);
							break;
						case 5:
							dataResult.put("DIA"+i, "QUI");
							totDiasUteisIda += (sentido.equals("1") && tot>0)?1:0;
							totDiasUteisVolta += (sentido.equals("0") && tot>0)?1:0;
							dataResult.put("TOT"+i, tot);
							break;
						case 6:
							dataResult.put("DIA"+i, "SEX");
							totDiasUteisIda += (sentido.equals("1") && tot>0)?1:0;
							totDiasUteisVolta += (sentido.equals("0") && tot>0)?1:0;
							dataResult.put("TOT"+i, tot);
							break;
						case 7:
							dataResult.put("DIA"+i, "SAB");
							totSabadoIda += (sentido.equals("1") && tot>0)?1:0;
							totSabadoVolta += (sentido.equals("0") && tot>0)?1:0;
							dataResult.put("TOT"+i, tot);
							break;
						default:
							break;
						}
					}
					
					String linha = rset.getString("numlinha") +"-"+ rset.getString("linha");
					dataResult.put("LINHA", linha);
					dataResult.put("SENTIDO", sentido);					
					dataResult.put("SERVICO", rset.getString("servico"));
					dataResult.put("HORARIO", rset.getString("horario"));
					dataResult.put("ASSENTOS", limpaNulo(rset.getBigDecimal("assentos")));
					dataResult.put("CLASSE", rset.getString("classe"));
					dataResult.put("CODDER", rset.getString("codder"));
					dataResult.put("TOTEXTRA", rset.getInt("extra"));
					
					dataResult.put("TOTDIASUTEISIDA", totDiasUteisIda);
					dataResult.put("TOTSABADOIDA", totSabadoIda);
					dataResult.put("TOTDOMINGOIDA", totDomingoIda);
					dataResult.put("TOTDIASUTEISVOLTA", totDiasUteisVolta);
					dataResult.put("TOTSABADOVOLTA", totSabadoVolta);
					dataResult.put("TOTDOMINGOVOLTA", totDomingoVolta);
					
					dataResult.put("TEMPOIDA", totTempoIda);
					dataResult.put("TEMPOVOLTA", totTempoVolta);
					dataResult.put("KMIDA", totKmIda);
					dataResult.put("KMVOLTA", totKmVolta);
					
					this.dados.add(dataResult);
					
				}

				this.resultSet = rset;
			}
		});
	}

	@Override
	protected void processaParametros() throws Exception {

	}
	
	private BigDecimal limpaNulo( BigDecimal val ) {
		if( val == null ) {
			return BigDecimal.ZERO;
		}else {
			return val;
		}
	}

}
