package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.vo.comissao.LogConferenciaVO;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

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

public class RelatorioObservacaoConferenciaMovimento extends Relatorio {
	
	private static Logger log = LogManager.getLogger(RelatorioObservacaoConferenciaMovimento.class);
	private Integer empresaId;
	private Integer puntoventaId;
	private Date dataInicial;
	private Date dataFinal;
	private Integer pendenciaId;
	private Boolean pendencia; 
	private Boolean taxaEmbarque; 
	private Boolean credito; 
	private Boolean outros;  

	public RelatorioObservacaoConferenciaMovimento(Map<String, Object> parametros, Connection conexao) throws Exception {
		super(parametros, conexao);
		
		this.setCustomDataSource(new DataSource(this) {
			@Override
			public void initDados() throws Exception {
				Connection conexao = this.relatorio.getConexao();
				definirFiltros(this.relatorio.getParametros());
				List<LogConferenciaVO> lsDadosRelatorio = processarRelatorio(conexao);
				setLsDadosRelatorio(lsDadosRelatorio); 
			}
		});
	}

	private List<LogConferenciaVO> processarRelatorio(Connection conexao) throws ParseException {
		List<LogConferenciaVO> lsDadosRelatorio = new ArrayList<LogConferenciaVO>();
		ResultSet rset = null;
		NamedParameterStatement stmt = null;
		try {
			StringBuilder sQuery = new StringBuilder();
			sQuery.append("SELECT PV.NOMBPUNTOVENTA, C.DATAMOVIMENTO, LOG.STATUS, LOG.OBSERVACAO, NVL(B.NUMFOLIOSISTEMA,CJ.NUMFOLIOSISTEMA) AS NUMFOLIOSISTEMA,")
				  .append("CAT.DESCCATEGORIA, LOG.PRECO, LOG.FECMODIF, LOG.INDCREDITO, NVL(B.TIPOVENTA_ID,CJ.TIPOVENTA_ID) AS TIPOVENTA_ID, U.NOMBUSUARIO, LOG.TIPO,")
				  .append("EE.DESCINFO, TEE.DESCTIPOEVENTO, LOG.LOGCONFERENCIA_ID AS PENDENCIAID ")
				  .append("FROM LOG_CONFERENCIA LOG ")
				  .append("INNER JOIN CONFERENCIA C ON C.CONFERENCIA_ID = LOG.CONFERENCIA_ID ")
				  .append("INNER JOIN EMPRESA E ON E.EMPRESA_ID = C.EMPRESA_ID ")
				  .append("INNER JOIN PUNTO_VENTA PV ON PV.PUNTOVENTA_ID = C.PUNTOVENTA_ID ")
				  .append("INNER JOIN USUARIO U ON U.USUARIO_ID = LOG.USUARIO_ID ")
				  .append("LEFT JOIN BOLETO B ON B.BOLETO_ID = LOG.BOLETO_ID ")
				  .append("LEFT JOIN CAJA CJ ON CJ.CAJA_ID = LOG.CAJA_ID ")
				  .append("LEFT JOIN CATEGORIA CAT ON CAT.CATEGORIA_ID = B.CATEGORIA_ID ")
				  .append("LEFT JOIN EVENTO_EXTRA EE ON EE.EVENTOEXTRA_ID = LOG.EVENTOEXTRA_ID ")
				  .append("LEFT JOIN TIPO_EVENTO_EXTRA TEE ON TEE.TIPOEVENTOEXTRA_ID = EE.TIPOEVENTOEXTRA_ID ")
				  .append("WHERE LOG.ACTIVO = 1 ")
				  .append("AND C.DATAMOVIMENTO BETWEEN :dataInicial AND :dataFinal ");
				  
			if(pendencia){
				//sQuery.append("AND LOG.STATUS = 1 ");
				
				if (pendenciaId != null) {
					sQuery.append("AND LOG.LOGCONFERENCIA_ID = :pendenciaId ");
				}
			}
				  
			if (taxaEmbarque) {
				sQuery.append("AND B.IMPORTETAXAEMBARQUE > 0 ");
			}

			if (outros) {
				sQuery.append("AND B.IMPORTEOUTROS  > 0 ");
			}

			if (credito != null){
				sQuery.append("AND LOG.INDCREDITO = :credito ");
			}
			
			if(empresaId != null) {
				sQuery.append("AND C.EMPRESA_ID = :empresaId ");
			}

			if(puntoventaId != null && puntoventaId != -1) {
				sQuery.append("AND PV.PUNTOVENTA_ID = :puntoventaId ");
			}

			sQuery.append("ORDER BY PV.NOMBPUNTOVENTA, C.DATAMOVIMENTO");
			
			log.info(sQuery.toString());
			
			stmt = new NamedParameterStatement(conexao, sQuery.toString());
			if(empresaId != null) {
				stmt.setInt("empresaId", empresaId);
			}
			
			if(puntoventaId != null && puntoventaId != -1) {
				stmt.setInt("puntoventaId", puntoventaId);
			}
			stmt.setDate("dataInicial", new java.sql.Date(dataInicial.getTime()));
			stmt.setDate("dataFinal", new java.sql.Date(dataFinal.getTime()));
			
			if (credito != null){
				stmt.setBoolean("credito", credito);				
			}
			
			if (pendenciaId != null) {
				stmt.setInt("pendenciaId", pendenciaId);
			}
			
			rset = stmt.executeQuery();
			
			while (rset.next()) {
				LogConferenciaVO logConferencia = new LogConferenciaVO();
				logConferencia.setDatamovimento(rset.getDate("datamovimento"));
				logConferencia.setNombpuntoventa(rset.getString("nombpuntoventa"));
				logConferencia.setStatus(rset.getInt("status"));
				logConferencia.setNumfoliosistema(rset.getString("numfoliosistema"));
				logConferencia.setTipoventa(rset.getInt("tipoventa_id"));
				logConferencia.setObservacao(rset.getString("observacao"));
				logConferencia.setDesccategoria(rset.getString("desccategoria"));
				logConferencia.setFecmodif(rset.getDate("fecmodif"));
				logConferencia.setIndcredito(rset.getShort("indcredito"));
				logConferencia.setNombusuario(rset.getString("nombusuario"));
				logConferencia.setPreco(rset.getBigDecimal("preco"));
				logConferencia.setTipo(rset.getInt("tipo"));
				logConferencia.setDescinfoevento(rset.getString("descinfo"));
				logConferencia.setDesctipoevento(rset.getString("desctipoevento"));
				logConferencia.setPendenciaId(rset.getInt("pendenciaid"));
				
				lsDadosRelatorio.add(logConferencia);
			}
			
			return lsDadosRelatorio;
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		} finally {
			try {
				if(rset != null) {
					rset.close();
				}
				if(stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
				log.error(e.getMessage(), e);
			}
		}
		return null;
	}

	public void setLsDadosRelatorio(List<LogConferenciaVO> lsDadosRelatorio) {
		this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio));
	}

	@Override
	protected void processaParametros() throws Exception {
	}
	
	private void definirFiltros(Map<String, Object> parametros) throws ParseException {
		Integer puntoventaId = (Integer) parametros.get("puntoventaId");
		Integer empresaId = (Integer) parametros.get("empresaId");
		this.dataInicial = (Date) parametros.get("dataFiltroInicial");
		this.dataFinal = (Date) parametros.get("dataFiltroFinal");
		this.pendencia = (Boolean) parametros.get("pendencia");
		this.outros = (Boolean) parametros.get("outros");
		this.taxaEmbarque = (Boolean) parametros.get("taxaEmbarque");
		this.credito = (Boolean) parametros.get("credito");	
		this.pendenciaId = !parametros.get("pendenciaId").toString().isEmpty() ? Integer.parseInt(parametros.get("pendenciaId").toString()) : null;
		
		if(empresaId != null) {
			this.empresaId = empresaId;
		}
		if(puntoventaId != null) {
			this.puntoventaId = puntoventaId;
		}
		
	}

}
