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 RelatorioVendasCartoesAlternativo extends Relatorio {

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

	List<RelatorioVendasCartoesBean> list = null;

	public RelatorioVendasCartoesAlternativo(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"));

						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("       trunc(caja.datavenda) as dataVenda, ");
		sb.append("       sum(caja.preco) as valor ");
		sb.append("FROM");
		sb.append("  (SELECT 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("   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("   LEFT JOIN caja_det_pago cdp ON (c.caja_id = cdp.caja_id and cdp.cajaformapago_id = cfp.cajaformapago_id)");
		sb.append("   LEFT 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("   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 ");

		sb.append("		UNION ");
		sb.append("		SELECT ");
		sb.append("    		fp.descpago           as descpago, ");
		sb.append("    		ct.fecoperacion       as dataoperacao, ");
		sb.append("    		ct.numautorizacion    as autorizacao, ");
		sb.append("    		coalesce(ct.cantparcelas, 1) as qtdparcelas, ");
		sb.append("    		coalesce(c.fechorventa, cd.fechorvta) as datavenda, ");
		sb.append("    		case when cdp.importe < 0 and fp.formapago_id in (3, 2) then 0 else cdp.importe end as preco ");
		sb.append("  	FROM caja_diversos cd ");
		sb.append("  		JOIN caja_diversos_pago cdp on cdp.cajadiversos_id = cd.cajadiversos_id ");
		sb.append("  		INNER JOIN forma_pago fp on fp.formapago_id = cdp.formapago_id ");
		sb.append("  		INNER JOIN evento_extra ee on ee.eventoextra_id = cd.eventoextra_id ");
		sb.append("  		LEFT JOIN  boleto c on c.boleto_id = ee.boleto_id ");
		sb.append("  		LEFT JOIN caja_tarjeta ct on ( cdp.cajatarjeta_id = ct.cajatarjeta_id) ");
		sb.append("  	WHERE cd.activo = 1  ");
		sb.append(" 		AND (ee.boleto_id is null or ee.boleto_id = c.boleto_id) ");
		sb.append("  		AND fp.formapago_id in (3, 2) ");

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

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

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

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

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

		if (dataFinal != null && buscarPorDataDaVenda) {
			sb.append(" AND cd.fechorvta <= TO_DATE(:dataFinal, 'DD/MM/YYYY HH24:MI:SS') ");
		} else if (dataInicial != null && !buscarPorDataDaVenda) {
			sb.append(" AND cd.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("   ) caja   ");

		sb.append("GROUP BY caja.descpago,");
		sb.append("         to_char(caja.dataoperacao, 'ddMMyyyy'),");
		sb.append("         caja.autorizacao,");
		sb.append("         caja.qtdparcelas,");
		sb.append("         trunc(caja.datavenda) ");
		sb.append("ORDER BY caja.descpago, trunc(caja.datavenda), caja.autorizacao");

		return sb.toString();
	}

}
