package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

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

import org.apache.commons.lang.StringUtils;

import com.rjconsultores.ventaboletos.relatorios.utilitarios.Checkin;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;

public class RelatorioCheckin extends Relatorio {

	public RelatorioCheckin(Map<String, Object> parametros, Connection conexao) {
		super(parametros, conexao);
	}
	
	List<Integer> lsInt;

	@Override
	protected void processaParametros() throws Exception {

		Integer corridaId = (Integer) getParametros().get("CORRIDA_ID");
		Integer origenId = (Integer) getParametros().get("ORIGEN_ID");
		String idsBilheteiros = (String) getParametros().get("IDS_BILHETEIROS");
		Date fecInicio = (Date) getParametros().get("DATA_INICIAL");
		Date fecFinal = (Date) getParametros().get("DATA_FINAL");
		
		if (StringUtils.isNotBlank(idsBilheteiros)) {
			String []ls = idsBilheteiros.split(",");
			lsInt = new ArrayList<Integer>();
			for(String i : ls){
				lsInt.add(new Integer(Integer.parseInt(i.trim())));
			}
		}

		String sql = getSql(corridaId, origenId, idsBilheteiros);

		PreparedStatement pstmt = getConexao().prepareStatement(sql);
		
		int index = 1;
		pstmt.setTimestamp(index++, new java.sql.Timestamp(fecInicio.getTime()));
		pstmt.setTimestamp(index++, new java.sql.Timestamp(fecFinal.getTime()));

		if (corridaId != null) {
			pstmt.setInt(index++, corridaId);
		}

		if (origenId != null) {
			pstmt.setInt(index++, origenId);
		}
		
		if (StringUtils.isNotBlank(idsBilheteiros)) {
			for(int i = 0 ; i < lsInt.size() ; i++){
				pstmt.setInt(index++, lsInt.get(i));//Object("idsBilheteiros", lsInt.toArray());
			}
		}

		List<Checkin> checkins = new ArrayList<Checkin>();

		ResultSet rset = pstmt.executeQuery();
		while (rset.next()) {

			Checkin checkin = new Checkin();
			checkin.setBoletoId(rset.getLong("boleto_Id"));
			checkin.setNumFolioSistema(rset.getString("numoperacion"));
			checkin.setOrigen(rset.getString("descparada"));
			checkin.setCorridaId(rset.getInt("corrida_id"));
			checkin.setFeccorrida(rset.getTimestamp("feccorrida"));
			checkin.setDataVenda(rset.getTimestamp("datavenda"));
			checkin.setDataCancelado(rset.getTimestamp("datacancelado"));
			checkin.setDataRemarcacao(rset.getTimestamp("dataremarcacao"));
			checkin.setNombUsuario(rset.getString("nombusuario"));
			checkin.setCveusuario(rset.getString("cveusuario"));

			checkins.add(checkin);
		}

		setLsDadosRelatorio(checkins);
	}

	public void setLsDadosRelatorio(List<Checkin> checkins) {
		this.setCollectionDataSource(new JRBeanCollectionDataSource(checkins));
	}

	private String getSql(Integer corridaId, Integer origenId, String idsBilheteiros) {

		StringBuffer sql = new StringBuffer();
		sql.append("select b.boleto_id, o.descparada, b.corrida_id, ");
		sql.append("case when b.numfoliosistema is not null  ");
		sql.append("          then b.numfoliosistema else b.numoperacion end  numoperacion, ");
		sql.append("b.feccorrida, bc.datavenda, bc.datacancelado, bc.dataremarcacao, u.nombusuario, u.cveusuario ");
		sql.append("from boleto b ");
		sql.append("inner join boleto_checkin bc on b.boleto_id = bc.boletooriginal_id ");
		sql.append("inner join parada o on b.origen_id = o.parada_id ");
		sql.append("inner join usuario u on b.usuario_id = u.usuario_id ");
		sql.append(" where b.activo = 1  ");
		sql.append("and b.feccorrida between ? and  ? ");
		sql.append(corridaId == null ? "" : " and b.corrida_id = ? ");
		sql.append(origenId == null ? "" : " and b.origen_id = ? ");
		sql.append((lsInt == null || lsInt.size() == 0) ? "" : " and u.USUARIO_ID in ( "+ createIn(lsInt.size()) + ") ");
		sql.append(" order by bc.datacancelado desc");

		return sql.toString();
	}
	
	public String createIn(int n) {
		if(n > 0){
			String str = StringUtils.repeat(" ? ,", n);
		    return str.substring(0, str.length()-1);
		}else{
			return "";
		}
		
	}

}
