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

import java.sql.Connection;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
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;

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

	protected RelatorioEstornoCartao(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();
				String sql = getSql();
				SimpleDateFormat sdfDiaMesAno = new SimpleDateFormat("dd/MM/yyyy");
				SimpleDateFormat sdfDiaMesAnoHora = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
				
				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);

				stmt.setTimestamp("data_inicial", new java.sql.Timestamp(sdfDiaMesAnoHora.parse(sdfDiaMesAno.format(parametros.get("DATA_INICIAL")) + " 00:00:00").getTime()));
				stmt.setTimestamp("data_final", new java.sql.Timestamp(sdfDiaMesAnoHora.parse(sdfDiaMesAno.format(parametros.get("DATA_FINAL")) + " 23:59:59").getTime()));
				
				if (parametros.get("EMPRESA_ID") != null && !parametros.get("EMPRESA_ID").equals("-1")) {
					stmt.setInt("empresaId", Integer.valueOf(parametros.get("EMPRESA_ID") + ""));					
				}
				
				if (parametros.get("FORMA_PAGO") != null && !parametros.get("FORMA_PAGO").equals("-1")) {
					stmt.setInt("formapagoId", Integer.valueOf(parametros.get("FORMA_PAGO") + ""));
				}
				
				if (parametros.get("DOCUMENTO_CPF") != null && parametros.get("DOCUMENTO_CPF") != "") {
					stmt.setString("documentoCPF", parametros.get("DOCUMENTO_CPF").toString());
				}
				if (parametros.get("CARTAO") != null && parametros.get("CARTAO") != "") {
					stmt.setString("cartao", parametros.get("CARTAO").toString());
				}
				
				ResultSet rset = stmt.executeQuery();

				while (rset.next()) {
					Map<String, Object> dataResult = new HashMap<String, Object>();
					dataResult.put("agencia", rset.getString("agencia"));
					dataResult.put("bilheteiro", rset.getString("bilheteiro"));
					dataResult.put("data", rset.getDate("data"));
					dataResult.put("cliente", rset.getString("cliente"));
					dataResult.put("cpf", rset.getString("cpf"));
					dataResult.put("email", rset.getString("email"));
					dataResult.put("telefone", rset.getString("telefone"));
					dataResult.put("cartao", rset.getString("cartao"));
					dataResult.put("numeroCartao", rset.getString("numeroCartao"));
					dataResult.put("nsu", rset.getString("nsu"));
					dataResult.put("autorizacao", rset.getString("autorizacao"));
					dataResult.put("dataTransacao", rset.getDate("dataTransacao"));
					dataResult.put("valorEstorno", rset.getBigDecimal("valorEstorno"));
					dataResult.put("origem", rset.getString("origem"));
					dataResult.put("destino", rset.getString("destino"));
					dataResult.put("servico", rset.getInt("servico"));
					dataResult.put("dataServico", rset.getDate("dataServico"));
					dataResult.put("bilhete", rset.getString("bilhete"));
					dataResult.put("valorTransacao", rset.getBigDecimal("valorTransacao"));

					dataResult.put("agenciaVenda", rset.getString("agenciaVenda"));
					dataResult.put("formaPago", rset.getString("formaPago"));
					dataResult.put("nombempresa", rset.getString("nombempresa"));
					dataResult.put("descmotivo", rset.getString("descmotivo"));
					dataResult.put("adquirente", rset.getString("adquirente"));
					dataResult.put("estabelecimento", rset.getString("estabelecimento"));
					dataResult.put("nsuhost", rset.getString("nsuhost"));
					

					this.dados.add(dataResult);
				}

				this.resultSet = rset;
			}


		});
	}

	private String getSql() {

		StringBuilder sql = new StringBuilder();

		sql.append(" SELECT                                                    ");
		sql.append("   pv.NUMPUNTOVENTA agencia,                               ");
		sql.append("   u.CVEUSUARIO bilheteiro,                                ");
		sql.append("   DEC.FECREGISTRO data,                                   ");
		sql.append("   DEC.NOMBTITULAR cliente,                                ");
		sql.append("   DEC.DOCUMENTOCPF cpf,                                   ");
		sql.append("   DEC.EMAIL email,                                        ");
		sql.append("   DEC.TELEFONO telefone,                                  ");
		sql.append("   dec.TIPOCARTAO cartao,                                  ");
		sql.append("   DEC.NUMCARTAO numeroCartao,                             ");
		sql.append("   DEC.NSU nsu,                                            ");
		sql.append("   DEC.NUMAUTORIZACAO autorizacao,                         ");
		sql.append("   DEC.FECTRANSACAO dataTransacao,                         ");
		sql.append("   DEC.IMPORTEESTORNADO valorEstorno,                      ");
		sql.append("   pOrigen.CVEPARADA origem,                               ");
		sql.append("   pDestino.CVEPARADA destino,                             ");
		sql.append("   dec.CORRIDA_ID servico,                                 ");
		sql.append("   dec.FECCORRIDA dataServico,                             ");
		sql.append("   DEC.NUMFOLIOSISTEMA bilhete,                            ");
		sql.append("   DEC.IMPORTETOTAL valorTransacao,                        ");
		sql.append("   pvBoleto.NUMPUNTOVENTA agenciaVenda,                    ");
		sql.append("   fp.descpago formaPago,                                  ");
		sql.append("   e.nombempresa,                                          ");
		sql.append("   DEC.adquirente,										   ");		
		sql.append("   DEC.estabelecimento,                                    ");
		
		//SubSelect para evitar duplicacao dos registros por causa do join com a caja
		sql.append(" COALESCE(( select  mc.descmotivo                          ");
		sql.append("   from  	                                               ");
		sql.append("       motivo_cancelacion mc join caja c                   ");
		sql.append("       on c.motivocancelacion_id = mc.motivocancelacion_id ");
		sql.append("    where                                                  ");
		sql.append("    	c.numoperacion = dec.numoperacion                  ");
		sql.append("        AND c.origen_id = dec.origen_id                    ");
		sql.append(" 		AND c.destino_id = dec.destino_id                  ");
		sql.append(" 		AND c.corrida_id = dec.corrida_id                  ");
		sql.append(" 		AND c.numfoliosistema = dec.numfoliosistema        ");
		sql.append(" 		AND c.indreimpresion = 1                           ");
		sql.append(" 		AND rownum = 1), 'CANCELAMENTO') as descmotivo,    ");
		
		//SubSelect para evitar duplicacao dos registros por causa do join com a caja
		sql.append(" COALESCE(( select  ct.nsuhost                             ");
		sql.append("   from caja c inner join caja_formapago cfp on cfp.caja_id          = c.caja_id            ");
		sql.append("                left join caja_det_pago  cdp on cdp.cajaformapago_id = cfp.cajaformapago_id ");
		sql.append("                left join caja_tarjeta    ct on ct.cajadetpago_id    = cdp.cajadetpago_id   ");
		sql.append(" 	           inner join forma_pago      fp on fp.formapago_id      = cfp.formapago_id     ");
		sql.append("    where                                                  ");
		sql.append("    	c.numoperacion        = dec.numoperacion           ");
		sql.append("        AND c.origen_id       = dec.origen_id              ");
		sql.append(" 		AND c.destino_id      = dec.destino_id             ");
		sql.append(" 		AND c.corrida_id      = dec.corrida_id             ");
		sql.append("        AND coalesce( ct.nsuhost, '0') <> '0'              ");
		sql.append(" 		AND rownum = 1), '') as nsuhost                    ");		
		
		
		sql.append(" FROM                                                      ");
		sql.append("   DADOS_ESTORNO_CARTAO DEC                                ");
		sql.append(" JOIN punto_venta pv                                       ");
		sql.append(" ON                                                        ");
		sql.append("   pv.PUNTOVENTA_ID = dec.PUNTOVENTA_ID                    ");
		sql.append(" LEFT JOIN punto_venta pvBoleto ON                         ");
		sql.append("   pvBoleto.PUNTOVENTA_ID = dec.PONTO_VENDA_BOLETO_ID      ");
		sql.append(" LEFT JOIN forma_pago fp ON                                ");
		sql.append("   fp.formapago_id = dec.formapago_id                      ");
		sql.append(" JOIN usuario u                                            ");
		sql.append(" ON                                                        ");
		sql.append("   u.USUARIO_ID = DEC.USUARIO_ID                           ");
		sql.append(" JOIN parada pOrigen                                       ");
		sql.append(" ON                                                        ");
		sql.append("   pOrigen.PARADA_ID = DEC.ORIGEN_ID                       ");
		sql.append(" JOIN parada pDestino                                      ");
		sql.append(" ON                                                        ");
		sql.append("   pDestino.PARADA_ID = DEC.DESTINO_ID                     ");
		sql.append(" JOIN MARCA m                                              ");
		sql.append(" ON                                                        ");
		sql.append("   dec.MARCA_ID = m.MARCA_ID                               ");
		sql.append(" JOIN EMPRESA e                                            ");
		sql.append(" ON                                                        ");
		sql.append("   e.EMPRESA_ID = m.EMPRESA_ID                             ");
		sql.append(" WHERE                                                     ");
		sql.append("   dec.activo = 1                                          ");
		
		if (parametros.get("NUMPUNTOVENTA") != null && !parametros.get("NUMPUNTOVENTA").equals("-1")) {
			sql.append(" AND dec.PUNTOVENTA_ID IN(" + parametros.get("NUMPUNTOVENTA") + ") ");
		}
		
		if (parametros.get("EMPRESA_ID") != null && !parametros.get("EMPRESA_ID").equals("-1")) {
			sql.append(" AND e.EMPRESA_ID       = :empresaId                       ");			
		}
		
		if (parametros.get("FORMA_PAGO") != null && !parametros.get("FORMA_PAGO").equals("-1")) {
			sql.append(" AND DEC.FORMAPAGO_ID       = :formapagoId                       ");			
		}
		
		if (parametros.get("DOCUMENTO_CPF") != null && parametros.get("DOCUMENTO_CPF") != "") {
			sql.append(" AND LOWER(DEC.DOCUMENTOCPF)    like LOWER(:documentoCPF) ||'%'  ");
		}
		
		if (parametros.get("CARTAO") != null && parametros.get("CARTAO") != "") {
			sql.append(" AND LOWER(dec.TIPOCARTAO)     like '%' || LOWER(:cartao)||'%'  ");
		}
		
		sql.append(" AND DEC.FECREGISTRO BETWEEN :data_inicial AND :data_final ");
		sql.append(" ORDER BY  e.nombempresa, DEC.FECREGISTRO ");

		return sql.toString();
	}
	@Override
	protected void processaParametros() throws Exception {

	}

}
