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.enums.LocalEnderecoApanhe;
import com.rjconsultores.ventaboletos.enums.SituacaoVendaPacote;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioVendasPacotesDetalhadoBean;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

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

	private SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
	
	private List<RelatorioVendasPacotesDetalhadoBean> lsDadosRelatorio;
	
	private Date fecInicio;
	private Date fecFinal;
	private Integer empresaId;
	private Integer pacoteId;
	private Integer origenId;
	private Integer destinoId;
	private Integer usuarioId;
	private Integer tipoTarifaPacoteId;

	public RelatorioVendasPacotesDetalhado(Map<String, Object> parametros, Connection conexao, final String... nomeSubReporte) 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;
				pacoteId = parametros.get("pacoteId") != null && !parametros.get("pacoteId").equals("null") ? Integer.valueOf(parametros.get("pacoteId").toString()) : null;
				origenId = parametros.get("origenId") != null && !parametros.get("origenId").equals("null") ? Integer.valueOf(parametros.get("origenId").toString()) : null;
				destinoId = parametros.get("destinoId") != null && !parametros.get("destinoId").equals("null") ? Integer.valueOf(parametros.get("destinoId").toString()) : null;
				usuarioId = parametros.get("usuarioId") != null && !parametros.get("usuarioId").equals("null") ? Integer.valueOf(parametros.get("usuarioId").toString()) : null;
				tipoTarifaPacoteId = parametros.get("tipoTarifaPacoteId") != null && !parametros.get("tipoTarifaPacoteId").equals("null") ? Integer.valueOf(parametros.get("tipoTarifaPacoteId").toString()) : null;
				
				Connection conexao = this.relatorio.getConexao();
				processarVendasPacote(conexao);
				
				setNomeSubReporte(nomeSubReporte);
				setLsDadosRelatorio(lsDadosRelatorio);
			}
		});
	}
	
	private void processarVendasPacote(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 && empresaId > 0){
				stmt.setInt("empresaId", empresaId);
			}
			if (pacoteId != null && pacoteId > 0){
				stmt.setInt("pacoteId", pacoteId);
			}
			if(origenId != null) {
				stmt.setInt("origenId", origenId);
			}
			if(destinoId != null) {
				stmt.setInt("destinoId", destinoId);
			}
			if(usuarioId != null) {
				stmt.setInt("usuarioId", usuarioId);
			}
			if(tipoTarifaPacoteId != null && tipoTarifaPacoteId > 0) {
				stmt.setInt("tipoTarifaPacoteId", tipoTarifaPacoteId);
			}
			
			rset = stmt.executeQuery();
	
			if(lsDadosRelatorio == null) {
				lsDadosRelatorio = new ArrayList<RelatorioVendasPacotesDetalhadoBean>();
			}
			
			while (rset.next()) {
				RelatorioVendasPacotesDetalhadoBean relatorioVendasPacotesBean = new RelatorioVendasPacotesDetalhadoBean();
				relatorioVendasPacotesBean.setPacoteId(rset.getLong("pacote_id"));
				relatorioVendasPacotesBean.setNompacote(rset.getString("nompacote"));
				
				Integer idx = null;
				if(lsDadosRelatorio.contains(relatorioVendasPacotesBean)) {
					idx = lsDadosRelatorio.indexOf(relatorioVendasPacotesBean);
					relatorioVendasPacotesBean = lsDadosRelatorio.get(idx);
				}
				
				RelatorioVendasPacotesDetalhadoBean.RelatorioVendasPacotesDetalhadoItemBean relatorioVendasPacotesDetalhadoItemBean = new RelatorioVendasPacotesDetalhadoBean().new RelatorioVendasPacotesDetalhadoItemBean();
				relatorioVendasPacotesDetalhadoItemBean.setDatapacote(rset.getDate("datapacote"));
				relatorioVendasPacotesDetalhadoItemBean.setDatavenda(rset.getDate("datavenda"));
				relatorioVendasPacotesDetalhadoItemBean.setDeschotel(rset.getString("deschotel"));
				relatorioVendasPacotesDetalhadoItemBean.setDesconto(rset.getBigDecimal("desconto"));
				relatorioVendasPacotesDetalhadoItemBean.setLocalEnderecoApanhe(LocalEnderecoApanhe.getLocalEnderecoApanhe(rset.getInt("local")));
				relatorioVendasPacotesDetalhadoItemBean.setNombusuario(rset.getString("nombusuario"));
				relatorioVendasPacotesDetalhadoItemBean.setNumoperacion(rset.getString("numoperacion"));
				relatorioVendasPacotesDetalhadoItemBean.setQtdeTarifas(rset.getLong("qtdetarifas"));
				relatorioVendasPacotesDetalhadoItemBean.setRazaoSocialCliente(rset.getString("razao_social"));
				relatorioVendasPacotesDetalhadoItemBean.setSubTotal(rset.getBigDecimal("subtotal"));
				relatorioVendasPacotesDetalhadoItemBean.setTotal(rset.getBigDecimal("total"));
				relatorioVendasPacotesDetalhadoItemBean.setVendapacoteId(rset.getLong("vendapacote_id"));
				relatorioVendasPacotesDetalhadoItemBean.setSituacaoVendaPacote(SituacaoVendaPacote.getSituacaoVendaPacote(rset.getInt("situacao")));
				
				if(relatorioVendasPacotesBean.getRelatorioVendasPacotesDetalhadoItemBeans() == null) {
					relatorioVendasPacotesBean.setRelatorioVendasPacotesDetalhadoItemBeans(new ArrayList<RelatorioVendasPacotesDetalhadoBean.RelatorioVendasPacotesDetalhadoItemBean>());
				}
				relatorioVendasPacotesBean.getRelatorioVendasPacotesDetalhadoItemBeans().add(relatorioVendasPacotesDetalhadoItemBean);
				
				if(idx != null) {
					lsDadosRelatorio.set(idx, relatorioVendasPacotesBean);
				} else {
					lsDadosRelatorio.add(relatorioVendasPacotesBean);
				}
			}
			
		} 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);
			}
		}
		
	}
	
	protected String getSqlPacotes() {
		StringBuilder sQuery = new StringBuilder();
		
		sQuery.append("SELECT P.PACOTE_ID, VP.VENDAPACOTE_ID, P.NOMPACOTE, VP.NUMOPERACION, VP.DATAVENDA, VP.DATAPACOTE, EA.DESCHOTEL, EA.LOCAL, CP.RAZAO_SOCIAL, U.NOMBUSUARIO, VP.SUBTOTAL, VP.DESCONTO, VP.TOTAL, VP.SITUACAO, COUNT(TVP.TARIFAVENDAPACOTE_ID) AS QTDETARIFAS ")
			  .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("LEFT JOIN ENDERECO_APANHE EA ON EA.VENDAPACOTE_ID = VP.VENDAPACOTE_ID AND EA.ACTIVO = 1 ")
			  .append("LEFT JOIN CLIENTE_PACOTE CP ON CP.CLIENTEPACOTE_ID = VP.CLIENTEPACOTE_ID ")
			  .append("LEFT JOIN USUARIO U ON U.USUARIO_ID = VP.USUARIO_ID ")
			  .append("LEFT JOIN PACOTE_TARIFA PT ON PT.PACOTETARIFA_ID = TVP.PACOTETARIFA_ID ")
			  .append("LEFT JOIN TIPO_TARIFA_PACOTE TTP ON TTP.TIPOTARIFAPACOTE_ID = PT.TIPOTARIFAPACOTE_ID ")
			  .append("WHERE P.ACTIVO = 1 ")
			  .append("AND (B.BOLETO_ID IS NULL OR (B.ACTIVO = 1 AND B.INDSTATUSBOLETO = 'V' AND B.MOTIVOCANCELACION_ID IS NULL)) ");
		
		if(empresaId != null && empresaId > 0) {
			sQuery.append("AND P.EMPRESA_ID = :empresaId ");
		}

		if(pacoteId != null && pacoteId > 0) {
			sQuery.append("AND P.PACOTE_ID = :pacoteId ");
		}

		if(fecInicio != null) {
			sQuery.append("AND VP.DATAPACOTE >= :fecInicio ");
		}
		
		if(fecFinal != null) {
			sQuery.append("AND VP.DATAPACOTE <= :fecFinal ");
		}
		
		if(origenId != null) {
			sQuery.append("AND B.ORIGEN_ID = :origenId ");
		}
		
		if(destinoId != null) {
			sQuery.append("AND B.DESTINO_ID = :destinoId ");
		}

		if(usuarioId != null) {
			sQuery.append("AND VP.USUARIO_ID = :usuarioId ");
		}

		if(tipoTarifaPacoteId != null && tipoTarifaPacoteId > 0) {
			sQuery.append("AND TTP.TIPOTARIFAPACOTE_ID = :tipoTarifaPacoteId ");
		}
		
		sQuery.append("GROUP BY P.PACOTE_ID, VP.VENDAPACOTE_ID, P.NOMPACOTE, VP.NUMOPERACION, VP.DATAVENDA, VP.DATAPACOTE, EA.DESCHOTEL, EA.LOCAL, CP.RAZAO_SOCIAL, U.NOMBUSUARIO, VP.SUBTOTAL, VP.DESCONTO, VP.TOTAL, VP.SITUACAO ")
			  .append("ORDER BY P.NOMPACOTE, VP.DATAPACOTE, VP.DATAVENDA ");
		
		return sQuery.toString();
	}

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

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

}
