package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioBaixasVendasInternetBean;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

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

public class RelatorioBaixasVendasInternet extends Relatorio {

	private Date fecInicio;
	private Date fecFinal;
	private PuntoVenta puntoVenta;
	
	public RelatorioBaixasVendasInternet(Connection conexao, Date fecInicio, Date fecFinal, PuntoVenta puntoVenta) {
		super(new HashMap<String, Object>(), conexao);
		this.fecInicio = fecInicio;
		this.fecFinal = fecFinal;
		this.puntoVenta = puntoVenta;
	}

	@Override
	protected void processaParametros() throws Exception {
		
		NamedParameterStatement namedParameterStatement = new NamedParameterStatement(getConexao(), getSql());

		if (puntoVenta != null && puntoVenta.getPuntoventaId() != null && puntoVenta.getPuntoventaId() != -1) {
			namedParameterStatement.setInt("puntoVentaId", puntoVenta.getPuntoventaId());
			this.parametros.put("nombPuntoVenta", puntoVenta.getNombpuntoventa());
		}

		SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
		this.parametros.put("fecInicio", dateFormat.format(fecInicio));
		this.parametros.put("fecFinal", dateFormat.format(fecFinal));
		namedParameterStatement.setDate("fecInicio", new java.sql.Date(fecInicio.getTime()));
		namedParameterStatement.setDate("fecFinal", new java.sql.Date(fecFinal.getTime()));

		ResultSet resultSet = namedParameterStatement.executeQuery();
		List<RelatorioBaixasVendasInternetBean> resultBean = transformResultSet(resultSet);
		setCollectionDataSource(new JRBeanCollectionDataSource(resultBean));

	}

	private List<RelatorioBaixasVendasInternetBean> transformResultSet(ResultSet resultSet) throws SQLException {
		List<RelatorioBaixasVendasInternetBean> resultBean = new ArrayList<RelatorioBaixasVendasInternetBean>();
		while (resultSet.next()) {
			RelatorioBaixasVendasInternetBean bean = new RelatorioBaixasVendasInternetBean();
			bean.setFecImpresion(resultSet.getTimestamp("FECCREACION"));
			bean.setNumFolioSistema(resultSet.getString("NUMFOLIOSISTEMA"));
			bean.setOrigen(resultSet.getString("ORIGEN"));
			bean.setDestino(resultSet.getString("DESTINO"));
			bean.setValor(resultSet.getBigDecimal("VALOR"));
			bean.setUsuarioId(resultSet.getInt("USUARIO_ID"));
			bean.setNombUsuario(resultSet.getString("NOMBUSUARIO"));
			bean.setValorPago(resultSet.getBigDecimal("VALOR_PAGO"));
			resultBean.add(bean);
		}
		return resultBean;
	}

	private String getSql() {

		String sql = "";

		if (puntoVenta != null && puntoVenta.getPuntoventaId() != null && puntoVenta.getPuntoventaId() != -1) {
			sql = "SELECT DISTINCT B.FECCREACION, B.NUMFOLIOSISTEMA, "
					+ "U.USUARIO_ID, U.NOMBUSUARIO, O.DESCPARADA ORIGEN, D.DESCPARADA DESTINO, "
					+ "COALESCE(COALESCE(B.PRECIOPAGADO, 0) + COALESCE(B.IMPORTETAXAEMBARQUE, 0) + COALESCE(B.IMPORTESEGURO, 0) + COALESCE(B.IMPORTEPEDAGIO, 0) + COALESCE(B.IMPORTEOUTROS, 0), 0) AS VALOR, "
					+ "B.PRECIOPAGADO as VALOR_PAGO "
					+ "FROM BOLETO B "
					+ "JOIN PARADA O ON B.ORIGEN_ID = O.PARADA_ID "
					+ "JOIN PARADA D ON B.DESTINO_ID = D.PARADA_ID "
					+ "JOIN USUARIO U ON B.USUARIO_ID = U.USUARIO_ID "
					+ "WHERE B.INDSTATUSBOLETO = 'E' "
					+ "AND B.FECCREACION BETWEEN :fecInicio AND :fecFinal "
					+ "AND PUNTOVENTA_ID = :puntoVentaId "
					+ "ORDER BY U.USUARIO_ID ";
		} else {
			sql = "SELECT DISTINCT B.FECCREACION, B.NUMFOLIOSISTEMA, "
					+ "U.USUARIO_ID, U.NOMBUSUARIO, O.DESCPARADA ORIGEN, D.DESCPARADA DESTINO, "
					+ "COALESCE(COALESCE(B.PRECIOPAGADO, 0) + COALESCE(B.IMPORTETAXAEMBARQUE, 0) + COALESCE(B.IMPORTESEGURO, 0) + COALESCE(B.IMPORTEPEDAGIO, 0) + COALESCE(B.IMPORTEOUTROS, 0), 0) AS VALOR, "
					+ "B.PRECIOPAGADO as VALOR_PAGO "
					+ "FROM BOLETO B "
					+ "JOIN PARADA O ON B.ORIGEN_ID = O.PARADA_ID "
					+ "JOIN PARADA D ON B.DESTINO_ID = D.PARADA_ID "
					+ "JOIN USUARIO U ON B.USUARIO_ID = U.USUARIO_ID "
					+ "WHERE B.INDSTATUSBOLETO = 'E' "
					+ "AND B.FECCREACION BETWEEN :fecInicio AND :fecFinal "
					+ "ORDER BY U.USUARIO_ID ";
		}

		return sql;

	}

}