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

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Timestamp;
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.IndStatusBoleto;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

/**
 * @author Thiago
 *
 */
public class RelatorioBilhetesVendidosFiltroFormaPagamento extends Relatorio {


	private static final String DATA_VENDA = "DATA_VENDA";
	private static final String DATA_FINAL = "DATA_FINAL";
	private static final String DATA_INICIAL = "DATA_INICIAL";
	private static final String TIPO_DATA = "TIPO_DATA";
	private static final String FORMA_PAGO = "FORMAPAGO_ID";

	public RelatorioBilhetesVendidosFiltroFormaPagamento(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();

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

				stmt.setInt("EMPRESA_ID", Integer.valueOf(parametros.get("EMPRESA_ID").toString()));
				if (parametros.get(DATA_INICIAL) != null && parametros.get(DATA_FINAL) != null){
					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()));
				}
				if(parametros.get(FORMA_PAGO) != null) {
					stmt.setInt("FORMAPAGO_ID", Integer.valueOf(parametros.get(FORMA_PAGO).toString()));
				}
				ResultSet rset = stmt.executeQuery();

				while (rset.next()) {

					Map<String, Object> dataResult = new HashMap<String, Object>();

					dataResult.put("NUMERO_PASSAGEM", rset.getString("NUMERO_PASSAGEM"));
					if (rset.getString("SERIE") != null) {
						if (rset.getString("SERIE").split("-").length == 1) {
							dataResult.put("SERIE", rset.getString("SERIE"));
						} else {
							dataResult.put("SERIE", rset.getString("SERIE").split("-")[0]);
							dataResult.put("SUB_SERIE", rset.getString("SERIE").split("-")[1]);
						}
					}
					dataResult.put("CVEBILHETEIRO", rset.getString("CVEBILHETEIRO"));
					dataResult.put("CVEBILHETEIRO_CANCELADO", rset.getString("CVEBILHETEIRO_CANCELADO"));
					dataResult.put("IMPRESSAO_POSTERIOR", rset.getString("IMPRESSAO_POSTERIOR"));
					dataResult.put("PRE_IMPRESSO", rset.getString("PRE_IMPRESSO"));
					dataResult.put("COD_ORIGEM", rset.getString("COD_ORIGEM"));
					dataResult.put("ORIGEM", rset.getString("ORIGEM"));
					dataResult.put("COD_DESTINO", rset.getString("COD_DESTINO"));
					dataResult.put("DESTINO", rset.getString("DESTINO"));
					dataResult.put("NOME_AGENCIA", rset.getString("NOME_AGENCIA"));
					dataResult.put("COD_AGENCIA", rset.getString("COD_AGENCIA"));
					dataResult.put(DATA_VENDA, rset.getDate(DATA_VENDA));
					dataResult.put("DATA_EMISSAO", rset.getDate("DATA_EMISSAO"));
					dataResult.put("DATA_VIAGEM", rset.getDate("DATA_VIAGEM"));
					dataResult.put("SERVICO", rset.getString("SERVICO"));
					dataResult.put("HORA", rset.getString("HORA"));
					dataResult.put("NUMASIENTO", rset.getString("NUMASIENTO"));
					dataResult.put("CATEGORIA", rset.getString("CATEGORIA"));
					dataResult.put("SENTIDO", rset.getInt("SENTIDO"));
					dataResult.put("COD_LINHA", rset.getString("COD_LINHA"));
					dataResult.put("DESC_LINHA", rset.getString("DESC_LINHA"));
					if (rset.getString("STATUS_PASSAGEM") != null) {
						dataResult.put("STATUS_PASSAGEM", IndStatusBoleto.valueOf(rset.getString("STATUS_PASSAGEM")).getValue());
					}
					dataResult.put("TARIFA", rset.getString("TARIFA"));
					dataResult.put("TX_EMBARQUE", rset.getString("TX_EMBARQUE"));
					dataResult.put("PEDAGIO", rset.getString("PEDAGIO"));
					dataResult.put("SEGURO", rset.getString("SEGURO"));
					dataResult.put("BILHETEIRO", rset.getString("BILHETEIRO"));
					dataResult.put("BILHETEIRO_CANCELAMENTO", rset.getString("BILHETEIRO_CANCELAMENTO"));
					dataResult.put("PASSAGEIRO", rset.getString("PASSAGEIRO"));
					dataResult.put("DOC", rset.getString("DOC"));
					dataResult.put("LOCALIZADOR", rset.getString("LOCALIZADOR"));
					dataResult.put("FORMA_PAGAMENTO", rset.getString("FORMA_PAGAMENTO"));

					this.dados.add(dataResult);

				}

				this.resultSet = rset;
			}

			
		});
	}
	
	private StringBuilder getSQL(Map<String, Object> parametros) {
		StringBuilder sql = new StringBuilder();
		
		if (parametros.get("IDAVOLTA").equals("1")) {
			sql.append(" select distinct ");
			sql.append(" u.CVEUSUARIO CVEBILHETEIRO, ");
			sql.append(" uc.CVEUSUARIO CVEBILHETEIRO_CANCELADO, ");
			sql.append(" B.indstatusboleto IMPRESSAO_POSTERIOR, ");
			sql.append(" B.NUMFOLIOSISTEMA NUMERO_PASSAGEM, ");
			sql.append(" B.NUMSERIEPREIMPRESA SERIE, ");
			sql.append(" B.NUMSERIEPREIMPRESA SUB_SERIE, ");
            sql.append(" B.NUMFOLIOPREIMPRESO PRE_IMPRESSO, ");
            sql.append(" p_origen.PARADA_ID COD_ORIGEM, ");
            sql.append(" p_origen.DESCPARADA ORIGEM, ");
            sql.append(" p_destino.PARADA_ID COD_DESTINO, ");
            sql.append(" p_destino.DESCPARADA DESTINO, ");
            sql.append(" pv.NUMPUNTOVENTA COD_AGENCIA, ");
            sql.append(" pv.NOMBPUNTOVENTA NOME_AGENCIA, ");
            sql.append(" CASE WHEN B.indstatusboleto = 'E' THEN utilizado.fechorventa_h  ELSE B.fechorventa_h END DATA_VENDA, ");
            sql.append(" CASE WHEN b.fechorventa  is null THEN utilizado.fechorventa ELSE b.fechorventa_h END DATA_EMISSAO, ");
            sql.append(" B.fechorviaje DATA_VIAGEM, ");
            sql.append(" B.CORRIDA_ID SERVICO, ");
            sql.append(" to_char(B.fechorviaje, 'hh24:mi:ss') HORA, ");
            sql.append(" B.NUMASIENTO NUMASIENTO, ");
            sql.append(" ct.DESCCATEGORIA CATEGORIA, ");
            sql.append(" R.INDSENTIDOIDA SENTIDO, ");
            sql.append(" R.NUMRUTA COD_LINHA, ");
            sql.append(" R.DESCRUTA DESC_LINHA, ");
            sql.append(" CASE WHEN b.MOTIVOCANCELACION_ID IS NULL THEN 'V' ELSE 'C' END STATUS_PASSAGEM, ");
            sql.append(" B.PRECIOPAGADO TARIFA, ");
            sql.append(" B.IMPORTETAXAEMBARQUE TX_EMBARQUE, ");
            sql.append(" B.IMPORTEPEDAGIO PEDAGIO, ");
            sql.append(" B.IMPORTESEGURO SEGURO, ");
            sql.append(" u.NOMBUSUARIO BILHETEIRO, ");
            sql.append(" uc.NOMBUSUARIO BILHETEIRO_CANCELAMENTO, ");
            sql.append(" B.NOMBPASAJERO AS PASSAGEIRO, ");
            sql.append(" B.DESCNUMDOC AS DOC, ");
            sql.append(" COALESCE(b.NUMOPERACION, bo.NUMOPERACION) AS LOCALIZADOR, ");
    		sql.append("(SELECT distinct LISTAGG(formaPago.DESCPAGO, ',') WITHIN GROUP (ORDER BY formaPago.DESCPAGO) ");
    		sql.append("FROM CAJA caja2 ");
    		sql.append("INNER JOIN CAJA_FORMAPAGO cajaFormaPago ON cajaFormaPago.CAJA_ID = caja2.CAJA_ID ");
    		sql.append("INNER JOIN FORMA_PAGO formaPago ON formaPago.FORMAPAGO_ID = cajaFormaPago.FORMAPAGO_ID ");
    		sql.append("WHERE caja2.CAJA_ID = b.CAJA_ID) AS FORMA_PAGAMENTO ");
			sql.append(" FROM caja B ");
			sql.append(" LEFT JOIN boleto bo ON (bo.boleto_id = b.transacaooriginal_id  AND b.indstatusboleto = 'C') ");
			sql.append(" JOIN RUTA R ON R.RUTA_ID = B.RUTA_ID ");
			sql.append(" JOIN PUNTO_VENTA pv on B.PUNTOVENTA_ID = pv.PUNTOVENTA_ID ");
			sql.append(" JOIN USUARIO u on u.USUARIO_ID = B.USUARIO_ID ");
			sql.append(" LEFT JOIN USUARIO uc ON uc.USUARIO_ID = bo.USUARIO_ID ");
			sql.append(" JOIN PARADA p_origen on p_origen.PARADA_ID = B.ORIGEN_ID ");
			sql.append(" JOIN PARADA p_destino on p_destino.PARADA_ID = B.DESTINO_ID ");
			sql.append(" JOIN CATEGORIA ct on ct.CATEGORIA_ID = B.CATEGORIA_ID ");
			sql.append(" JOIN CLASE_SERVICIO cs on cs.CLASESERVICIO_ID = B.CLASESERVICIO_ID ");
			sql.append(" JOIN MARCA m on m.marca_id = b.marca_id ");
    		sql.append(" JOIN CAJA_FORMAPAGO cajaFormaPago ON cajaFormaPago.CAJA_ID = b.CAJA_ID ");
    		sql.append(" JOIN FORMA_PAGO formaPago ON formaPago.FORMAPAGO_ID = cajaFormaPago.FORMAPAGO_ID ");
			sql.append(" left join ciudad co ON co.ciudad_id = p_origen.ciudad_id ");
			sql.append(" left join estado est ON est.estado_id = co.estado_id ");
			sql.append(" LEFT JOIN boleto utilizado ON (utilizado.boleto_id = b.transacaooriginal_id AND b.INDSTATUSBOLETO = 'E') ");

			sql.append(" WHERE ");
			sql.append(" (b.indreimpresion = 0 OR b.INDSTATUSBOLETO = 'E') ");
			sql.append(" and m.EMPRESA_ID = :EMPRESA_ID ");
			if (parametros.get(DATA_INICIAL) != null && parametros.get(DATA_FINAL) != null) {
				if (parametros.get(TIPO_DATA) != null) {
					if ((parametros.get(TIPO_DATA).toString().equals(DATA_VENDA))) {
						sql.append(" and b.FECHORVENTA_H >= :DATA_INICIAL ");
						sql.append(" and b.FECHORVENTA_H <= :DATA_FINAL ");
					}
					
					if ((parametros.get(TIPO_DATA).toString().equals("DATA_EMISSAO"))) {
						sql.append(" and utilizado.FECHORVENTA >= :DATA_INICIAL ");
						sql.append(" and utilizado.FECHORVENTA <= :DATA_FINAL ");
					}
					
					if ((parametros.get(TIPO_DATA).toString().equals("DATA_VIAGEM"))) {
						sql.append(" and b.FECCORRIDA >= :DATA_INICIAL ");
						sql.append(" and b.FECCORRIDA <= :DATA_FINAL ");
					}
				}
			}
			
			if (parametros.get("NUMPUNTOVENTA") != null && !parametros.get("NUMPUNTOVENTA").equals("-1")) {
				sql.append(" and pv.PUNTOVENTA_ID IN (" + parametros.get("NUMPUNTOVENTA").toString() + ")");
			}
			
			if (parametros.get("MOEDA_ID") != null) {
				sql.append(" and NVL(B.MONEDA_ID, 1) = "+parametros.get("MOEDA_ID") );
			}
			
			if (parametros.get("ESTADO_ID") != null && !parametros.get("ESTADO_ID").equals("-1")) {
				sql.append(" and est.estado_id = " + parametros.get("ESTADO_ID").toString() + "");
			}
			
			sql.append(" AND b.INDVIAJEREDONDO = 1 ");	
			if(parametros.get(FORMA_PAGO) != null && !parametros.get(FORMA_PAGO).equals("-1")) {
				sql.append(" and formaPago.FORMAPAGO_ID =:FORMAPAGO_ID ");
			}
		}
			
		
		if (parametros.get("STATUS").toString().contains("C")||parametros.get("STATUS").toString().contains("V")) {
			if (parametros.get("IDAVOLTA").equals("1")) {
				sql.append(" UNION ALL ");	
			}
			sql.append(" select distinct ");
			sql.append(" u.CVEUSUARIO CVEBILHETEIRO, ");
			sql.append(" uc.CVEUSUARIO CVEBILHETEIRO_CANCELADO, ");
			sql.append(" B.indstatusboleto IMPRESSAO_POSTERIOR, ");
			sql.append(" B.NUMFOLIOSISTEMA NUMERO_PASSAGEM, ");
			sql.append(" B.NUMSERIEPREIMPRESA SERIE, ");
			sql.append(" B.NUMSERIEPREIMPRESA SUB_SERIE, ");
            sql.append(" B.NUMFOLIOPREIMPRESO PRE_IMPRESSO, ");
            sql.append(" p_origen.PARADA_ID COD_ORIGEM, ");
            sql.append(" p_origen.DESCPARADA ORIGEM, ");
            sql.append(" p_destino.PARADA_ID COD_DESTINO, ");
            sql.append(" p_destino.DESCPARADA DESTINO, ");
            sql.append(" pv.NUMPUNTOVENTA COD_AGENCIA, ");
            sql.append(" pv.NOMBPUNTOVENTA NOME_AGENCIA, ");
            sql.append(" CASE WHEN B.indstatusboleto = 'E' THEN utilizado.fechorventa_h  ELSE B.fechorventa_h END DATA_VENDA, ");
            sql.append(" CASE WHEN b.fechorventa  is null THEN utilizado.fechorventa ELSE b.fechorventa_h END DATA_EMISSAO, ");
            sql.append(" B.fechorviaje DATA_VIAGEM, ");
            sql.append(" B.CORRIDA_ID SERVICO, ");
            sql.append(" to_char(B.fechorviaje, 'hh24:mi:ss') HORA, ");
            sql.append(" B.NUMASIENTO NUMASIENTO, ");
            sql.append(" ct.DESCCATEGORIA CATEGORIA, ");
            sql.append(" R.INDSENTIDOIDA SENTIDO, ");
            sql.append(" R.NUMRUTA COD_LINHA, ");
            sql.append(" R.DESCRUTA DESC_LINHA, ");
            sql.append(" CASE WHEN b.MOTIVOCANCELACION_ID IS NULL THEN 'V' ELSE 'C' END STATUS_PASSAGEM, ");
            sql.append(" B.PRECIOPAGADO TARIFA, ");
            sql.append(" B.IMPORTETAXAEMBARQUE TX_EMBARQUE, ");
            sql.append(" B.IMPORTEPEDAGIO PEDAGIO, ");
            sql.append(" B.IMPORTESEGURO SEGURO, ");
            sql.append(" u.NOMBUSUARIO BILHETEIRO, ");
            sql.append(" uc.NOMBUSUARIO BILHETEIRO_CANCELAMENTO, ");
            sql.append(" B.NOMBPASAJERO AS PASSAGEIRO, ");
            sql.append(" B.DESCNUMDOC AS DOC, ");
            sql.append(" COALESCE(b.NUMOPERACION, bo.NUMOPERACION) AS LOCALIZADOR, ");
    		sql.append("(SELECT distinct LISTAGG(formaPago.DESCPAGO, ',') WITHIN GROUP (ORDER BY formaPago.DESCPAGO) ");
    		sql.append("FROM CAJA caja2 ");
    		sql.append("INNER JOIN CAJA_FORMAPAGO cajaFormaPago ON cajaFormaPago.CAJA_ID = caja2.CAJA_ID ");
    		sql.append("INNER JOIN FORMA_PAGO formaPago ON formaPago.FORMAPAGO_ID = cajaFormaPago.FORMAPAGO_ID ");
    		sql.append("WHERE caja2.CAJA_ID = b.CAJA_ID) AS FORMA_PAGAMENTO "); 			
			sql.append(" FROM caja B ");
			sql.append(" LEFT JOIN boleto bo ON (bo.boleto_id = b.transacaooriginal_id  AND b.indstatusboleto = 'C') ");
			sql.append(" JOIN RUTA R ON R.RUTA_ID = B.RUTA_ID ");
			sql.append(" JOIN PUNTO_VENTA pv on B.PUNTOVENTA_ID = pv.PUNTOVENTA_ID ");
			sql.append(" JOIN USUARIO u on u.USUARIO_ID = B.USUARIO_ID ");
			sql.append(" LEFT JOIN USUARIO uc ON uc.USUARIO_ID = bo.USUARIO_ID ");
			sql.append(" JOIN PARADA p_origen on p_origen.PARADA_ID = B.ORIGEN_ID ");
			sql.append(" JOIN PARADA p_destino on p_destino.PARADA_ID = B.DESTINO_ID ");
			sql.append(" JOIN CATEGORIA ct on ct.CATEGORIA_ID = B.CATEGORIA_ID ");
			sql.append(" JOIN CLASE_SERVICIO cs on cs.CLASESERVICIO_ID = B.CLASESERVICIO_ID ");
			sql.append(" JOIN MARCA m on m.marca_id = b.marca_id ");
    		sql.append(" JOIN CAJA_FORMAPAGO cajaFormaPago ON cajaFormaPago.CAJA_ID = b.CAJA_ID ");
    		sql.append(" JOIN FORMA_PAGO formaPago ON formaPago.FORMAPAGO_ID = cajaFormaPago.FORMAPAGO_ID ");
			sql.append(" left join ciudad co ON co.ciudad_id = p_origen.ciudad_id ");
			sql.append(" left join estado est ON est.estado_id = co.estado_id ");
			sql.append(" LEFT JOIN boleto utilizado ON (utilizado.boleto_id = b.transacaooriginal_id AND b.INDSTATUSBOLETO = 'E') ");

			sql.append(" WHERE ");
			sql.append(" (b.indreimpresion = 0 OR b.INDSTATUSBOLETO = 'E') ");
			sql.append(" and m.EMPRESA_ID = :EMPRESA_ID ");
			if (parametros.get(DATA_INICIAL) != null && parametros.get(DATA_FINAL) != null) {
				if (parametros.get(TIPO_DATA) != null) {
					if ((parametros.get(TIPO_DATA).toString().equals(DATA_VENDA))) {
						sql.append(" and b.FECHORVENTA_H >= :DATA_INICIAL ");
						sql.append(" and b.FECHORVENTA_H <= :DATA_FINAL ");
					}
					
					if ((parametros.get(TIPO_DATA).toString().equals("DATA_EMISSAO"))) {
						sql.append(" and utilizado.FECHORVENTA >= :DATA_INICIAL ");
						sql.append(" and utilizado.FECHORVENTA <= :DATA_FINAL ");
					}
					
					if ((parametros.get(TIPO_DATA).toString().equals("DATA_VIAGEM"))) {
						sql.append(" and b.FECCORRIDA >= :DATA_INICIAL ");
						sql.append(" and b.FECCORRIDA <= :DATA_FINAL ");
					}
				}
			}
			
			if (parametros.get("NUMPUNTOVENTA") != null && !parametros.get("NUMPUNTOVENTA").equals("-1")) {
				sql.append(" and pv.PUNTOVENTA_ID IN (" + parametros.get("NUMPUNTOVENTA").toString() + ")");
			}
			
			if (parametros.get("MOEDA_ID") != null) {
				sql.append(" and NVL(B.MONEDA_ID, 1) = "+parametros.get("MOEDA_ID") );
			}
			
			if (parametros.get("ESTADO_ID") != null && !parametros.get("ESTADO_ID").equals("-1")) {
				sql.append(" and est.estado_id = " + parametros.get("ESTADO_ID").toString() + "");
			}
			
			if ( !(parametros.get("STATUS").toString().contains("V") && parametros.get("STATUS").toString().contains("C")) ) {
				if (parametros.get("STATUS").toString().contains("C")) {
					sql.append(" AND b.motivocancelacion_id is not null ");
				} else if (parametros.get("STATUS").toString().contains("V")) {
					sql.append(" AND b.motivocancelacion_id is null ");
				}
			}
			sql.append(" and B.ACTIVO = 1 AND b.INDVIAJEREDONDO IS NULL ");
			
			if(parametros.get(FORMA_PAGO) != null && !parametros.get(FORMA_PAGO).equals("-1")) {
				sql.append(" and formaPago.FORMAPAGO_ID =:FORMAPAGO_ID ");
			}
			
		}	
		sql.append(" order by  ");
		if (parametros.get("IDAVOLTA").equals("1")) {
			sql.append(" BILHETEIRO, ");
			sql.append(" DATA_EMISSAO, ");
		}else {	
			sql.append(" DATA_EMISSAO, ");
			sql.append(" BILHETEIRO, ");
		}
		sql.append(" COD_AGENCIA, ");
		sql.append(" NOME_AGENCIA, ");
		sql.append(" NUMERO_PASSAGEM, ");
		sql.append(" ORIGEM, ");
		sql.append(" DESTINO, ");
		sql.append(" CATEGORIA, ");
		sql.append(" IMPRESSAO_POSTERIOR, ");
		sql.append(" SERVICO ");
		return sql;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio#processaParametros()
	 */
	@Override
	protected void processaParametros() throws Exception {

	}

}
