
package com.rjconsultores.ventaboletos.relatorios.impl;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.ResultSet;
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.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Estacion;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.entidad.Usuario;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioVendasCartoesBean;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

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

public class RelatorioVendasCartoes extends Relatorio {

	private static Logger log = LogManager.getLogger(RelatorioVendasCartoes.class);

	List<RelatorioVendasCartoesBean> list = null;

	public RelatorioVendasCartoes(Map<String, Object> parametros, Connection conexao, final Boolean buscarPorDataDaVenda) throws Exception {
		super(parametros, conexao);

		this.setCustomDataSource(new DataSource(this) {

			public void initDados() throws Exception {
				Connection conexao = this.relatorio.getConexao();
				Map<String, Object> parametros = this.relatorio.getParametros();

				NamedParameterStatement stmt = null;
				ResultSet rset = null;

				String dataInicial = parametros.get("DATA_INICIAL").toString() + " 00:00:00";
				String dataFinal = parametros.get("DATA_FINAL").toString() + " 23:59:59";
				Empresa empresa = (Empresa) parametros.get("EMPRESA");
				PuntoVenta puntoVenta = (PuntoVenta) parametros.get("PUNTOVENTA");
				Usuario usuario = (Usuario) parametros.get("USUARIO");
				Estacion estacao = (Estacion) parametros.get("ESTACION");
				String tipoAgencias = (String) parametros.get("TIPOPUNTOVENTA");

				String sql = getSql(dataInicial, dataFinal, empresa, puntoVenta, tipoAgencias, usuario, estacao, buscarPorDataDaVenda);
				log.info("query= " + sql);

				try {
					stmt = new NamedParameterStatement(conexao, sql);

					if (empresa != null) {
						stmt.setInt("empresaId", empresa.getEmpresaId());
					}
					if (puntoVenta != null) {
						stmt.setInt("puntoventaId", puntoVenta.getPuntoventaId());
					}
					if (dataInicial != null) {
						stmt.setString("dataInicial", dataInicial);
					}
					if (dataFinal != null) {
						stmt.setString("dataFinal", dataFinal);
					}
					if (estacao != null) {
						stmt.setInt("estacionId", estacao.getEstacionId());
					}
					if (usuario != null) {
						stmt.setInt("usuarioId", usuario.getUsuarioId());
					}

					rset = stmt.executeQuery();

					list = new ArrayList<RelatorioVendasCartoesBean>();
					BigDecimal valorTotal = BigDecimal.ZERO;
					while (rset.next()) {

						RelatorioVendasCartoesBean bean = new RelatorioVendasCartoesBean();

						bean.setDataVenda(rset.getDate("dataVenda"));
						bean.setDataOperacao(rset.getString("dataOperacao") != null ? DateUtil.getDateFromString(rset.getString("dataOperacao"), "ddMMyy") : null);
						bean.setDescPagamento(rset.getString("descPagamento") != null ? rset.getString("descPagamento") : null);
						bean.setValor(rset.getBigDecimal("valor") != null ? rset.getBigDecimal("valor") : null);
						bean.setAutorizacao(rset.getString("autorizacao") != null ? rset.getString("autorizacao") : null);
						bean.setQtdParcelas(rset.getInt("qtdParcelas"));
						bean.setNumeroPuntoVenta(rset.getString("numeroPuntoVenta"));
						bean.setNomePuntoVenta(rset.getString("nomePuntoVenta") != null ? rset.getString("nomePuntoVenta") : null);
						bean.setDescOperadoraCartao(rset.getString("descOperadoraCartao") != null ? rset.getString("descOperadoraCartao") : null);
						bean.setNSU(rset.getString("nsu") != null ? rset.getString("nsu") : null);
						bean.setNumeroCartao(rset.getString("numeroCartao") != null ? rset.getString("numeroCartao") : null);
						bean.setBandeira(rset.getString("bandeira") != null ? rset.getString("bandeira") : null);
						bean.setEstabelecimento(rset.getString("estabelecimento") != null ? rset.getString("estabelecimento") : null);
						bean.setTerminal(rset.getString("terminal") != null ? rset.getString("terminal") : null);
						valorTotal = valorTotal.add(bean.getValor() != null ? bean.getValor() : BigDecimal.ZERO);
						bean.setValorTotal(valorTotal);

						list.add(bean);
					}

				} catch (Exception e) {
					log.error(e.getMessage(), e);
				} finally {
					if (rset != null && !rset.isClosed()) {
						rset.close();
					}
					if (stmt != null && !stmt.isClosed()) {
						stmt.close();
					}
				}
			}
		});

		this.setCollectionDataSource(new JRBeanCollectionDataSource(list));
	}

	// private RelatorioVendasCartoesBean calcTotalValor(RelatorioVendasCartoesBean bean) {
	// BigDecimal valorTotal = bean.getValorTotal().add(bean.getValorTotal());
	// bean.setValorTotal(valorTotal);
	// return bean;
	// }

	@Override
	protected void processaParametros() throws Exception {
	}

	private String getSql(String dataInicial, String dataFinal, Empresa empresa, PuntoVenta puntoVenta, String tipoAgencias, Usuario usuario, Estacion estacion, Boolean buscarPorDataDaVenda) {

		StringBuilder sb = new StringBuilder();

		sb.append("SELECT caja.descpago as descPagamento,");
		sb.append("       to_char(caja.dataoperacao, 'ddMMyyyy') as dataOperacao,");
		sb.append("       caja.autorizacao as autorizacao,");
		sb.append("       coalesce(caja.qtdparcelas, 1) as qtdParcelas ,");
		sb.append("       caja.datavenda as dataVenda, ");
		sb.append("       sum(caja.preco) as valor, ");
		sb.append(" caja.numeroPuntoVenta as numeroPuntoVenta, ");
		sb.append(" caja.nomePuntoVenta as nomePuntoVenta, ");
		sb.append("  caja.descoperadoracartao as descOperadoraCartao,");
		sb.append("  caja.NSU as nsu,");
		sb.append(" caja.numeroCartao as numeroCartao, ");
		sb.append(" caja.bandeira as bandeira, ");
		sb.append(" caja.estabelecimento as estabelecimento, ");
		sb.append(" caja.terminal as terminal ");
		sb.append("FROM");
		sb.append("  (SELECT DISTINCT fp.descpago AS descpago,");
		sb.append("          ct.fecoperacion AS dataoperacao,");
		sb.append("          ct.numautorizacion AS autorizacao,");
		sb.append("          ct.cantparcelas AS qtdparcelas,");
		sb.append("          c.fechorventa AS datavenda,");
		sb.append("          case when c.motivocancelacion_id is null then cfp.importe else cfp.importe * -1 end AS preco,");
		sb.append(" pt.numpuntoventa as numeroPuntoVenta, ");
		sb.append("pt.nombpuntoventa as nomePuntoVenta, ");
		sb.append("ct.descoperadoracartao as descoperadoracartao, ");
		sb.append("ct.nsu as NSU, ");
		sb.append(" ct.numtarjeta as numeroCartao,  ");
		sb.append(" ct.tipotarjeta as bandeira,  ");
		sb.append(" est.numcaja as estabelecimento,  ");
		sb.append(" estSitef.numpdv as terminal  ");
		sb.append("   FROM caja c");
		sb.append("   INNER JOIN caja_formapago cfp ON c.caja_id=cfp.caja_id AND cfp.activo = 1 ");
		sb.append("   INNER JOIN marca ma on ma.marca_id = c.marca_id ");
		sb.append("   INNER JOIN forma_pago fp ON cfp.formapago_id=fp.formapago_id");
		sb.append("   INNER JOIN caja_det_pago cdp ON (c.caja_id = cdp.caja_id and cdp.cajaformapago_id = cfp.cajaformapago_id)");
		sb.append("   INNER JOIN caja_tarjeta ct ON (ct.cajadetpago_id = cdp.cajadetpago_id)");
		sb.append("   INNER JOIN punto_venta pt ON (pt.puntoventa_id = c.puntoventa_id) ");
		sb.append("   INNER JOIN estacion est ON (est.estacion_id = c.estacion_id) ");
		sb.append("   LEFT JOIN estacion_sitef  estsitef ON ( estsitef.estacion_id = c.estacion_id and estsitef.activo = 1) ");
		sb.append("   WHERE c.indreimpresion = 0 ");

		if (empresa != null) {
			sb.append("and ma.empresa_id = :empresaId ");
		}

		if (puntoVenta != null) {
			sb.append("AND c.puntoventa_id = :puntoventaId ");
		}

		if (estacion != null) {
			sb.append("AND c.estacion_id = :estacionId ");
		}

		if (usuario != null) {
			sb.append(" and c.usuario_id = :usuarioId ");
		}

		if (dataInicial != null && buscarPorDataDaVenda) {
			sb.append("AND c.fechorventa >= TO_DATE(:dataInicial, 'DD/MM/YYYY HH24:MI:SS') ");
		} else if (dataInicial != null && !buscarPorDataDaVenda) {
			sb.append("AND c.feccorte >= TO_DATE(:dataInicial, 'DD/MM/YYYY HH24:MI:SS') ");
		}

		if (dataFinal != null && buscarPorDataDaVenda) {
			sb.append("AND c.fechorventa <= TO_DATE(:dataFinal, 'DD/MM/YYYY HH24:MI:SS') ");
		} else if (dataInicial != null && !buscarPorDataDaVenda) {
			sb.append("AND c.feccorte <= TO_DATE(:dataFinal, 'DD/MM/YYYY HH24:MI:SS') ");
		}

		sb.append(tipoAgencias.equals("-1") || tipoAgencias.equals("TODAS") ? "" : " and  pt.tipoptovta_id not in  (" + tipoAgencias + ") ");

		sb.append("     AND fp.formapago_id IN(2,3)");
		sb.append("     AND c.activo = 1) caja ");
		sb.append("GROUP BY caja.descpago,");
		sb.append("         to_char(caja.dataoperacao, 'ddMMyyyy'),");
		sb.append("         caja.autorizacao,");
		sb.append("         caja.qtdparcelas,");
		sb.append("         caja.datavenda,  ");
		sb.append(" caja.numeroPuntoVenta , ");
		sb.append(" caja.nomePuntoVenta, ");
		sb.append(" caja.descoperadoracartao, ");
		sb.append("  caja.NSU, ");
		sb.append(" caja.numeroCartao, ");
		sb.append(" caja.bandeira, ");
		sb.append(" caja.estabelecimento, ");
		sb.append(" caja.terminal ");
		sb.append("ORDER BY caja.nomePuntoVenta, caja.datavenda ");

		return sb.toString();
	}

}
