/**
 *
 */
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 RelatorioEstornoTrocoSimples extends Relatorio {

	protected RelatorioEstornoTrocoSimples(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()));
				stmt.setInt("empresaId", Integer.valueOf(parametros.get("EMPRESA_ID") + ""));
				
				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("cpf", rset.getString("cpf"));
					dataResult.put("transacao", rset.getString("transacao"));
					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"));

					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.fecmodif        data,                               ");
		sql.append("   DEC.CPF cpf,               		                       ");
		sql.append("   DEC.id_transacao transacao,                             ");
		sql.append("   DEC.datatransacao dataTransacao,                         ");
		sql.append("   DEC.valorestornado 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.valortotal valorTransacao                           ");
		sql.append(" FROM                                                      ");
		sql.append("   dados_estorno_trocosimples DEC                          ");
		sql.append(" JOIN punto_venta pv                                       ");
		sql.append(" ON                                                        ");
		sql.append("   pv.PUNTOVENTA_ID = dec.PUNTOVENTA_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 EMPRESA e                                            ");
		sql.append(" ON                                                        ");
		sql.append("   e.EMPRESA_ID = DEC.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") + ") ");
		}
		
		sql.append(" AND e.EMPRESA_ID       = :empresaId                       ");
		
		if (parametros.get("DOCUMENTO_CPF") != null && parametros.get("DOCUMENTO_CPF") != "") {
			sql.append(" AND LOWER(DEC.CPF)    like LOWER(:documentoCPF) ||'%'  ");
		}

		sql.append(" AND DEC.datatransacao BETWEEN :data_inicial AND :data_final ");

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

	}

}
