package com.rjconsultores.ventaboletos.relatorios.impl;

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

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

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.RelatorioVendasPacotesResumidoBean;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

public class RelatorioVendasPacotesResumido extends Relatorio {
	
	private static Logger log = Logger.getLogger(RelatorioVendasPacotesResumido.class);

	private SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
	
	private List<RelatorioVendasPacotesResumidoBean> lsDadosRelatorio;
	
	private Date fecInicio;
	private Date fecFinal;
	private Integer empresaId;

	public RelatorioVendasPacotesResumido(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 = new java.sql.Date(sdf.parse(parametros.get("fecInicio").toString()).getTime());
				fecFinal = new java.sql.Date(sdf.parse(parametros.get("fecFinal").toString()).getTime());
				empresaId = parametros.get("empresaId") != null && parametros.get("empresaId").equals("null") ? Integer.valueOf(parametros.get("empresaId").toString()) : null;
				
				Connection conexao = this.relatorio.getConexao();
				processarTotalPacote(conexao);
				processarTotalBoletos(conexao);
				
				setLsDadosRelatorio(lsDadosRelatorio);
			}
		});
	}
	
	private void processarTotalPacote(Connection conexao) {
		ResultSet rset = null;
		NamedParameterStatement stmt = null;
		
		try {
			String sql = getSqlPacotes();
			
			log.info(sql);
	
			stmt = new NamedParameterStatement(conexao, sql);
			
			if(fecInicio != null) {
				stmt.setDate("fecInicio", fecInicio);
			}
			if(fecFinal != null) {
				stmt.setDate("fecFinal", fecFinal);
			}
			if (empresaId != null){
				stmt.setInt("empresaId", empresaId);
			}
			
			rset = stmt.executeQuery();
	
			if(lsDadosRelatorio == null) {
				lsDadosRelatorio = new ArrayList<RelatorioVendasPacotesResumidoBean>();
			}
			
			while (rset.next()) {
				RelatorioVendasPacotesResumidoBean relatorioVendasPacotesResumidoBean = new RelatorioVendasPacotesResumidoBean();
				relatorioVendasPacotesResumidoBean.setPacoteId(rset.getLong("pacote_id"));
				relatorioVendasPacotesResumidoBean.setNompacote(rset.getString("nompacote"));
				relatorioVendasPacotesResumidoBean.setTotalPacotes(rset.getBigDecimal("totalpacote"));
				relatorioVendasPacotesResumidoBean.setQtdePacotes(rset.getLong("qtdepacote"));
				lsDadosRelatorio.add(relatorioVendasPacotesResumidoBean);
			}
			
		} 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);
			}
		}
		
	}
	
	private void processarTotalBoletos(Connection conexao) {
		ResultSet rset = null;
		NamedParameterStatement stmt = null;
		
		try {
			String sql = getSqlBoletos();
			
			log.info(sql);
	
			stmt = new NamedParameterStatement(conexao, sql);
			
			if(fecInicio != null) {
				stmt.setDate("fecInicio", fecInicio);
			}
			if(fecFinal != null) {
				stmt.setDate("fecFinal", fecFinal);
			}
			if (empresaId != null){
				stmt.setInt("empresaId", empresaId);
			}
			
			rset = stmt.executeQuery();
	
			if(lsDadosRelatorio == null) {
				lsDadosRelatorio = new ArrayList<RelatorioVendasPacotesResumidoBean>();
			}
			
			while (rset.next()) {
				RelatorioVendasPacotesResumidoBean relatorioVendasPacotesResumidoBean = new RelatorioVendasPacotesResumidoBean();
				relatorioVendasPacotesResumidoBean.setPacoteId(rset.getLong("pacote_id"));
				relatorioVendasPacotesResumidoBean.setNompacote(rset.getString("nompacote"));
				relatorioVendasPacotesResumidoBean.setTotalBoletos(rset.getBigDecimal("totalboletos"));
				
				if(lsDadosRelatorio.contains(relatorioVendasPacotesResumidoBean)) {
					RelatorioVendasPacotesResumidoBean relatorioVendasPacotesBeanAux = lsDadosRelatorio.get(lsDadosRelatorio.indexOf(relatorioVendasPacotesResumidoBean));
					relatorioVendasPacotesBeanAux.setTotalBoletos(relatorioVendasPacotesResumidoBean.getTotalBoletos());
					relatorioVendasPacotesBeanAux.setTotalPacotes(relatorioVendasPacotesBeanAux.getTotalPacotes().subtract(relatorioVendasPacotesBeanAux.getTotalBoletos()));
				} else {
					lsDadosRelatorio.add(relatorioVendasPacotesResumidoBean);
				}
			}
			
		} 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);
			}
		}
		
	}
	
	private String getSqlPacotes() {
		StringBuilder sQuery = new StringBuilder();
		
		sQuery.append("SELECT P.PACOTE_ID, P.NOMPACOTE, COUNT(P.PACOTE_ID) AS QTDEPACOTE, SUM(VP.TOTAL) AS TOTALPACOTE ")
			  .append("FROM VENDA_PACOTE VP ")
			  .append("LEFT JOIN PACOTE P ON P.PACOTE_ID = VP.PACOTE_ID ")
			  .append("WHERE P.ACTIVO = 1 ");
		
		if(empresaId != null) {
			sQuery.append("AND P.EMPRESA_ID = :empresaId ");
		}

		if(fecInicio != null) {
			sQuery.append("AND VP.DATAPACOTE >= :fecInicio ");
		}
		
		if(fecFinal != null) {
			sQuery.append("AND VP.DATAPACOTE <= :fecFinal ");
		}
		
		sQuery.append("GROUP BY P.PACOTE_ID, P.NOMPACOTE ");
		
		return sQuery.toString();
	}

	private String getSqlBoletos() {
		StringBuilder sQuery = new StringBuilder();
		
		sQuery.append("SELECT P.PACOTE_ID, P.NOMPACOTE, SUM(TVP.VALOR) AS TOTALBOLETOS ")
			  .append("FROM VENDA_PACOTE VP ")
			  .append("LEFT JOIN PACOTE P ON P.PACOTE_ID = VP.PACOTE_ID ")
			  .append("LEFT JOIN TARIFA_VENDA_PACOTE TVP ON TVP.VENDAPACOTE_ID = VP.VENDAPACOTE_ID ")
			  .append("LEFT JOIN BOLETO B ON B.BOLETO_ID = TVP.BOLETO_ID ")
			  .append("WHERE P.ACTIVO = 1 ")
			  .append("AND B.ACTIVO = 1 ")
			  .append("AND B.INDSTATUSBOLETO = 'V' ")
			  .append("AND B.MOTIVOCANCELACION_ID IS NULL ");
		
		if(empresaId != null) {
			sQuery.append("AND P.EMPRESA_ID = :empresaId ");
		}

		if(fecInicio != null) {
			sQuery.append("AND VP.DATAPACOTE >= :fecInicio ");
		}
		
		if(fecFinal != null) {
			sQuery.append("AND VP.DATAPACOTE <= :fecFinal ");
		}
		
		sQuery.append("GROUP BY P.PACOTE_ID, P.NOMPACOTE ");
		
		return sQuery.toString();
	}

	@Override
	protected void processaParametros() throws Exception {
	}
	
	public List<RelatorioVendasPacotesResumidoBean> getLsDadosRelatorio() {
		return lsDadosRelatorio;
	}

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

}
