/**
 * 
 */
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.List;
import java.util.Map;

import org.apache.log4j.Logger;

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

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

/**
 * @author Thiago
 *
 */
public class RelatorioDepositosDetalhado extends Relatorio {
	
	private static Logger log = Logger.getLogger(RelatorioDepositosDetalhado.class);

	private List<RelatorioDepositosDetalhadosBean> lsDadosRelatorio;
	
	private Timestamp fecInicio;
	private Timestamp fecFinal;
	private Integer marcaId;
	private Integer instFinanceira;
	
	public RelatorioDepositosDetalhado(Map<String, Object> parametros, Connection conexao) throws Exception {
		super(parametros, conexao);
		
		this.setCustomDataSource(new DataSource(this) {

			@Override
			public void initDados() throws Exception {
				Map<String, Object> parametros = this.relatorio.getParametros();
				fecInicio = (Timestamp) parametros.get("dataFiltroInicial");
				fecFinal = (Timestamp) parametros.get("dataFiltroFinal");
				if(parametros.get("MARCA_ID")!=null){
					marcaId =  Integer.valueOf(parametros.get("MARCA_ID").toString());
				}
				if(parametros.get("INST_FINANCEIRA")!=null){
					instFinanceira =  Integer.valueOf(parametros.get("INST_FINANCEIRA").toString());
				}
				
				Connection conexao = this.relatorio.getConexao();
				processarDepositosDetalhados(conexao);
				setLsDadosRelatorio(lsDadosRelatorio);
			}

		});
	}
	public void setLsDadosRelatorio(List<RelatorioDepositosDetalhadosBean> lsDadosRelatorio) {
		this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio));
		this.lsDadosRelatorio = lsDadosRelatorio;
	}
	
	private void processarDepositosDetalhados(Connection conexao) {
		ResultSet rset = null;
		NamedParameterStatement stmt = null;
		
		try {
			if(lsDadosRelatorio == null) {
				lsDadosRelatorio = new ArrayList<RelatorioDepositosDetalhadosBean>();
			}

			/* Processando vendas normais */
			stmt = carregarNamedParameterStatement(conexao);
			rset = stmt.executeQuery();
			processarResultado(rset);
			fecharConexaoBanco(stmt, rset);

		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		
	}
	private NamedParameterStatement carregarNamedParameterStatement(Connection conexao) throws SQLException {
		String sql = getSqlPacotes();
		log.info(sql);
		
		NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);
		
		if(fecInicio != null) {
			stmt.setTimestamp("fecInicio", fecInicio);
		}
		if(fecFinal != null) {
			stmt.setTimestamp("fecFinal", fecFinal);
		}
		if(marcaId != null){
			stmt.setInt("MARCA_ID", marcaId);
		}
		if(instFinanceira != null){
			stmt.setInt("INST_FINANCEIRA", instFinanceira);
		}
		
		return stmt;
	}
	
	private void processarResultado(ResultSet rset) throws SQLException {
		while (rset.next()) {
			RelatorioDepositosDetalhadosBean relatorioDepositosDetalhadosBean = new RelatorioDepositosDetalhadosBean();
			relatorioDepositosDetalhadosBean.setEmpresa(rset.getString("Empresa"));
			relatorioDepositosDetalhadosBean.setNombPuntoVenta(rset.getString("Ponto_de_venda"));
			relatorioDepositosDetalhadosBean.setBanco(rset.getString("Banco"));
			relatorioDepositosDetalhadosBean.setFechaDeposito(rset.getString("data_deposito"));
			relatorioDepositosDetalhadosBean.setFechaLancamientoDeposito(rset.getString("DATA_LANCAMENTO_DEPOSITO"));
			relatorioDepositosDetalhadosBean.setNumAgencia(rset.getString("Agencia"));
			relatorioDepositosDetalhadosBean.setNumConta(rset.getString("Conta"));
			relatorioDepositosDetalhadosBean.setNumDeposito(rset.getString("Numero_deposito"));
			relatorioDepositosDetalhadosBean.setValorDeposito(rset.getBigDecimal("valor_deposito"));
			lsDadosRelatorio.add(relatorioDepositosDetalhadosBean);
		}
	}
	protected String getSqlPacotes() {
		StringBuilder sQuery = new StringBuilder();
		
		sQuery.append(" SELECT                                                                                             ");
		sQuery.append("    E.NOMBEMPRESA Empresa,                                                                          ");   
		sQuery.append("    PV.NOMBPUNTOVENTA Ponto_de_venda,                                                               ");   
		sQuery.append("    TO_CHAR(FD.FECHA_DEPOSITO,'dd/MM/yyyy') data_deposito,                                          ");   
		sQuery.append("    FD.NUMDEPOSITO Numero_deposito,                                                                 ");   
		sQuery.append("    TO_CHAR(FD.FECCREACION,'dd/MM/yyyy') DATA_LANCAMENTO_DEPOSITO,                                  ");      
		sQuery.append("    if.NOME Banco,                                                                                  ");   
		sQuery.append("    EC.NUMCONTA Conta,                                                                              ");   
		sQuery.append("    EC.NUMAGENCIA Agencia,                                                                          ");   
		sQuery.append("    FD.VALOR valor_deposito                                                                         ");   
		sQuery.append("  FROM                                                                                              ");   
		sQuery.append("    FECHAMENTO_DEPOSITO fd                                                                          ");   
		sQuery.append("  JOIN FECHAMENTO_CCT_DEPOSITO fcd                                                                  ");   
		sQuery.append("  ON                                                                                                ");   
		sQuery.append("    FCD.FECHAMENTODEPOSITO_ID = FD.FECHAMENTODEPOSITO_ID                                            ");   
		sQuery.append("  JOIN FECHAMENTO_CNTCORRENTE fc                                                                    ");   
		sQuery.append("  ON                                                                                                ");   
		sQuery.append("    FCD.FECHAMENTOCNTCORRENTE_ID = FC.FECHAMENTOCNTCORRENTE_ID                                      ");   
		sQuery.append("  JOIN EMPRESA e                                                                                    ");   
		sQuery.append("  ON                                                                                                ");   
		sQuery.append("    E.EMPRESA_ID = FC.EMPRESA_ID                                                                    ");   
		sQuery.append("  JOIN PUNTO_VENTA pv                                                                               ");   
		sQuery.append("  ON                                                                                                ");   
		sQuery.append("    PV.PUNTOVENTA_ID = FC.PUNTOVENTA_ID                                                             ");
		sQuery.append("  JOIN EMPRESA_CONTABANCARIA ec                                                                     ");  
		sQuery.append("  ON                                                                                                ");
		sQuery.append("  	fd.EMPRESACONTABANCARIA_ID = EC.EMPRESACONTABANCARIA_ID                                        ");
		sQuery.append("  JOIN INSTI_FINANCEIRA IF                                                                          "); 
		sQuery.append("  ON                                                                                                ");   
		sQuery.append("     EC.INSTIFINANCEIRA_ID = if.INSTIFINANCEIRA_ID                                                  ");       
        sQuery.append("                                                                                                    ");
		sQuery.append("  WHERE                                                                                             ");   
		sQuery.append("    FD.ACTIVO    = 1                                                                                ");   
		sQuery.append("  AND FCD.ACTIVO = 1                                                                                ");   
		sQuery.append("  AND FC.ACTIVO  = 1                                                                                ");   
		sQuery.append("  AND E.ACTIVO   = 1                                                                                ");   
		sQuery.append("  AND PV.ACTIVO  = 1                                                                                ");   
		if(parametros.get("MARCA_ID")!= null){
			sQuery.append(" 	   and e.empresa_id =:MARCA_ID                                                                 ");
		 }
		if(parametros.get("INST_FINANCEIRA")!= null){
			sQuery.append(" 	   and if.INSTIFINANCEIRA_ID =:INST_FINANCEIRA                                               ");
		}
		sQuery.append("  and FD.FECCREACION between :fecInicio and  :fecFinal");
		sQuery.append("  GROUP BY                                                                                          ");   
		sQuery.append("   E.NOMBEMPRESA,                                                                                   ");  
		sQuery.append("   PV.NOMBPUNTOVENTA,                                                                               ");  
		sQuery.append("   FD.FECHA_DEPOSITO,                                                                               ");  
		sQuery.append("   FD.NUMDEPOSITO,                                                                                  ");  
		sQuery.append("   FD.FECCREACION,                                                                                  ");     
		sQuery.append("   if.NOME,                                                                                         ");  
		sQuery.append("   EC.NUMCONTA,                                                                                     ");  
		sQuery.append("   EC.NUMAGENCIA,                                                                                   ");  
		sQuery.append("   FD.VALOR                                                                                         ");  
		sQuery.append("  ORDER BY                                                                                          ");
		sQuery.append("   E.NOMBEMPRESA,                                                                                   ");  
		sQuery.append("   PV.NOMBPUNTOVENTA,                                                                               ");
		sQuery.append("   FD.FECCREACION,                                                                                  ");
		sQuery.append("   FD.FECHA_DEPOSITO,                                                                               ");                                                                                                                                                                       
		sQuery.append("   FD.NUMDEPOSITO,                                                                                  ");  
		sQuery.append("   if.NOME,                                                                                         ");  
		sQuery.append("   EC.NUMCONTA,                                                                                     ");  
		sQuery.append("   EC.NUMAGENCIA,                                                                                   ");  
		sQuery.append("   FD.VALOR                                                                                         ");
		return sQuery.toString();                                                                                          
	}
	
	private void fecharConexaoBanco(NamedParameterStatement stmt, ResultSet rset) {
		try {
			if(rset != null) {
				rset.close();
			}
			if(stmt != null) {
				stmt.close();
			}
		} catch (SQLException e) {
			log.error(e.getMessage(), e);
		}
	}
	@Override
	protected void processaParametros() throws Exception {
		
	}

}
