package com.rjconsultores.ventaboletos.relatorios.impl;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.logging.log4j.Logger;

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

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


public class RelatorioComissaoSintetico extends Relatorio  {

	private List<RelatorioComissaoSinteticoBean> lsDadosRelatorio;
	public RelatorioComissaoSintetico(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();
				Map<String, Object> parametros = this.relatorio.getParametros();
				String empresaID = parametros.get("EMPRESA_ID") != null ? parametros.get("EMPRESA_ID").toString() : "";
				String puntoVentaID = parametros.get("NUMPUNTOVENTA").equals("-1") ? "" : parametros.get("NUMPUNTOVENTA").toString();
				String sqlTotaisVendas = getSqlDadosTotaisdeVenda(empresaID,puntoVentaID);

				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sqlTotaisVendas);

				stmt.setTimestamp("DATA_INICIAL", new Timestamp(DateUtil.inicioFecha((Date) parametros.get("DATA_INICIAL")).getTime()));
				stmt.setTimestamp("DATA_FINAL", new Timestamp(DateUtil.fimFecha((Date) parametros.get("DATA_FINAL")).getTime()));

				if(empresaID != null && !empresaID.equals("")){
					stmt.setInt("EMPRESA_ID", Integer.parseInt(empresaID));
				}
				
				ResultSet rset = stmt.executeQuery();
				lsDadosRelatorio = new ArrayList<RelatorioComissaoSinteticoBean>();
				
				while (rset.next()) {
					
					Integer comissaoID =  rset.getInt("comissao_id");
					Date dataEvento  = rset.getDate("data_evento");
					Integer agenciaID = rset.getInt("agencia_id");
					Integer retEmpresaID = rset.getInt("empresa_id");
					String puntoVenta = rset.getString("punto_venta");
					
					BigDecimal totalPassgens 	= trataCampoNull (rset.getBigDecimal("total_venda")) ;
					BigDecimal comissaoBPR 	 	= trataCampoNull (rset.getBigDecimal("comissao_venda"));
					BigDecimal totalvendaGap  	= trataCampoNull (rset.getBigDecimal("total_imp_posterior"));
					BigDecimal comissaoGAP	 	= trataCampoNull (rset.getBigDecimal("comissao_gap"));
					BigDecimal totalImpressa 	= trataCampoNull (rset.getBigDecimal("total_entrega_passagems"));
					BigDecimal comissaoImpressa = trataCampoNull (rset.getBigDecimal("comissao_impressao"));
					BigDecimal totalExBagagem 	= trataCampoNull (rset.getBigDecimal("total_excesso_bagagem"));
					BigDecimal comissaoExcBagem = trataCampoNull (rset.getBigDecimal("comissao_excesso_bagagem")); 
					BigDecimal totalOutros 		= trataCampoNull (rset.getBigDecimal("total_outros"));
					BigDecimal comissaoOutros   = trataCampoNull (rset.getBigDecimal("comissao_outros")); 
					BigDecimal totalSeguroOP	= trataCampoNull (rset.getBigDecimal("total_seguro_opcional")); 
					BigDecimal comissaoSeguroOP = trataCampoNull (rset.getBigDecimal("comissao_seguro_opcional"));
					BigDecimal totalRecarga 	= trataCampoNull (rset.getBigDecimal("total_recarga_celular"));
					BigDecimal comissaoRecarga 	= trataCampoNull (rset.getBigDecimal("comissao_regarga_celular"));
					BigDecimal totalVendaBruta 	= trataCampoNull (rset.getBigDecimal("total_venda_bruta"));
					BigDecimal comissaoFinal    = trataCampoNull (rset.getBigDecimal("comissao_registrada_CC"));
					
					RelatorioComissaoSinteticoBean comissaoBean = new RelatorioComissaoSinteticoBean();
					
					comissaoBean.setComissaoID(comissaoID);
					comissaoBean.setDataEvento(dataEvento);
					comissaoBean.setPontoVendaID(agenciaID);
					comissaoBean.setEmpresaID(retEmpresaID);
					comissaoBean.setPontoVenda(puntoVenta);
					comissaoBean.setTotalTarifa(totalPassgens);
					comissaoBean.setComissaoTarifa(comissaoBPR);
					comissaoBean.setTotalVendaGAP(totalvendaGap);
					comissaoBean.setComissaoGAP(comissaoGAP);
					comissaoBean.setTotalImpGAP(totalImpressa);
					comissaoBean.setComissaoImpGAP(comissaoImpressa);
					comissaoBean.setTotalExcBagagem(totalExBagagem);
					comissaoBean.setComissaoExcBagagem(comissaoExcBagem);
					comissaoBean.setTotalOutros(totalOutros);
					comissaoBean.setComissaoOutros(comissaoOutros);
					comissaoBean.setTotalSegOpcional(totalSeguroOP);
					comissaoBean.setComissaoSegOpcional(comissaoSeguroOP);
					comissaoBean.setTotalRecargaCell(totalRecarga);
					comissaoBean.setComissaoRecargaCell(comissaoRecarga);
					comissaoBean.setTotalReceitaBruta(totalVendaBruta);
					comissaoBean.setComissaoTotal(comissaoFinal);
					
					lsDadosRelatorio.add(comissaoBean);
					}
				
				setLsDadosRelatorio(lsDadosRelatorio);
				}
			});
	}
	
	
	private String getSqlDadosTotaisdeVenda(String empresa, String agencia) {
	
		StringBuilder sql = new StringBuilder(3400);
		
		sql.append("SELECT																						");
		sql.append("	cm.comissao_id,																			");
		sql.append("	cm.datamovimento    			as data_evento,											");
		sql.append("	cm.puntoventa_id				as agencia_id,											");
		sql.append("	cm.empresa_id 					as empresa_id,											");
		sql.append("	pv.nombpuntoventa   			as punto_venta,											");
		sql.append("	cm.receita_BPR      			as total_venda, 										");
		sql.append("	cm.comissao_BPR     			as comissao_venda, 										");
		sql.append("	cm.receita_gap      			as total_imp_posterior, 								");
		sql.append("	cm.comissao_gap     			as comissao_gap,										");
		sql.append("	cm.tarifa_entregas_passagem 	as total_entrega_passagems, 							");
		sql.append("	cm.entregas_passagem 			as comissao_impressao,									"); 
		sql.append("	cm.receita_bruta_excessobagagem as total_excesso_bagagem,								");
		sql.append("	cm.receita_excessobagagem 		as comissao_excesso_bagagem,							");
		sql.append("	cm.receita_bruta_outros 		as total_outros, 										");
		sql.append("	cm.receita_outros 				as comissao_outros, 									");
		sql.append("	cm.receita_bruta_seguroopcional as total_seguro_opcional, 								");
		sql.append("	cm.receita_seguroopcional 		as comissao_seguro_opcional, 							");
		sql.append("	cm.receita_bruta_recargacelular as total_recarga_celular, 								");
		sql.append("	cm.receita_recargacelular 		as comissao_regarga_celular, 							");
		sql.append("	cm.receita_bruta_tarifa 		as total_venda_bruta,									");
		sql.append("	cc.importe						as comissao_registrada_CC								");

		sql.append(" FROM ");
		sql.append("   comissao    cm																			");
		sql.append("   LEFT JOIN punto_venta pv ON ( cm.puntoventa_id = pv.puntoventa_id AND pv.activo = 1 )	");
		sql.append("   LEFT JOIN (SELECT importe, puntoventa_id, empresa_id, fechoroperacion FROM conta_corrente_ptovta  		");
		sql.append("                WHERE feccorte BETWEEN :DATA_INICIAL AND :DATA_FINAL 						");
		if (!agencia.isEmpty()) {
			sql.append("                   AND puntoventa_id in  ("+agencia+")									");
		}
		if (!empresa.isEmpty()) {
			sql.append("                   AND empresa_id = :EMPRESA_ID											");
		}
		sql.append("                   AND activo = 1       												    ");
		sql.append("                   AND tipooperacioncc_id = 5) cc on (cc.empresa_id = cm.empresa_id 		");
		sql.append(" 												and cc.puntoventa_id = pv.puntoventa_id		");
		sql.append(" 												and cc.fechoroperacion = cm.datamovimento	");
		sql.append(" 												and importe is not null)       				");
		sql.append(" WHERE ");
		sql.append("  	cm.datamovimento  BETWEEN :DATA_INICIAL AND :DATA_FINAL 								");
		if (!agencia.isEmpty()) {
			sql.append("    AND cm.puntoventa_id in ("+agencia+")												");
		}
		if (!empresa.isEmpty()) {
			sql.append("    AND cm.empresa_id = :EMPRESA_ID														");
		}
		sql.append("    AND cm.activo = 1                														");
		sql.append(" ORDER  BY pv.nombpuntoventa,  cm.datamovimento 											");
		
		return sql.toString();
	}
	
	public void setLsDadosRelatorio(List<RelatorioComissaoSinteticoBean> lsDadosRelatorio) {
		this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio));
		this.lsDadosRelatorio = lsDadosRelatorio;
	}
	
	private BigDecimal trataCampoNull(BigDecimal campo) {
		if (campo == null) {
			return BigDecimal.ZERO;
		}
		return campo;
	}

	@Override
	protected void processaParametros() throws Exception {
	}
	
}