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 org.apache.commons.lang.StringUtils;

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

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

public class RelatorioVendasPercurso extends Relatorio {
	
	private List<PuntoVenta> lsPuntoVenta;
	private Date fecInicio;
	private Date fecFinal;
	private Estacion estacion;
	private Integer corridaId;

	public RelatorioVendasPercurso(Connection conexao, List<PuntoVenta> lsPuntoVenta, Date fecInicio, Date fecFinal, Estacion estacion, Integer corridaId) {
		super(new HashMap<String, Object>(), conexao);
		this.lsPuntoVenta = lsPuntoVenta;
		this.fecInicio = fecInicio;
		this.fecFinal = fecFinal;
		this.estacion = estacion;
		this.corridaId = corridaId;
	}

	@Override
	protected void processaParametros() throws Exception {
		
		NamedParameterStatement namedParameterStatement = new NamedParameterStatement(getConexao(), getSql());
		
		List<Integer> lsPuntoVentaId = new ArrayList<Integer>();
		List<String> lsNombPuntoVenta = new ArrayList<String>();
		for (PuntoVenta puntoVenta : lsPuntoVenta) {
			lsPuntoVentaId.add(puntoVenta.getPuntoventaId());
			lsNombPuntoVenta.add(puntoVenta.getNombpuntoventa());
		}
		namedParameterStatement.setString("lsPuntoVentaId", StringUtils.join(lsPuntoVentaId.toArray(), ','));
		this.parametros.put("lsNombPuntoVenta", StringUtils.join(lsNombPuntoVenta.toArray(new String[0]), ", "));
		
		namedParameterStatement.setInt("estacionId", estacion.getEstacionId());
		this.parametros.put("estacion", estacion.toString());
		
		SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
		if (fecInicio != null) {
			namedParameterStatement.setDate("fecInicio", new java.sql.Date(fecInicio.getTime()));
			this.parametros.put("fecInicio", dateFormat.format(fecInicio));
		}
		
		if (fecFinal != null) {
			namedParameterStatement.setDate("fecFinal", new java.sql.Date(fecFinal.getTime()));
			this.parametros.put("fecFinal", dateFormat.format(fecFinal));
		}
		
		if (corridaId != null) {
			namedParameterStatement.setString("corridaId", "%" + corridaId + "%");
		}
		
		ResultSet resultSet = namedParameterStatement.executeQuery();
		List<RelatorioVendasPercursoBean> resultBean = transformResultSet(resultSet);
		setCollectionDataSource(new JRBeanCollectionDataSource(resultBean));
		
	}

	private List<RelatorioVendasPercursoBean> transformResultSet(ResultSet resultSet) throws SQLException {
		List<RelatorioVendasPercursoBean> resultBean = new ArrayList<RelatorioVendasPercursoBean>();
		while (resultSet.next()) {
			RelatorioVendasPercursoBean bean = new RelatorioVendasPercursoBean();
			bean.setCorridaId(resultSet.getInt("CORRIDA_ID"));
			bean.setNumFolioSistema(resultSet.getString("NUMFOLIOSISTEMA"));
			bean.setOrigen(resultSet.getString("ORIGEN"));
			bean.setDestino(resultSet.getString("DESTINO"));
			bean.setValor(resultSet.getBigDecimal("VALOR"));
			resultBean.add(bean);
		}
		return resultBean;
	}
	
	private String getSql() {
		
		StringBuilder sql = new StringBuilder("SELECT C.CORRIDA_ID, C.NUMFOLIOSISTEMA, O.DESCPARADA ORIGEN, D.DESCPARADA DESTINO, "
				+ "(C.PRECIOPAGADO + C.IMPORTETAXAEMBARQUE + C.IMPORTESEGURO + C.IMPORTEPEDAGIO + C.IMPORTEOUTROS) AS VALOR "
				+ "FROM CAJA C "
				+ "JOIN PARADA O ON C.ORIGEN_ID = O.PARADA_ID "
				+ "JOIN PARADA D ON C.DESTINO_ID = D.PARADA_Id "
				+ "WHERE "
				+ "USUARIOREMOTO_ID IS NOT NULL "
				+ "AND INDREMOTOINVERSO = 1 "
				+ "AND C.PUNTOVENTA_ID IN(:lsPuntoVentaId) "
				+ "AND C.ESTACION_ID = :estacionId ");
		
		if (fecInicio != null) {
			sql.append("AND C.FECHORVENTA >= :fecInicio ");
		}
		
		if (fecFinal != null) {
			sql.append("AND C.FECHORVENTA <= :fecFinal ");
		}
		
		if (corridaId != null) {
			sql.append("AND C.CORRIDA_ID LIKE :corridaId ");
		}
		
		return sql.toString();
		
	}

}
