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.Date;
import java.util.List;
import java.util.Map;

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

import com.rjconsultores.ventaboletos.relatorios.utilitarios.DataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioCorridasBean;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

public class RelatorioCorridas extends Relatorio {

	private List<RelatorioCorridasBean> lsDadosRelatorio;

	public RelatorioCorridas(Map<String, Object> parametros, Connection conexao) throws Exception {
		super(parametros, conexao);

		this.setCustomDataSource(new DataSource(this) {
			@Override
			public void initDados() throws Exception {

				Connection conexao = this.relatorio.getConexao();
				Map<String, Object> parametros = this.relatorio.getParametros();

				NamedParameterStatement nps = new NamedParameterStatement(conexao, getSql());
				nps.setInt("numServico", (Integer) parametros.get("CORRIDA_ID"));
				nps.setInt("empresaId", Integer.valueOf((String) parametros.get("EMPRESA_ID")));
				nps.setDate("inicioViagem", (java.sql.Date) parametros.get("DATA_DE"));
				nps.setDate("fimViagem", (java.sql.Date) parametros.get("DATA_ATE"));
				nps.setInt("origemId", (Integer) parametros.get("ORIGEN_ID"));
				nps.setInt("destinoId", (Integer) parametros.get("DESTINO_ID"));

				ResultSet rset = nps.executeQuery();

				List<RelatorioCorridasBean> ls = new ArrayList<RelatorioCorridasBean>();

				while (rset.next()) {

					RelatorioCorridasBean corrida = new RelatorioCorridasBean();
					corrida.setServico(((BigDecimal) rset.getObject("servico")) == null ? null : ((BigDecimal) rset.getObject("servico")).intValue());
					corrida.setOrigem((String) rset.getObject("origem"));
					corrida.setDestino((String) rset.getObject("destino"));
					corrida.setPoltrona((String) rset.getObject("poltrona"));
					corrida.setPassagem((String) rset.getObject("passagem"));
					corrida.setNomePassageiro((String) rset.getObject("nomePassageiro"));
					corrida.setNomeUsuario((String) rset.getObject("nomeUsuario"));
					corrida.setTipoVenda((String) rset.getObject("tipoVenda"));
					corrida.setPontoVenda((String) rset.getObject("pontoVenda"));
					corrida.setCategoria((String) rset.getObject("categoria"));
					corrida.setImporteTaxaEmbarque((BigDecimal) rset.getObject("importeTaxaEmbarque"));
					corrida.setImportePedagio((BigDecimal) rset.getObject("importePedagio"));
					corrida.setImporteOutros((BigDecimal) rset.getObject("importeOutros"));
					corrida.setImporteSeguro((BigDecimal) rset.getObject("importeSeguro"));
					corrida.setPrecioPagado((BigDecimal) rset.getObject("precioPagado"));
					corrida.setNumKmViaje((BigDecimal) rset.getObject("numKmViaje"));
					corrida.setClaseServicio((String) rset.getObject("claseServicio"));
					corrida.setDataVenda((Date) rset.getObject("dataVenda"));
					corrida.setDataViaje((Date) rset.getObject("dataViaje"));

					BigDecimal tassas = BigDecimal.ZERO;
					tassas = tassas.add(corrida.getImporteOutros() != null ? corrida.getImporteOutros() : BigDecimal.ZERO);
					tassas = tassas.add(corrida.getImportePedagio() != null ? corrida.getImportePedagio() : BigDecimal.ZERO);
					tassas = tassas.add(corrida.getImporteSeguro() != null ? corrida.getImporteSeguro() : BigDecimal.ZERO);
					tassas = tassas.add(corrida.getImporteTaxaEmbarque() != null ? corrida.getImporteTaxaEmbarque() : BigDecimal.ZERO);
					corrida.setPrecioTaxas(tassas);

					BigDecimal precoTotal = BigDecimal.ZERO;
					precoTotal = precoTotal.add(corrida.getPrecioTaxas() != null ? corrida.getPrecioTaxas() : BigDecimal.ZERO);
					precoTotal = precoTotal.add(corrida.getPrecioPagado() != null ? corrida.getPrecioPagado() : BigDecimal.ZERO);
					corrida.setPreco(precoTotal);

					ls.add(corrida);
				}

				setLsDadosRelatorio(ls);

			}
		});
	}

	private String getSql() {
		StringBuilder sb = new StringBuilder();
		sb.append("select b.corrida_id           as servico, ");
		sb.append("       porigen.descparada     as origem, ");
		sb.append("       pdestino.descparada    as destino, ");
		sb.append("       b.numasiento           as poltrona, ");
		sb.append("       b.numfoliosistema      as passagem, ");
		sb.append("       b.nombpasajero         as nomePassageiro, ");
		sb.append("       u.nombusuario          as nomeUsuario, ");
		sb.append("       tv.desctipoventa       as tipoVenda, ");
		sb.append("       pv.nombpuntoventa      as pontoVenda, ");
		sb.append("       b.fechorventa          as dataVenda, ");
		sb.append("       b.fechorviaje          as dataViaje, ");
		sb.append("       c.desccategoria        as categoria, ");
		sb.append("       b.importetaxaembarque  as importeTaxaEmbarque, ");
		sb.append("       b.importepedagio       as importePedagio, ");
		sb.append("       b.importeoutros        as importeOutros, ");
		sb.append("       b.importeseguro        as importeSeguro, ");
		sb.append("       b.preciopagado         as precioPagado, ");
		sb.append("       b.numkmviaje           as numKmViaje, ");
		sb.append("       cs.descclase           as claseServicio ");
		sb.append("from boleto b ");
		sb.append("       left join marca m on m.marca_id = b.marca_id ");
		sb.append("       left join empresa e on e.empresa_id = m.empresa_id ");
		sb.append("       left join usuario u on u.usuario_id = b.usuario_id ");
		sb.append("       left join parada porigen on b.origen_id = porigen.parada_id ");
		sb.append("       left join parada pdestino on b.destino_id = pdestino.parada_id ");
		sb.append("       left join tipo_venta tv on b.tipoventa_id = tv.tipoventa_id ");
		sb.append("       left join punto_venta pv on b.puntoventa_id = pv.puntoventa_id ");
		sb.append("       left join categoria c on b.categoria_id = c.categoria_id ");
		sb.append("       left join clase_servicio cs on b.claseservicio_id = cs.claseservicio_id ");
		sb.append("where  b.activo = 1 ");
		sb.append("   and b.motivocancelacion_id is null ");
		sb.append("   and b.origen_id = :origemId   ");
		sb.append("   and b.destino_id = :destinoId ");
		sb.append("   and e.empresa_id = :empresaId ");
		sb.append("   and b.corrida_id = :numServico ");
		sb.append("   and b.feccorrida between :inicioViagem and :fimViagem  ");
		sb.append("   order by b.motivocancelacion_id, b.fechorventa ");

		return sb.toString();
	}

	@Override
	protected void processaParametros() throws Exception {
	}

	public List<RelatorioCorridasBean> getLsDadosRelatorio() {
		return lsDadosRelatorio;
	}

	public void setLsDadosRelatorio(List<RelatorioCorridasBean> lsDadosRelatorio) {
		this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio));
		this.lsDadosRelatorio = lsDadosRelatorio;
	}

}
