package com.rjconsultores.ventaboletos.relatorios.impl;

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

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

public class RelatorioPricingEspecifico extends Relatorio {
	
	public RelatorioPricingEspecifico(Map<String, Object> parametros, Connection conexao) throws Exception {
		
		super(parametros, conexao);
		
		this.setCustomDataSource(new ArrayDataSource(this) {

			public void initDados() throws Exception {
				Connection conexao = this.relatorio.getConexao();
				Map<String, Object> parametros = this.relatorio.getParametros();

				String sql = getSql(parametros);

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

				while (rset.next()) {
					Map<String, Object> dataResult = new HashMap<String, Object>();

					dataResult.put("PRICINGESPECIFICO_ID", rset.getInt("PRICINGESPECIFICO_ID"));
					dataResult.put("NOMBPRICING", rset.getString("NOMBPRICING"));	
					dataResult.put("DATAINICIOVIAGEM", rset.getTimestamp("DATAINICIOVIAGEM"));
					dataResult.put("DATAFIMVIAGEM", rset.getTimestamp("DATAFIMVIAGEM"));	
					dataResult.put("DATAINICIOVENDA", rset.getTimestamp("DATAINICIOVENDA"));	
					dataResult.put("DATAFIMVENDA", rset.getTimestamp("DATAFIMVENDA"));
					dataResult.put("CORRIDA_ID", rset.getObject("CORRIDA_ID") == null ? null : rset.getInt("CORRIDA_ID"));
					dataResult.put("DESCCLASE", rset.getString("DESCCLASE"));	
					dataResult.put("DESCMARCA", rset.getString("DESCMARCA"));	
					dataResult.put("ORIGEM", rset.getString("ORIGEM"));	
					dataResult.put("DESTINO", rset.getString("DESTINO"));	
					dataResult.put("MOEDA", rset.getString("MOEDA"));
					dataResult.put("TARIFAVOLTA", rset.getBigDecimal("TARIFAVOLTA"));
					dataResult.put("EXIBEVENDA", rset.getBoolean("EXIBEVENDA"));
					dataResult.put("OCUPACAO", rset.getString("OCUPACAO"));
					dataResult.put("DIASSEMANA", rset.getString("DIASSEMANA"));
					dataResult.put("CATEGORIAS", rset.getString("CATEGORIAS"));
					dataResult.put("PONTOSDEVENDA", rset.getString("PONTOSDEVENDA"));
					dataResult.put("CANALDEVENDA", rset.getString("CANALDEVENDA"));
					
					this.dados.add(dataResult);
				}

				this.resultSet = rset;
			}
		});
	}
	
	@Override
	protected void processaParametros() throws Exception {
	}

	private String getSql(Map<String, Object> parametros) {
		StringBuilder sql = new StringBuilder();

		String formatoData = ("'dd/MM/yyyy hh24:mi:ss'");
		SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");

		Date DATA_INICIO_VIAGEM = (Date) parametros.get("DATA_INICIO_VIAGEM");
		Date DATA_FIM_VIAGEM = (Date) parametros.get("DATA_FIM_VIAGEM");
		
		Date DATA_INICIO_VENDA = (Date) parametros.get("DATA_INICIO_VENDA");
		Date DATA_FIM_VENDA = (Date) parametros.get("DATA_FIM_VENDA");

		String NOMBPRICING = (String) parametros.get("NOMBPRICING");
		
		Integer ORIGEM = (Integer) parametros.get("ORIGEM");
		Integer DESTINO = (Integer) parametros.get("DESTINO");
		
		Integer MARCA_ID = (Integer) parametros.get("MARCA_ID");
		Integer TIPO_PASSAGEIRO = (Integer) parametros.get("TIPO_PASSAGEIRO");
		Integer TIPO_CLASSE = (Integer) parametros.get("TIPO_CLASSE");
		Integer CANAL_DE_VENDA = (Integer) parametros.get("CANAL_DE_VENDA");
		Integer CORRIDA_ID = (Integer) parametros.get("CORRIDA_ID");
		
		String puntoVentas = (String) parametros.get("NUMPUNTOVENTA");
		
		Boolean domingo = (Boolean) parametros.get("DOMINGO");
		Boolean segunda = (Boolean) parametros.get("SEGUNDA");
		Boolean terca = (Boolean) parametros.get("TERCA");
		Boolean quarta = (Boolean) parametros.get("QUARTA");
		Boolean quinta = (Boolean) parametros.get("QUINTA");
		Boolean sexta = (Boolean) parametros.get("SEXTA");
		Boolean sabado = (Boolean) parametros.get("SABADO");
		
		Double tarifaVolta = (Double) parametros.get("TARIFAVOLTA");
		
		Integer ocupacaoInicial = (Integer) parametros.get("OCUPACAOINICIAL");
		Integer ocupacaoFinal = (Integer) parametros.get("OCUPACAOFINAL");
		
		Double tarifaOcupacao = (Double) parametros.get("TARIFAOCUPACAO");
		Double descontoOcupacao = (Double) parametros.get("DESCONTOOCUPACAO");
		
		sql.append(" SELECT  ");
		sql.append("	PE.PRICINGESPECIFICO_ID, PE.NOMBPRICING, PE.DATAINICIOVIAGEM, PE.DATAFIMVIAGEM, PE.DATAINICIOVENDA, PE.DATAFIMVENDA, ");
		sql.append("	PE.CORRIDA_ID, cs.DESCCLASE, m.DESCMARCA, ORIGEM.DESCPARADA as ORIGEM, DESTINO.DESCPARADA as DESTINO, ");
		sql.append("	MOEDA.DESCMONEDA AS MOEDA, pe.tarifaredabierto AS TARIFAVOLTA, PE.EXIBEVENDA, ");
		
		//Subquery ocupacao
		sql.append("	( SELECT");
		sql.append("		LISTAGG(PEO.OCUPACIONINICIAL || ' a ' || PEO.OCUPACIONFINAL || ', ' || CASE WHEN PEO.TARIFA IS NULL THEN 'Desconto: ' ||PEO.DESCUENTO ELSE 'Tarifa: ' || PEO.TARIFA END, '; ' ) ");
		sql.append("		WITHIN GROUP (ORDER BY PEO.PRICINGESPECIFICO_ID)  OCUPACAO "); 
	    sql.append("	  FROM  ");
		sql.append("		 PRICING_ESPECIFICO_OCUPACION PEO  ");
		sql.append("	  WHERE  ");
		sql.append("		PEO.ACTIVO = 1 AND PEO.PRICINGESPECIFICO_ID = PE.PRICINGESPECIFICO_ID) AS OCUPACAO, ");
		
		//Dias da semana
		sql.append("	( CASE WHEN PE.DOMINGO = 0 THEN '' ELSE 'Dom,' END ||  ");
		sql.append("	  CASE WHEN PE.SEGUNDA = 0 THEN '' ELSE 'Seg,' END ||  ");
		sql.append("	  CASE WHEN PE.TERCA   = 0 THEN '' ELSE 'Ter,' END ||  "); 
	    sql.append("	  CASE WHEN PE.QUARTA  = 0 THEN '' ELSE 'Qua,' END ||  ");
		sql.append("	  CASE WHEN PE.QUINTA  = 0 THEN '' ELSE 'Qui,' END ||  ");
		sql.append("	  CASE WHEN PE.SEXTA   = 0 THEN '' ELSE 'Sex,' END ||  ");
		sql.append("	  CASE WHEN PE.SABADO  = 0 THEN '' ELSE 'Sab' END ) AS DIASSEMANA,");
		
		//Subquery categorias
		sql.append("	 ( SELECT");
		sql.append("	 	LISTAGG(CA.DESCCATEGORIA, '; ' ) WITHIN GROUP (ORDER BY PEC.PRICINGESPECIFICO_ID)  OCUPACAO ");
		sql.append("	  FROM ");
		sql.append("	  	PRICING_ESPECIFICO_CATEGORIA PEC INNER JOIN ");
		sql.append("	  	CATEGORIA CA ON PEC.CATEGORIA_ID = CA.CATEGORIA_ID ");
		sql.append("	  WHERE ");
		sql.append("	  	PEC.ACTIVO = 1 AND PEC.PRICINGESPECIFICO_ID = PE.PRICINGESPECIFICO_ID) AS CATEGORIAS, ");
		
		//Subquery pontos de venda
		sql.append("	 ( SELECT  ");
		sql.append("	  	LISTAGG(PTV.NOMBPUNTOVENTA, '; ' ) WITHIN GROUP (ORDER BY PEPV.PRICINGESPECIFICO_ID)  OCUPACAO ");
		sql.append("	   FROM ");
		sql.append("	  	PRICING_ESP_PUNTO_VENTA PEPV INNER JOIN ");
		sql.append("	  	PUNTO_VENTA PTV ON PEPV.PUNTOVENTA_ID = PTV.PUNTOVENTA_ID ");
		sql.append("	   WHERE ");
		sql.append("	  	PEPV.ACTIVO = 1 AND PEPV.PRICINGESPECIFICO_ID = PE.PRICINGESPECIFICO_ID) AS PONTOSDEVENDA, ");
		
		//Subquery canal de venda
		sql.append("     ( SELECT  ");
		sql.append("      	LISTAGG(TPV.DESCTIPO, '; ' ) WITHIN GROUP (ORDER BY PECV.PRICINGESPECIFICO_ID)  OCUPACAO ");
		sql.append("       FROM ");
		sql.append("      	PRICING_ESP_CANAL_VENTA PECV INNER JOIN ");
		sql.append("      	TIPO_PTOVTA TPV ON PECV.TIPOPTOVTA_ID = TPV.TIPOPTOVTA_ID ");
		sql.append("       WHERE  ");
		sql.append("      	PECV.ACTIVO = 1 AND PECV.PRICINGESPECIFICO_ID = PE.PRICINGESPECIFICO_ID) AS CANALDEVENDA ");
		
		sql.append(" FROM    ");
		sql.append(" 	PRICING_ESPECIFICO PE LEFT JOIN     ");
		sql.append("    CLASE_SERVICIO CS ON PE.CLASESERVICIO_ID = CS.CLASESERVICIO_ID LEFT JOIN  ");
		sql.append("    MARCA M ON PE.MARCA_ID = M.MARCA_ID LEFT JOIN ");
		sql.append("    PARADA ORIGEM ON PE.ORIGEN_ID = ORIGEM.PARADA_ID LEFT JOIN  ");
		sql.append("    PARADA DESTINO ON PE.DESTINO_ID = DESTINO.PARADA_ID LEFT JOIN  ");
		sql.append("    MONEDA MOEDA ON PE.MONEDA_ID = MOEDA.MONEDA_ID  ");
		sql.append(" WHERE   ");
		sql.append(" 	PE.ACTIVO = 1    ");
		
		if(domingo != null && domingo == true) {
			sql.append(" AND PE.DOMINGO <> 0 ");
		} else if(domingo != null) {
			sql.append(" AND PE.DOMINGO = 0");
		}
		
		if(segunda != null && segunda == true) {
			sql.append(" AND PE.SEGUNDA <> 0 ");
		} else if(segunda != null) {
			sql.append(" AND PE.SEGUNDA = 0");
		}
		
		if(terca != null && terca == true) {
			sql.append(" AND PE.TERCA <> 0 ");
		} else if(terca != null) {
			sql.append(" AND PE.TERCA = 0");
		}
		
		if(quarta != null && quarta == true) {
			sql.append(" AND PE.QUARTA <> 0 ");
		} else if(quarta != null) {
			sql.append(" AND PE.QUARTA = 0");
		}
		
		if(quinta != null && quinta == true) {
			sql.append(" AND PE.QUINTA <> 0 ");
		} else if(quinta != null) {
			sql.append(" AND PE.QUINTA = 0");
		}
		
		if(sexta != null && sexta == true) {
			sql.append(" AND PE.SEXTA <> 0 ");
		} else if(sexta != null) {
			sql.append(" AND PE.SEXTA = 0");
		}
		
		if(sabado != null && sabado == true) {
			sql.append(" AND PE.SABADO <> 0 ");
		} else if(sabado != null) {
			sql.append(" AND PE.SABADO = 0");
		}
		
		if(tarifaVolta != null) {
			sql.append(" AND pe.TARIFAREDABIERTO = ").append(tarifaVolta);
		}
		
		if(ocupacaoInicial != null && ocupacaoFinal != null ) {
			sql.append(" AND	( SELECT  					 "); 
			sql.append("		COUNT(PEO.PRICINGESPECIFICOOCUPACION_ID) "); 
		    sql.append("	  FROM  ");
			sql.append("		 PRICING_ESPECIFICO_OCUPACION PEO  ");
			sql.append("	  WHERE  ");
			sql.append("		PEO.ACTIVO = 1 AND PEO.PRICINGESPECIFICO_ID = PE.PRICINGESPECIFICO_ID");
			
			if(tarifaOcupacao != null) {
				sql.append("	AND	PEO.TARIFA = ").append(tarifaOcupacao);
			}
			
			if(descontoOcupacao != null) {
				sql.append("	AND	PEO.DESCUENTO = ").append(descontoOcupacao);
			}
			
			sql.append("	    AND ").append(ocupacaoInicial).append(" BETWEEN PEO.OCUPACIONINICIAL AND PEO.OCUPACIONFINAL  ");
			sql.append("	    AND ").append(ocupacaoFinal).append(" BETWEEN PEO.OCUPACIONINICIAL AND PEO.OCUPACIONFINAL ) > 0  ");
		}
				
		if (CANAL_DE_VENDA != null ) {
			sql.append("  AND ").append(CANAL_DE_VENDA).append(" in ");
			sql.append("     ( SELECT PECV.TIPOPTOVTA_ID  ");
			sql.append("       FROM ");
			sql.append("      	PRICING_ESP_CANAL_VENTA PECV ");
			sql.append("       WHERE  ");
			sql.append("      	PECV.ACTIVO = 1 AND PECV.PRICINGESPECIFICO_ID = PE.PRICINGESPECIFICO_ID) ");
		}
		
		if (TIPO_PASSAGEIRO != null ) {
			sql.append("  AND ").append(TIPO_PASSAGEIRO).append(" IN ");
			sql.append("	 ( SELECT");
			sql.append("	 	PEC.CATEGORIA_ID ");
			sql.append("	  FROM ");
			sql.append("	  	PRICING_ESPECIFICO_CATEGORIA PEC  ");
			sql.append("	  WHERE ");
			sql.append("	  	PEC.ACTIVO = 1 AND PEC.PRICINGESPECIFICO_ID = PE.PRICINGESPECIFICO_ID) ");
		}
		
		if (puntoVentas != null && !puntoVentas.isEmpty()) {
			sql.append("  AND ");
			sql.append("	 ( SELECT  ");
			sql.append("	  	COUNT(PEPV.PUNTOVENTA_ID) ");
			sql.append("	   FROM ");
			sql.append("	  	PRICING_ESP_PUNTO_VENTA PEPV ");
			sql.append("	   WHERE ");
			sql.append("	  	PEPV.ACTIVO = 1 AND PEPV.PRICINGESPECIFICO_ID = PE.PRICINGESPECIFICO_ID ");
			sql.append("	  	AND PEPV.PUNTOVENTA_ID IN (" + puntoVentas + ") ) > 0 ");
		}
		
		if (NOMBPRICING != null) {
			sql.append(" AND PE.NOMBPRICING LIKE '" + NOMBPRICING + "' ");
		}
		
		if (DATA_INICIO_VIAGEM != null && DATA_FIM_VIAGEM != null) {
			sql.append(" AND PE.DATAINICIOVIAGEM BETWEEN TO_DATE('" + format.format(DATA_INICIO_VIAGEM) +"', "+ formatoData + ") AND TO_DATE('" + format.format(DATA_FIM_VIAGEM) +"', "+ formatoData + ") ");
			sql.append(" AND PE.DATAFIMVIAGEM BETWEEN TO_DATE('" + format.format(DATA_INICIO_VIAGEM) +"', "+ formatoData + ") AND TO_DATE('" + format.format(DATA_FIM_VIAGEM) +"', "+ formatoData + ") ");
		}
		
		if (DATA_INICIO_VENDA != null && DATA_FIM_VENDA != null) {
			sql.append(" AND PE.DATAINICIOVENDA BETWEEN TO_DATE('" + format.format(DATA_INICIO_VENDA) +"', "+ formatoData + ") AND TO_DATE('" + format.format(DATA_FIM_VENDA) +"', "+ formatoData + ") ");
			sql.append(" AND PE.DATAFIMVENDA BETWEEN TO_DATE('" + format.format(DATA_INICIO_VENDA) +"', "+ formatoData + ") AND TO_DATE('" + format.format(DATA_FIM_VENDA) +"', "+ formatoData + ") ");
		}
				
		if (ORIGEM != null ) {
			sql.append(" AND ORIGEM.PARADA_ID = " + ORIGEM );
		}
		
		if (DESTINO != null ) {
			sql.append(" AND DESTINO.PARADA_ID = " + DESTINO );
		}
		
		if (MARCA_ID != null ) {
			sql.append(" AND PE.MARCA_ID = " + MARCA_ID );
		}
		
		if (TIPO_CLASSE != null ) {
			sql.append(" AND PE.CLASESERVICIO_ID = ").append(TIPO_CLASSE);
		}
		
		if (CORRIDA_ID != null ) {
			sql.append(" AND PE.CORRIDA_ID = " + CORRIDA_ID );
		}
		
		sql.append("  ORDER BY    ");
		sql.append("  	PE.PRICINGESPECIFICO_ID    ");
		
		return sql.toString();
	}
}
