package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.IndOrdenacion;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioOCDBean;
import com.rjconsultores.ventaboletos.utilerias.OcdUtil;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

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

public class RelatorioOCDReembolsoPix extends Relatorio {

	private List<RelatorioOCDReembolsoPixBean> lsDadosRelatorio;

	public RelatorioOCDReembolsoPix(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 fecInicio = parametros.get("fecInicio") != null ? parametros.get("fecInicio").toString() + " 00:00" : null;
				String fecFinal = parametros.get("fecFinal") != null ? parametros.get("fecFinal").toString() + " 23:59" : null;
				String fecPagoInicio = parametros.get("fecPagoInicio") != null ? parametros.get("fecPagoInicio").toString() + " 00:00" : null;
				String fecPagoFinal = parametros.get("fecPagoFinal") != null ? parametros.get("fecPagoFinal").toString() + " 23:59" : null;
				List<PuntoVenta> lsPuntoVenta = parametros.get("puntoventas") == null ? new ArrayList<PuntoVenta>() : (ArrayList<PuntoVenta>) parametros.get("puntoventas");
				
				String puntoVentas = null;
				for (PuntoVenta pv : lsPuntoVenta) {
					if (lsPuntoVenta.indexOf(pv) == 0) {
						puntoVentas = "" + pv.getPuntoventaId();
					} else {
						puntoVentas += ", " + pv.getPuntoventaId();
					}
				}
				
				String localizador = parametros.get("numOperacao").toString();
				String numoperacion = null;
				Long ocdId = null;
				if(OcdUtil.validarLocalizadorOcd(localizador)) {
					numoperacion = OcdUtil.getNumOcdByLocalizadorOcd(localizador);
					ocdId = OcdUtil.getOcdIdByLocalizadorOcd(localizador);
				}
				
				Integer empresaId = parametros.get("empresa") != null ? Integer.parseInt(parametros.get("empresa").toString()) : null;

				IndOrdenacion ordenacion = (IndOrdenacion) parametros.get("ordenacion");

				String sql = getSql(fecInicio, fecFinal, empresaId, ordenacion, numoperacion, ocdId, fecPagoInicio, fecPagoFinal, puntoVentas);

				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);
				ResultSet rset = null;

				if(StringUtils.isNotBlank(fecInicio)) {
					stmt.setString("fecInicio", fecInicio);
				}
				
				if(StringUtils.isNotBlank(fecFinal)) {
					stmt.setString("fecFinal", fecFinal);
				}
				
				if(StringUtils.isNotBlank(fecPagoInicio)) {
					stmt.setString("fecPagoInicio", fecPagoInicio);
				}
				
				if(StringUtils.isNotBlank(fecPagoFinal)) {
					stmt.setString("fecPagoFinal", fecPagoFinal);
				}
				
				if (empresaId != null) {
					stmt.setInt("empresaId", empresaId);
				}
				
				if(ocdId != null){
					stmt.setLong("ocdId", ocdId);
				}

				rset = stmt.executeQuery();

				lsDadosRelatorio = new ArrayList<RelatorioOCDReembolsoPixBean>();

				while (rset.next()) {
//					RelatorioOCDBean ocdBean = new RelatorioOCDBean();
					RelatorioOCDReembolsoPixBean ocdBean = new RelatorioOCDReembolsoPixBean();
				
					ocdBean.setFecinc(rset.getDate("FECINC"));
					ocdBean.setFechorventa(rset.getDate("FECHORVENTA"));
					ocdBean.setEmpresa(rset.getString("NOMBEMPRESA"));
					ocdBean.setNombpuntoventa(rset.getString("PV_VENDA") != null ? rset.getString("PV_VENDA") : "");
					ocdBean.setNombpuntoventainc(rset.getString("PV_OCD") != null ? rset.getString("PV_OCD") : "");					
					ocdBean.setNombusuarioinc(rset.getString("USUARIOINC") != null ? rset.getString("USUARIOINC") : "");
					ocdBean.setNumoperacion(rset.getString("NUMOPERACION"));
					ocdBean.setPenalizacion(rset.getBigDecimal("PENALIZACION"));
					ocdBean.setValorOcd(rset.getBigDecimal("VALOR_OCD"));
					ocdBean.setAsiento(rset.getString("NUMASIENTO"));
					ocdBean.setOrigem(rset.getString("ORIGEM"));
					ocdBean.setDestino(rset.getString("DESTINO"));
					ocdBean.setNumfoliosistema(rset.getString("NUMFOLIOSISTEMA"));
					ocdBean.setFeccorrida(rset.getDate("FECCORRIDA"));
					ocdBean.setOcdId(rset.getLong("OCD_ID"));
					ocdBean.setMotivocancelacionId(rset.getInt("MOTIVOCANCELACION_ID"));
					ocdBean.setTotalBilhete(rset.getBigDecimal("TOTAL_BILHETE"));
					ocdBean.setNumoperacion(OcdUtil.generaLocalizadorOCD(ocdBean.getNumoperacion(), ocdBean.getOcdId()));
					ocdBean.setNomePix(rset.getString("NOME_PIX"));
					ocdBean.setCpfCnpjPix(rset.getString("CPF_CNPJ_PIX"));
					ocdBean.setTelefonePix(rset.getString("TELEFONE_PIX"));
					ocdBean.setTipoChavePix(rset.getString("TIPO_CHAVE_PIX"));
					ocdBean.setChavePix(rset.getString("CHAVE_PIX"));
					lsDadosRelatorio.add(ocdBean);
				}

				if (lsDadosRelatorio.size() > 0) {

					setLsDadosRelatorio(lsDadosRelatorio);
				}
			}
		});
	}

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

	@Override
	protected void processaParametros() throws Exception {
	}

	private String getSql(String fecInicio, String fecFinal, Integer empresaId, IndOrdenacion ordenacion, String numoperacion, Long ocdId,
					String fecPagoInicio, String fecPagoFinal, String puntoVentas) {
		StringBuffer sql = new StringBuffer();

		sql.append("SELECT O.OCD_ID, O.NUMOPERACION, E.NOMBEMPRESA, B.NUMFOLIOSISTEMA, ");
		sql.append("O.FECINC, PVO.NOMBPUNTOVENTA AS PV_OCD, O.PENALIZACION, O.VALOR_ESTORNO_PIX AS VALOR_OCD, ");
		sql.append("PVV.NOMBPUNTOVENTA AS PV_VENDA, B.FECHORVENTA, B.FECCORRIDA, ORI.DESCPARADA AS ORIGEM, DES.DESCPARADA AS DESTINO, B.NUMASIENTO, ");
		sql.append("B.MOTIVOCANCELACION_ID, ");
		sql.append("UI.CVEUSUARIO AS USUARIOINC, ");
		sql.append("NVL(B.PRECIOPAGADO,0) + NVL(B.IMPORTETAXAEMBARQUE,0) + NVL(B.IMPORTEOUTROS,0) + NVL(B.IMPORTEPEDAGIO,0) + NVL(B.IMPORTESEGURO,0) AS TOTAL_BILHETE, ");
		sql.append("ECP.NOME AS NOME_PIX, ECP.CPF_CNPJ AS CPF_CNPJ_PIX, ECP.TELEFONE AS TELEFONE_PIX, ECP.TIPO_CHAVE_PIX AS TIPO_CHAVE_PIX, ECP.CHAVE_PIX AS CHAVE_PIX " );
		sql.append("FROM OCD O ");
		sql.append("JOIN ESTORNO_OCD_PIX ECP ON ECP.OCD_ID=O.OCD_ID ");
		sql.append("JOIN BOLETO B ON B.BOLETO_ID = O.BOLETO_ID ");
		sql.append("JOIN MARCA M ON B.MARCA_ID = M.MARCA_ID ");
		sql.append("JOIN EMPRESA E ON E.EMPRESA_ID = M.EMPRESA_ID ");
		sql.append("JOIN PUNTO_VENTA PVO ON PVO.PUNTOVENTA_ID = O.PUNTOVENTA_ID ");
		sql.append("LEFT JOIN PARADA ORI ON ORI.PARADA_ID = B.ORIGEN_ID ");
		sql.append("LEFT JOIN PARADA DES ON DES.PARADA_ID = B.DESTINO_ID ");
		sql.append("LEFT JOIN PUNTO_VENTA PVV ON PVV.PUNTOVENTA_ID = B.PUNTOVENTA_ID ");
		sql.append("LEFT JOIN USUARIO UI ON UI.USUARIO_ID = O.USUARIO_ID ");
		sql.append("WHERE O.ACTIVO = 1 ");
		
		sql.append(puntoVentas == null ? "" : "AND PVO.PUNTOVENTA_ID IN (" + puntoVentas + ") ");
		
		if(StringUtils.isNotBlank(fecInicio)) {
			sql.append("AND O.FECINC >= TO_DATE(:fecInicio,'DD/MM/YYYY HH24:MI') ");
		}
		
		if(StringUtils.isNotBlank(fecFinal)) {
			sql.append("AND O.FECINC <= TO_DATE(:fecFinal,'DD/MM/YYYY HH24:MI') ");
		}
		
		if(StringUtils.isNotBlank(fecPagoInicio)) {
			sql.append("AND O.FECPAGO >= TO_DATE(:fecPagoInicio,'DD/MM/YYYY HH24:MI') ");
		}
		
		if(StringUtils.isNotBlank(fecPagoFinal)) {
			sql.append("AND O.FECPAGO <= TO_DATE(:fecPagoFinal,'DD/MM/YYYY HH24:MI') ");
		}

		if (empresaId != null) {
			sql.append(" and M.EMPRESA_ID = :empresaId ");
		}
		
		if(StringUtils.isNotBlank(numoperacion)){
			sql.append(" and O.NUMOPERACION like '%"+numoperacion+"%' ");
		}
		
		if(ocdId != null){
			sql.append(" and O.OCD_ID = :ocdId ");
		}
		sql.append(" ORDER BY ");
		switch (ordenacion) {
		case NUM_OPERACION:
			sql.append(" O.NUMOPERACION ");
			break;
		case FECHA_CREACION:
			sql.append(" O.FECINC ");
			break;
		case FECHA_PAGAMENTO:
			sql.append(" O.FECPAGO ");
			break;
		default:
			sql.append(" B.NUMFOLIOSISTEMA ");
			break;
		}

		return sql.toString();
	}
}