package com.rjconsultores.ventaboletos.relatorios.impl;

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

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.rjconsultores.ventaboletos.constantes.TipoEventoExtra;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioVendasParcelamentoBean;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

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

public class RelatorioVendasParcelamento extends Relatorio {

	private static Logger log = LogManager.getLogger(RelatorioVendasParcelamento.class);
	
	private List<RelatorioVendasParcelamentoBean> lsDadosRelatorio;

	public RelatorioVendasParcelamento(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").toString() + " 00:00:00";
				String fecFinal = parametros.get("fecFinal").toString() + " 23:59:59";
				String parcInicio = parametros.get("parInicial").toString();
				String parcFinal = parametros.get("parFinal").toString();
				String empresa = parametros.get("empresa") != null ? parametros.get("empresa").toString() : "-1";
				String empresaNome = parametros.get("empresaNome") != null ? parametros.get("empresaNome").toString() : "";
				String puntoVenta = parametros.get("NUMPUNTOVENTA") != null ? parametros.get("NUMPUNTOVENTA").toString() : null;
				
				lsDadosRelatorio = new ArrayList<RelatorioVendasParcelamentoBean>();

				String sql = carregarVendasComParcelamento(puntoVenta, empresa);

				log.debug(sql);

				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);
				ResultSet rset1 = null;
				SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");

				stmt.setTimestamp("de", new java.sql.Timestamp(sdf.parse(fecInicio).getTime()));
				stmt.setTimestamp("ate", new java.sql.Timestamp(sdf.parse(fecFinal).getTime()));
				
				stmt.setInt("parcIni", Integer.parseInt(parcInicio));
				stmt.setInt("parcFim", Integer.parseInt(parcFinal));

				if (empresa != null && !empresa.equals("-1")) {
					stmt.setInt("empresaId", Integer.parseInt(empresa));
				}
				
				stmt.setString("juros", TipoEventoExtra.JUROS_CARTAO_CREDITO.toString());

				rset1 = stmt.executeQuery();

				while (rset1.next()) {

					RelatorioVendasParcelamentoBean vendasParcelamento = new RelatorioVendasParcelamentoBean();
					BigDecimal percentual = BigDecimal.ZERO;

					vendasParcelamento.setEmpresaNome(empresaNome);
					vendasParcelamento.setEmpresa(rset1.getString("empresa"));
					vendasParcelamento.setAgencia(rset1.getString("agencia"));
					vendasParcelamento.setBilheteiro(rset1.getString("bilheteiro"));
					vendasParcelamento.setDataVenda((Date) rset1.getObject("dataVenda"));
					vendasParcelamento.setDataServico((Date) rset1.getObject("dataServico"));
					vendasParcelamento.setLinha(rset1.getString("linha"));
					vendasParcelamento.setServico(rset1.getString("servico"));
					vendasParcelamento.setOrigem(rset1.getString("origem"));
					vendasParcelamento.setDestino(rset1.getString("destino"));
					vendasParcelamento.setBilhete(rset1.getString("bilhete"));
					vendasParcelamento.setPreImpresso(rset1.getString("preImpresso"));
					vendasParcelamento.setPoltrona(rset1.getString("poltrona"));
					vendasParcelamento.setTarifa(rset1.getBigDecimal("tarifa"));
					vendasParcelamento.setSeguro(rset1.getBigDecimal("seguro"));
					vendasParcelamento.setPedagio(rset1.getBigDecimal("pedagio"));
					vendasParcelamento.setTaxa(rset1.getBigDecimal("taxa"));
					vendasParcelamento.setOutros(rset1.getBigDecimal("outros"));
					vendasParcelamento.setTotal(rset1.getBigDecimal("total"));
					vendasParcelamento.setFormaPagamento(rset1.getString("formaPagamento"));
					vendasParcelamento.setAutorizacao(rset1.getString("autorizacao"));
					vendasParcelamento.setNsu(rset1.getString("nsu"));
					vendasParcelamento.setParcelas(rset1.getString("parcelas"));
					
					BigDecimal juros = rset1.getBigDecimal("juros");
					vendasParcelamento.setJuros(juros != null ? juros : BigDecimal.ZERO);
					
					BigDecimal valor = rset1.getBigDecimal("valor");
					vendasParcelamento.setValor(valor != null ? valor : BigDecimal.ZERO);

					if (vendasParcelamento.getValor() != null && vendasParcelamento.getTotal() != null
							&& vendasParcelamento.getValor().doubleValue() != 0 && vendasParcelamento.getTotal().doubleValue() != 0) {
						percentual = (vendasParcelamento.getValor().multiply(new BigDecimal("100")));
						percentual = (percentual.divide(vendasParcelamento.getTotal(), BigDecimal.ROUND_HALF_UP));
					}
					vendasParcelamento.setPercentual(percentual.setScale(2));

					lsDadosRelatorio.add(vendasParcelamento);
				}
				
				rset1.close();

				if (lsDadosRelatorio.size() > 0) {

					setLsDadosRelatorio(lsDadosRelatorio);
				}

			}
		});
	}

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

	@Override
	protected void processaParametros() throws Exception {
	}

	private String carregarVendasComParcelamento(String puntoVenta, String empresa) {

		StringBuilder sql = new StringBuilder();
		sql.append(" SELECT m.DESCMARCA AS empresa, ");
		sql.append("    pv.PUNTOVENTA_ID AS agencia, ");
		sql.append("    c.NUMOPERACION, ");
		sql.append("    u.CVEUSUARIO AS bilheteiro, ");
		sql.append("    c.FECHORVENTA AS dataVenda, ");
		sql.append("    co.FECCORRIDA AS dataServico, ");
		sql.append("    r.NUMRUTA AS linha, ");
		sql.append("    co.corrida_id AS servico, ");
		sql.append("    orig.DESCPARADA AS origem, ");
		sql.append("    dest.DESCPARADA AS destino, ");
		sql.append("    c.NUMFOLIOSISTEMA AS bilhete, ");
		sql.append("    c.NUMFOLIOPREIMPRESO AS preImpresso, ");
		sql.append("    c.NUMASIENTO AS poltrona, ");
		sql.append("    COALESCE(c.PRECIOPAGADO,0) AS tarifa, ");
		sql.append("    COALESCE(c.IMPORTESEGURO,0) AS seguro, ");
		sql.append("    COALESCE(c.IMPORTEPEDAGIO,0) AS pedagio, ");
		sql.append("    COALESCE(c.IMPORTETAXAEMBARQUE,0) AS taxa, ");
		sql.append("    COALESCE(c.IMPORTEOUTROS,0) AS outros, ");
		sql.append("    ( COALESCE(c.IMPORTESEGURO,0)+ COALESCE(c.IMPORTEOUTROS,0) + COALESCE(c.IMPORTEPEDAGIO,0) +COALESCE(IMPORTETAXAEMBARQUE ,0)+COALESCE(c.PRECIOPAGADO,0)) AS total, ");
		sql.append("    ct.tipotarjeta AS formaPagamento, ");
		sql.append("    ct.numautorizacion AS autorizacao, ");
		sql.append("    ct.NSU AS nsu, ");
		sql.append("    ct.cantparcelas AS parcelas, ");
		sql.append("    ct.importe AS valor, ");
		sql.append("    coalesce(case when tee.cvetipoevento = :juros then ee.impingreso else 0 end, 0) as juros ");
		
		sql.append(" FROM caja c ");
		sql.append("    INNER JOIN PUNTO_VENTA pv ON c.PUNTOVENTA_ID = pv.PUNTOVENTA_ID ");
		sql.append("    INNER JOIN marca m ON m.marca_id = c.marca_id ");
		sql.append("    INNER JOIN usuario u ON c.USUARIO_ID = u.USUARIO_ID ");
		sql.append("    INNER JOIN ruta r ON c.RUTA_ID = r.RUTA_ID ");
		sql.append("    INNER JOIN corrida co ON co.corrida_id = c.corrida_id AND co.feccorrida = c.feccorrida ");
		sql.append("    INNER JOIN parada orig ON orig.PARADA_ID = co.ORIGEN_ID ");
		sql.append("    INNER JOIN parada dest ON dest.PARADA_ID = co.DESTINO_ID ");
		sql.append("    INNER JOIN caja_formapago cfp ON cfp.caja_id = c.caja_id ");
		sql.append("    INNER JOIN caja_det_pago cdp ON cdp.cajaformapago_id = cfp.cajaformapago_id ");
		sql.append("    INNER JOIN caja_tarjeta ct ON ct.cajadetpago_id = cdp.cajadetpago_id ");
		sql.append("    LEFT  JOIN evento_extra ee ON (ee.boleto_id = c.TRANSACAO_ID) ");
		sql.append("    LEFT  JOIN tipo_evento_extra tee on tee.tipoeventoextra_id = ee.tipoeventoextra_id ");
		sql.append(" WHERE ");
		sql.append("    fechorventa BETWEEN :de AND :ate ");
		sql.append("    AND ct.CANTPARCELAS BETWEEN :parcIni AND :parcFim ");
		if (puntoVenta != null && !puntoVenta.equals("-1")) {
			sql.append("    AND c.PUNTOVENTA_ID in (" + puntoVenta + ") ");
		}

		if (empresa != null && !empresa.equals("-1")) {
			sql.append(" AND m.empresa_id     = :empresaId ");
		}
		sql.append("    AND c.motivocancelacion_id IS NULL ");
		sql.append(" ORDER BY c.NUMOPERACION,  ");
		sql.append("    c.fechorventa ASC,	 ");
		sql.append("    m.DESCMARCA,  ");
		sql.append(" 	pv.PUNTOVENTA_ID,  ");
		sql.append(" 	u.cveusuario ");
		 

		return sql.toString();

	}

}
