package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

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

public class RelatorioDescontosTipo2 extends Relatorio {
	
	List<HashMap<String, Object>> dadosRelatorio = new ArrayList<HashMap<String, Object>>();

	public RelatorioDescontosTipo2(Map<String, Object> parametros, Connection conexao) throws Exception {
		super(parametros, conexao);
		
		setCustomDataSource(new DataSource(this){
			@Override
			public void initDados() throws Exception {
				Connection coneConnection = relatorio.getConexao();
				Map<String, Object> parametros = relatorio.getParametros();
				
				Integer idPuntoVenta = (Integer) parametros.get("idPuntoVenta");
				Timestamp fecVentaInicial = new Timestamp((DateUtil.inicioFecha((Date) parametros.get("fecVentaInicial"))).getTime());
				Timestamp fecVentaFinal = new Timestamp((DateUtil.fimFecha((Date) parametros.get("fecVentaFinal"))).getTime());
				String codconvenio = (String) parametros.get("codconvenio");
				
				Integer tipoPuntoVenta = (Integer) parametros.get("tipoPuntoVenta");
				
				String query = getQuery(idPuntoVenta, codconvenio, tipoPuntoVenta);
				System.out.println(query);
				
				NamedParameterStatement statement = new NamedParameterStatement(coneConnection, query);
				statement.setTimestamp("fecVentaInicial", fecVentaInicial);
				statement.setTimestamp("fecVentaFinal", fecVentaFinal);
				
				if(idPuntoVenta != null && idPuntoVenta != -1) {
					statement.setInt("idPuntoVenta", idPuntoVenta);
				}
				if(codconvenio != null && !codconvenio.isEmpty()) {
					statement.setString("codconvenio", codconvenio);
				}
				
				if (tipoPuntoVenta != null && tipoPuntoVenta != -1) {
					statement.setInt("tipoPuntoVenta", tipoPuntoVenta);
		  		}
		
				ResultSet resultSet = statement.executeQuery();
				
				preencherDadosRelatorio(resultSet);
			}


		});
	}

	private void preencherDadosRelatorio(ResultSet resultSet) throws SQLException {
		while (resultSet.next()) {
			HashMap<String, Object> singleData  = new HashMap<String, Object>();
			singleData.put("codConvenio", resultSet.getString("codConvenio"));
			singleData.put("nomeAgencia", resultSet.getString("nomeAgencia"));
			singleData.put("dataEmissao", resultSet.getDate("dataEmissao"));
			singleData.put("dataViagem", resultSet.getTimestamp("dataViagem"));
			singleData.put("codServico", resultSet.getString("codServico"));
			singleData.put("codOrigem", resultSet.getString("codOrigem"));
			singleData.put("codDestino", resultSet.getString("codDestino"));
			singleData.put("tarifaComDesconto", resultSet.getDouble("tarifaComDesconto"));
			singleData.put("tut", resultSet.getDouble("tut"));
			singleData.put("pedagio", resultSet.getDouble("pedagio"));
			singleData.put("nomepassageiro", resultSet.getString("nomepassageiro"));
			singleData.put("documento", resultSet.getString("documento"));
			singleData.put("bilheteiro", resultSet.getString("bilheteiro"));
			singleData.put("empresacorrida", resultSet.getInt("empresacorrida"));
			singleData.put("empresa", resultSet.getString("empresa"));
			singleData.put("CANAL_DE_VENDA", resultSet.getString("CANAL_DE_VENDA"));
			singleData.put("email", resultSet.getString("email"));
			singleData.put("telefone", resultSet.getString("telefone"));
			dadosRelatorio.add(singleData);
		}		
		
		if(!dadosRelatorio.isEmpty()) {
			setCollectionDataSource(new JRBeanCollectionDataSource(dadosRelatorio));
		}
	}

	private String getQuery(Integer idPuntoVenta, String codconvenio, Integer tipoPuntoVenta) {
		
      String query =  " SELECT "
    		  
			+ "   (CONV.CVECONVENIO  || ' - ' || CONV.DESCCONVENIO) AS codConvenio, " 
			+ "   PUNT_V.NOMBPUNTOVENTA   AS nomeAgencia, "
			+ "   BOL.FECHORVENTA         AS dataEmissao, "
			+ "   BOL.FECHORVIAJE         AS dataViagem, "
			+ "   BOL.CORRIDA_ID          AS codServico, "
			+ "   ORIG.CVEPARADA          AS codOrigem, "
			+ "   DEST.CVEPARADA          AS codDestino, "
				
			+ " (case     "
			+ "	  when ( bol.indcancelacion = 1 )  "
			+ "	         then (-1 *(Abs(  BOL.PRECIOPAGADO ) ))  "
			+ "	  else  "
			+ "	      	 BOL.PRECIOPAGADO "
			+ "  END)  				      AS tarifaComDesconto, "
			
			
			+ " (case     "
			+ "	  when ( bol.indcancelacion = 1 )  "
			+ "	        then (-1 *(Abs( BOL.IMPORTETAXAEMBARQUE ) ))  "
			+ "	else  "
			+ "	        BOL.IMPORTETAXAEMBARQUE  "
			+ "  END)          				  AS tut,  "

			+ " (case     "
			+ "	 when ( bol.indcancelacion = 1 )       "
			+ "	        then (-1 *(Abs(  BOL.IMPORTEPEDAGIO  ) ))  "
			+ "	 else   "
			+ "	        BOL.IMPORTEPEDAGIO 					 "	
			+ " END)     					  AS pedagio,   "
			
			+ "   BOL.NOMBPASAJERO        AS nomepassageiro, " 
			+ "   BOL.DESCNUMDOC          AS documento," 
			+ "   U.CVEUSUARIO           AS bilheteiro, "	
			+ "   BOL.EMPRESACORRIDA_ID   AS empresacorrida, " 
			+ "   EMP.NOMBEMPRESA         AS empresa, "
			
			+ "   TPVTA.desctipo         AS CANAL_DE_VENDA, "
			+ "   BOL.DESCCORREO             AS email, "
			+ "   BOL.DESCTELEFONO           AS telefone "
			
			+ " FROM BOLETO BOL "
			+ " JOIN CONVENIO_DET CONV_D ON CONV_D.CONVENIODET_ID = BOL.CONVENIODET_ID "
			+ " JOIN CONVENIO       CONV ON CONV.CONVENIO_ID      = CONV_D.CONVENIO_ID "
			+ " JOIN PUNTO_VENTA  PUNT_V ON PUNT_V.PUNTOVENTA_ID  = BOL.PUNTOVENTA_ID "
			+ " JOIN TIPO_PTOVTA TPVTA ON PUNT_V.TIPOPTOVTA_ID = TPVTA.TIPOPTOVTA_ID "
			
			+ " JOIN PARADA         ORIG ON ORIG.PARADA_ID        = BOL.ORIGEN_ID "
			+ " JOIN PARADA         DEST ON DEST.PARADA_ID        = BOL.DESTINO_ID "
			+ " INNER JOIN USUARIO U ON U.USUARIO_ID              = BOL.USUARIO_ID " 
			+ " JOIN EMPRESA        EMP ON EMP.EMPRESA_ID         = BOL.EMPRESACORRIDA_ID "
			+ " WHERE "
			+ " BOL.INDSTATUSOPERACION	= 'F' "
			+ " AND BOL.ACTIVO 			= 1 "			
			+ " AND BOL.FECHORVENTA BETWEEN :fecVentaInicial AND :fecVentaFinal ";
		
		if(!((String)parametros.get("EMPRESAIDS")).equals("")){
			query +=" AND BOL.EMPRESACORRIDA_ID IN ( " + (String)parametros.get("EMPRESAIDS") + ")" ;	
		}				
  
  		if(idPuntoVenta != null && idPuntoVenta != -1) {
  			query += " AND (BOL.PUNTOVENTA_ID = :idPuntoVenta) ";
  		}
  		if (codconvenio != null && !codconvenio.isEmpty()) {
  			query += " AND (CONV.CVECONVENIO  = :codconvenio)";
  		}
  		
  		if (tipoPuntoVenta != null && tipoPuntoVenta != -1) {
  			query += " AND (PUNT_V.TIPOPTOVTA_ID = :tipoPuntoVenta)";
  		}

  		query += " ORDER BY BOL.EMPRESACORRIDA_ID, (CONV.CVECONVENIO  || ' - ' || CONV.DESCCONVENIO)";

  		return query;
	}
	
	@Override
	protected void processaParametros() throws Exception {}
}