/**
 * 
 */
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.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioResumoLinhasBean;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;
import com.rjconsultores.ventaboletos.web.utilerias.spring.AppContext;

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

import com.rjconsultores.ventaboletos.service.ConstanteService;

/**
 * @author Bruno H. G. Gouvea <bruno@rjconsultores.com.br>
 * 
 */
public class RelatorioResumoLinhas extends Relatorio {

	/**
	 * @param parametros
	 * @param conexao
	 */
	
	private List<RelatorioResumoLinhasBean> lsDadosRelatorio;
	private static String CONSTANTE_GRATUIDADE_CRIANCA;
	
	public RelatorioResumoLinhas(Map<String, Object> parametros, Connection conexao) throws Exception {
		super(parametros, conexao);
		this.setCustomDataSource(new DataSource(this) {
			@Override
			public void initDados() throws Exception {
				Integer rutaId = parametros.get("RUTA_ID") != null ? Integer.valueOf(parametros.get("RUTA_ID").toString()) : null;
				Integer empresaId = parametros.get("EMPRESA_ID") != null ? Integer.valueOf(parametros.get("EMPRESA_ID").toString()) : null;
				Integer grupoRutaId = parametros.get("GRUPORUTA_ID") != null ? Integer.valueOf(parametros.get("GRUPORUTA_ID").toString()) : null;
				CONSTANTE_GRATUIDADE_CRIANCA = buscarConstante("GRATUIDADE_CRIANCA");
				String sql = getSql(rutaId, grupoRutaId);

				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);
				ResultSet rset = null;

				SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
				if (parametros.get("DATA_INICIAL") != null) {
					Date dataInicio = (Date) parametros.get("DATA_INICIAL");
					stmt.setString("DATA_INICIAL", sdf.format(dataInicio));
				}

				if (parametros.get("DATA_FINAL") != null) {
					Date dataFinal = (Date) parametros.get("DATA_FINAL");
					stmt.setString("DATA_FINAL", sdf.format(dataFinal));
				}

				if (rutaId != null) {
					stmt.setInt("RUTA_ID", rutaId);
				}
				if (grupoRutaId != null) {
					stmt.setInt("GRUPORUTA_ID", grupoRutaId);
				}
				stmt.setInt("EMPRESA_ID", empresaId.intValue());
				stmt.setString("CRIANCA_ID",CONSTANTE_GRATUIDADE_CRIANCA);
				rset = stmt.executeQuery(); 

				lsDadosRelatorio = new ArrayList<RelatorioResumoLinhasBean>();
				Set<RelatorioResumoLinhasBean> setDadosRelatorio = new HashSet<RelatorioResumoLinhasBean>();

				RelatorioResumoLinhasBean relatorioBean = null;
				while (rset.next()) {
					relatorioBean = new RelatorioResumoLinhasBean();
					relatorioBean.setRUTA_ID(rset.getBigDecimal("RUTA_ID"));
					relatorioBean.setDESCRUTA(rset.getString("DESCRUTA"));
					relatorioBean.setROLOPERATIVO_ID(rset.getInt("ROLOPERATIVO_ID"));
					relatorioBean.setEXTENSAO_KM(rset.getBigDecimal("EXTENSAO_KM"));
					relatorioBean.setPASSAGEIROS(rset.getBigDecimal("PASSAGEIROS"));
					relatorioBean.setVIAGENS(rset.getBigDecimal("VIAGENS"));
					relatorioBean.setPAX_KM(rset.getBigDecimal("PAX_KM"));
					relatorioBean.setNUMRUTA(rset.getString("NUMRUTA"));
					relatorioBean.setINDSENTIDOIDA(rset.getInt("INDSENTIDOIDA"));
					relatorioBean.setFECCORRIDA(rset.getDate("FECCORRIDA"));
					setDadosRelatorio.add(relatorioBean);
				}
				
				if (setDadosRelatorio.size() > 0) {
					lsDadosRelatorio.addAll(setDadosRelatorio);
					setLsDadosRelatorio( lsDadosRelatorio );
				}else {
					//tratado caso onde filtra a linha (apenas uma linha)
					if(rset.getRow() ==0 && rutaId !=null && relatorioBean!=null) {
						lsDadosRelatorio.add(relatorioBean);
						setLsDadosRelatorio(lsDadosRelatorio);
					}
				}

			
			}

		});
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio#processaParametros()
	 */
	@Override
	public void processaParametros() throws Exception {
	}
	
	private String getSql(Integer rutaId, Integer grupoRutaId) {
		StringBuilder sqlSb = new StringBuilder();
		sqlSb.append(" SELECT TAB.*, ");
		sqlSb.append("     ROUND((SELECT SUM((DECODE(NVL(TR.CANTKMREAL,0), 0, 1, NVL(TR.CANTKMREAL,0)) / NVL(TAB.EXTENSAO_KM,0)) * COUNT(1)) ");
		sqlSb.append("              FROM CORRIDA       CR, ");
		sqlSb.append("                   CORRIDA_TRAMO CT, ");				
		sqlSb.append("                   TRAMO         TR,");
		sqlSb.append("                   BOLETO        BO, ");
		sqlSb.append("                   CORRIDA_TRAMO CTD, ");
		sqlSb.append("                   CORRIDA_TRAMO CTO	 ");
		sqlSb.append("             WHERE CR.FECCORRIDA BETWEEN TO_DATE(:DATA_INICIAL, 'DD/MM/YY hh24:mi:ss') AND TO_DATE(:DATA_FINAL, 'DD/MM/YY hh24:mi:ss') ");	
		sqlSb.append("               AND CR.RUTA_ID = TAB.RUTA_ID ");
		sqlSb.append("               AND CR.ROLOPERATIVO_ID = TAB.ROLOPERATIVO_ID ");
		sqlSb.append("               AND CT.FECCORRIDA = CR.FECCORRIDA ");
		sqlSb.append("               AND CT.CORRIDA_ID = CR.CORRIDA_ID ");
		sqlSb.append("               AND CR.EMPRESACORRIDA_ID = :EMPRESA_ID ");
		sqlSb.append("               AND TR.TRAMO_ID = CT.TRAMO_ID ");
		sqlSb.append("               AND BO.FECCORRIDA = CT.FECCORRIDA ");
		sqlSb.append("               AND BO.ORIGEN_ID = CTO.ORIGEN_ID ");
		sqlSb.append("               AND BO.DESTINO_ID = CTD.DESTINO_ID  ");
		sqlSb.append("               AND CTD.CORRIDA_ID = CT.CORRIDA_ID  ");
		sqlSb.append("               AND BO.CORRIDA_ID = CT.CORRIDA_ID ");
		sqlSb.append("               AND CTD.FECCORRIDA = CT.FECCORRIDA ");
		sqlSb.append("               AND CTO.CORRIDA_ID = CT.CORRIDA_ID ");
		sqlSb.append("               AND CTO.FECCORRIDA = CT.FECCORRIDA ");
		sqlSb.append("               AND CTO.ACTIVO = 1 ");
		sqlSb.append("               AND CTD.ACTIVO = 1 ");
		sqlSb.append("               AND CT.NUMSECUENCIA BETWEEN CTO.NUMSECUENCIA AND CTD.NUMSECUENCIA  ");
		sqlSb.append("               AND BO.ACTIVO = 1 ");
		sqlSb.append("               AND (BO.MOTIVOCANCELACION_ID IS NULL OR ");
		sqlSb.append("                    BO.MOTIVOCANCELACION_ID = 0 AND BO.CATEGORIA_ID <> :CRIANCA_ID) ");
		sqlSb.append("             GROUP BY CT.TRAMO_ID, TR.CANTKMREAL), 2) * TAB.EXTENSAO_KM PAX_KM ");
		sqlSb.append("     FROM (SELECT RT.INDSENTIDOIDA, CR.FECCORRIDA, ");										
		sqlSb.append("                  RT.RUTA_ID, ");
		sqlSb.append("                  RT.NUMRUTA, ");
		sqlSb.append("                  RT.DESCRUTA, ");
		sqlSb.append("                  CR.ROLOPERATIVO_ID, ");
		if (parametros.get("SOMAR_KM_RODADOS_POR").equals("SEQUENCIA")) { 
			sqlSb.append("                 (SELECT SUM(NVL(RS.KMORIGINAL,0)) ");
		}else { 
			sqlSb.append("                 (SELECT SUM(NVL(TR.CANTKMREAL,0))  ");
		}
		sqlSb.append("                    FROM RUTA_SECUENCIA RS, TRAMO TR  ");
		sqlSb.append("                   WHERE RS.RUTA_ID = RT.RUTA_ID ");
		sqlSb.append("                     AND RS.TRAMO_ID = TR.TRAMO_ID ");
		sqlSb.append("                     AND  RS.ACTIVO =1           ");
		sqlSb.append("                     AND  TR.ACTIVO =1           ");
		sqlSb.append("                 ) EXTENSAO_KM,");
		sqlSb.append("                 COUNT(1) PASSAGEIROS,           ");
		sqlSb.append("                 COUNT(DISTINCT CR.FECCORRIDA || CR.CORRIDA_ID) VIAGENS ");
		sqlSb.append("                 FROM RUTA RT, BOLETO BL, CORRIDA CR  ");
		sqlSb.append("           WHERE RT.RUTA_ID = CR.RUTA_ID         ");
		sqlSb.append("             AND CR.FECCORRIDA = BL.FECCORRIDA ");
		sqlSb.append("             AND CR.CORRIDA_ID = BL.CORRIDA_ID   ");
		sqlSb.append("             AND BL.MOTIVOCANCELACION_ID IS NULL ");
		sqlSb.append("             AND BL.INDSTATUSOPERACION = 'F'     ");
		sqlSb.append("             AND BL.ACTIVO = 1 ");
		sqlSb.append("             AND CR.ACTIVO = 1 ");
		if(rutaId!=null) {
			sqlSb.append(" AND CR.RUTA_ID = :RUTA_ID  ");
		}
		sqlSb.append("             AND CR.EMPRESACORRIDA_ID = :EMPRESA_ID ");
		if (grupoRutaId!=null) {
			sqlSb.append("             AND RT.GRUPORUTA_ID = :GRUPORUTA_ID ");
		}
		
		sqlSb.append("             AND CR.FECCORRIDA BETWEEN TO_DATE(:DATA_INICIAL, 'DD/MM/YY hh24:mi:ss') AND TO_DATE(:DATA_FINAL, 'DD/MM/YY hh24:mi:ss') ");
		sqlSb.append("           GROUP BY RT.INDSENTIDOIDA, CR.FECCORRIDA,");
		sqlSb.append("                 RT.RUTA_ID,   ");
		sqlSb.append("                 RT.NUMRUTA,   ");
		sqlSb.append("                 RT.DESCRUTA,  ");
		sqlSb.append("                 CR.ROLOPERATIVO_ID) TAB	");
		sqlSb.append("  WHERE NVL(TAB.EXTENSAO_KM,0) != 0 ");
		return sqlSb.toString();

	}
	
	private String buscarConstante(String nomeConstante) {
		ConstanteService constanteService = (ConstanteService) AppContext.getApplicationContext().getBean("constanteService");
		return constanteService.buscarPorNomeConstante(nomeConstante).getValorconstante();
	}
	
	public void setLsDadosRelatorio(List<RelatorioResumoLinhasBean> lsDadosRelatorio) {
		this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio));
		this.lsDadosRelatorio = lsDadosRelatorio;
	}
}	
