package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
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.relatorios.utilitarios.RelatorioVendasRequisicaoBean;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

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

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

	private List<RelatorioVendasRequisicaoBean> lsDadosRelatorio;
	
	private String fecInicio;
	private String fecFinal;
	private Integer empresaId;
	private Integer puntoventaId;
	private Integer secretariaId;
	private boolean agruparCliente;

	public RelatorioVendasRequisicaoDetalhado(Map<String, Object> parametros, Connection conexao, boolean agruparCliente) throws Exception {
		super(parametros, conexao);
		
		this.agruparCliente = agruparCliente;

		this.setCustomDataSource(new DataSource(this) {

			@Override
			public void initDados() throws Exception {
				Map<String, Object> parametros = this.relatorio.getParametros();
				fecInicio = parametros.get("dataFiltroInicial").toString();
				fecFinal = parametros.get("dataFiltroFinal").toString();
				if(parametros.get("EMPRESA_ID")!=null){
					empresaId =  Integer.valueOf(parametros.get("EMPRESA_ID").toString());
				}
				if(parametros.get("PUNTOVENTA_ID")!=null){
					puntoventaId =  Integer.valueOf(parametros.get("PUNTOVENTA_ID").toString());
				}
				if(parametros.get("SECRETARIA_ID")!=null){
					secretariaId =  Integer.valueOf(parametros.get("SECRETARIA_ID").toString());
				}

				Connection conexao = this.relatorio.getConexao();
				processarVendasRequisicao(conexao);
				
				setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio));
			}

		});
	}
	
	private void processarVendasRequisicao(Connection conexao) {
		ResultSet rset = null;
		NamedParameterStatement stmt = null;
		
		try {
			
			stmt = carregarNamedParameterStatement(conexao);
			rset = stmt.executeQuery();
			processarResultado(rset);				
			fecharConexaoBanco(conexao, stmt, rset);

		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		
	}
	
	private void fecharConexaoBanco(Connection conexao, NamedParameterStatement stmt, ResultSet rset) {
		try {
			if(rset != null && !rset.isClosed()) {
				rset.close();
			}
			if(stmt != null && !stmt.isClosed()) {
				stmt.close();
			}
			if(conexao != null && !conexao.isClosed()) {
				conexao.close();
			}
		} catch (SQLException e) {
			log.error(e.getMessage(), e);
		}
	}

	private void processarResultado(ResultSet rset) throws SQLException {
		if(lsDadosRelatorio == null) {
			lsDadosRelatorio = new ArrayList<RelatorioVendasRequisicaoBean>();
		}
		
		while (rset.next()) {
			RelatorioVendasRequisicaoBean bean = new RelatorioVendasRequisicaoBean();
			bean.setNumdocumento(rset.getString("REQUISICAO"));
			bean.setSecretariaId(rset.getInt("SECRETARIA_ID"));
			bean.setDescsecretaria(rset.getString("DESCSECRETARIA"));
			bean.setPuntoventaId(rset.getInt("PUNTOVENTA_ID"));
			bean.setBpe(rset.getInt("BPE"));
			bean.setPassageiro(rset.getString("nombpasajero"));
			bean.setDataVenda(rset.getDate("FECHORVENTA"));
			bean.setNombpuntoventa(rset.getString("NOMBPUNTOVENTA"));
			bean.setNombempresa(rset.getString("NOMBEMPRESA"));
			bean.setEmpresaId(rset.getInt("EMPRESA_ID"));
			bean.setOrigemId(rset.getString("ORIGEM_ID"));
			bean.setOrigem(rset.getString("ORIGEM"));
			bean.setDestinoId(rset.getString("DESTINO_ID"));
			bean.setDestino(rset.getString("DESTINO"));
			bean.setImporte(rset.getBigDecimal("IMPORTE"));
			
			if (agruparCliente) {
				bean.setDescricaogrupo(bean.getSecretariaId() + "- " + bean.getDescsecretaria());
			} else {
				bean.setDescricaogrupo(bean.getNombpuntoventa());
			}

			lsDadosRelatorio.add(bean);
		}
		
	}
	
	private NamedParameterStatement carregarNamedParameterStatement(Connection conexao) throws SQLException {
		String sql = getSql();
		log.info(sql);
		
		NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);
		
		if(fecInicio != null) {
			stmt.setString("fecInicio", fecInicio);
		}
		if(fecFinal != null) {
			stmt.setString("fecFinal", fecFinal);
		}
		if(empresaId != null) {
			stmt.setInt("EMPRESA_ID", empresaId);
		}
		if(puntoventaId != null && puntoventaId > -1) {
			stmt.setInt("PUNTOVENTA_ID", puntoventaId);
		}
		if(secretariaId != null && secretariaId > -1) {
			stmt.setInt("SECRETARIA_ID", secretariaId);
		}
		
		return stmt;
	}

	protected String getSql() {

		StringBuilder sQuery = new StringBuilder();
		sQuery.append("SELECT CDP.NUMDOCUMENTO AS REQUISICAO, SEC.CVESECRETARIA AS SECRETARIA_ID, SEC.DESCSECRETARIA, ORI.CVEPARADA AS ORIGEM_ID, ORI.DESCPARADA  AS ORIGEM, DES.CVEPARADA AS DESTINO_ID, DES.DESCPARADA   AS DESTINO, PV.PUNTOVENTA_ID AS PUNTOVENTA_ID, PV.NOMBPUNTOVENTA, E.NOMBEMPRESA, E.EMPRESA_ID, FP.DESCPAGO AS DESCPAGO, CFP.FORMAPAGO_ID, bpe.nbp as BPE, c.nombpasajero, C.FECHORVENTA, ")
			  .append(" CASE WHEN C.MOTIVOCANCELACION_ID IS NULL THEN COUNT(*)  ELSE  COUNT(*)  * -1 end AS qtde, ") 
		      .append(" SUM( CASE WHEN C.MOTIVOCANCELACION_ID IS NULL THEN cfp.importe ELSE  cfp.importe * -1 end) AS importe ")
			  .append("FROM CAJA C ")
			  .append("JOIN PARADA ORI ON ORI.PARADA_ID = C.ORIGEN_ID ")
			  .append("JOIN PARADA DES ON DES.PARADA_ID = C.DESTINO_ID ")
			  .append("JOIN CAJA_FORMAPAGO CFP ON CFP.CAJA_ID = C.CAJA_ID AND CFP.ACTIVO = 1 ")
			  .append("LEFT JOIN CAJA_DET_PAGO CDP ON CDP.CAJAFORMAPAGO_ID = CFP.CAJAFORMAPAGO_ID AND CDP.ACTIVO = 1 ")
			  .append("JOIN SECRETARIA SEC ON CDP.OPCIONAL1 = SEC.SECRETARIA_ID ")
			  .append("JOIN FORMA_PAGO FP ON FP.FORMAPAGO_ID = CFP.FORMAPAGO_ID ")
			  .append("JOIN MARCA M ON C.MARCA_ID = M.MARCA_ID ")
			  .append("JOIN EMPRESA E ON E.EMPRESA_ID = M.EMPRESA_ID ")
			  .append("JOIN PUNTO_VENTA PV ON PV.PUNTOVENTA_ID = C.PUNTOVENTA_ID ")
			  .append("LEFT JOIN BPE bpe on ( c.transacao_id = bpe.boleto_id ) ")
			  .append("WHERE (FP.FORMAPAGO_ID = 11 OR FP.TIPO_PAGO = 6) ")
			  .append("AND C.ACTIVO = 1 ")
			  .append("AND C.INDREIMPRESION = 0 ");
			  
		if(fecInicio != null) {
			sQuery.append("AND NVL(C.FECHORVENTA_H,C.FECHORVENTA) >= TO_DATE(:fecInicio, 'dd/mm/yyyy hh24:mi') ");
		}
		if(fecFinal != null) {
			sQuery.append("AND NVL(C.FECHORVENTA_H,C.FECHORVENTA) <= TO_DATE(:fecFinal, 'dd/mm/yyyy hh24:mi') ");
		}
		if(empresaId != null) {
			sQuery.append("AND E.EMPRESA_ID = :EMPRESA_ID ");
		}
		if(puntoventaId != null && puntoventaId > -1) {
			sQuery.append("AND C.PUNTOVENTA_ID = :PUNTOVENTA_ID ");
		}
		if(secretariaId != null && secretariaId > -1) {
			sQuery.append("AND SEC.SECRETARIA_ID = :SECRETARIA_ID ");
		}
		
		sQuery.append("GROUP BY CDP.NUMDOCUMENTO, SEC.CVESECRETARIA, SEC.DESCSECRETARIA,PV.NOMBPUNTOVENTA, PV.NOMBPUNTOVENTA, E.NOMBEMPRESA, E.EMPRESA_ID, FP.DESCPAGO, CFP.FORMAPAGO_ID, ORI.DESCPARADA, DES.DESCPARADA, CFP.IMPORTE, ORI.CVEPARADA, DES.CVEPARADA, PV.PUNTOVENTA_ID, C.MOTIVOCANCELACION_ID, bpe.NBP, c.nombpasajero, C.FECHORVENTA ");
		
		if (agruparCliente) {
			sQuery.append("ORDER BY SEC.DESCSECRETARIA, PV.NOMBPUNTOVENTA, FP.DESCPAGO");
		} else {
			sQuery.append("ORDER BY PV.NOMBPUNTOVENTA, SEC.DESCSECRETARIA, ori.cveparada, des.cveparada ");
		}
		
		return sQuery.toString();
		
	}
	
	@Override
	protected void processaParametros() throws Exception {
	}
	
	public List<RelatorioVendasRequisicaoBean> getLsDadosRelatorio() {
		return lsDadosRelatorio;
	}
	
	@Override
	public String getNome() {
		return super.getNome();
	}

}
