package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
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.RelatorioEmpresaOnibusBean;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioGratuidadeBean;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

public class RelatorioGratuidade extends Relatorio {

	private List<RelatorioGratuidadeBean> lsDadosRelatorio;
	
	public RelatorioGratuidade(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();

				String fecInicio = parametros.get("fecInicio").toString() + " 00:00:00";
				String fecFinal = parametros.get("fecFinal").toString() + " 23:59:59";
				String empresa = parametros.get("empresa") != null ? parametros.get("empresa").toString() : "";
				String agencia = parametros.get("agencia") != null ? parametros.get("agencia").toString() : "";
				String ruta = parametros.get("ruta") != null ? parametros.get("ruta").toString() : "";
				String origem = parametros.get("origem") != null ? parametros.get("origem").toString() : "";
				String destino = parametros.get("destino") != null ? parametros.get("destino").toString() : "";
				String categoria = parametros.get("categoria") != null ? parametros.get("categoria").toString() : "";
						
				String sql = getSql(empresa, agencia, ruta, fecInicio, fecFinal, origem, destino, categoria);
		
				System.out.println(sql);
		
				SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);
				stmt.setTimestamp("fecInicio", new java.sql.Timestamp(sdf.parse(fecInicio).getTime()));
				stmt.setTimestamp("fecFinal", new java.sql.Timestamp(sdf.parse(fecFinal).getTime()));
				if(empresa != null && !empresa.equals("")){
					stmt.setInt("empresa_id", Integer.parseInt(empresa));
				}
				if(agencia != null && !agencia.equals("")){
					stmt.setInt("puntoventa_id", Integer.parseInt(agencia));
				}
				if(ruta != null && !ruta.equals("")){
					stmt.setInt("ruta_id", Integer.parseInt(ruta));
				}
				if(origem != null && !origem.equals("")){
					stmt.setInt("origem_id", Integer.parseInt(origem));
				}
				if(destino != null && !destino.equals("")){
					stmt.setInt("destino_id", Integer.parseInt(destino));
				}
				if(categoria != null && !categoria.equals("")){
					stmt.setInt("categoria_id", Integer.parseInt(categoria));
				}
				
				ResultSet rset = null;
		
				rset = stmt.executeQuery();
		
				lsDadosRelatorio = new ArrayList<RelatorioGratuidadeBean>();
				
				while (rset.next()) {
					RelatorioGratuidadeBean gratuidadeBean = new RelatorioGratuidadeBean();
					gratuidadeBean.setCorridaId(rset.getString("corrida_id"));
					gratuidadeBean.setCveusuario(rset.getString("cveusuario"));
					gratuidadeBean.setDescnumdoc(rset.getString("descnumdoc"));
					gratuidadeBean.setDesctipoventa(rset.getString("desctipoventa"));
					gratuidadeBean.setDestino(rset.getString("destino"));
					gratuidadeBean.setFeccorrida(rset.getDate("feccorrida"));
					gratuidadeBean.setFechorviaje(rset.getTime("fechorviaje"));
					gratuidadeBean.setKm(rset.getInt("numkmviaje"));
					gratuidadeBean.setLinha(rset.getString("descruta"));
					gratuidadeBean.setNombpasajero(rset.getString("nombpasajero"));
					gratuidadeBean.setNombpuntoventa(rset.getString("nombpuntoventa"));
					gratuidadeBean.setOrigen(rset.getString("origen"));
					gratuidadeBean.setPorccategoria(rset.getBigDecimal("porccategoria"));
					gratuidadeBean.setPreciooriginal(rset.getBigDecimal("preciooriginal"));
					gratuidadeBean.setPreciopagado(rset.getBigDecimal("preciopagado"));
					gratuidadeBean.setNombempresa(rset.getString("nombempresa"));
					lsDadosRelatorio.add(gratuidadeBean);
				}
				
				if (lsDadosRelatorio.size() > 0) {
					setLsDadosRelatorio(lsDadosRelatorio);
				}
			}
		});
	}
	
	public void setLsDadosRelatorio(List<RelatorioGratuidadeBean> lsDadosRelatorio) {
		this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio));
		this.lsDadosRelatorio = lsDadosRelatorio;
	}

	@Override
	protected void processaParametros() throws Exception {
	}
	
	private String getSql(String empresa, String agencia, String ruta, String fecInicio, String fecFinal, String origem, String destino, String categoria) {
		StringBuffer sql = new StringBuffer();
		sql.append("SELECT b.feccorrida, ori.cveparada origen, des.cveparada destino, ");
		sql.append("b.numkmviaje, r.descruta, b.corrida_id, b.fechorviaje, ");
		sql.append("tv.desctipoventa, b.nombpasajero, b.descnumdoc, tar.preciooriginal, ");
		sql.append("b.porccategoria, b.preciopagado, u.cveusuario, ag.nombpuntoventa, e.nombempresa ");
		sql.append("FROM boleto b ");
		sql.append("JOIN categoria c ON b.categoria_id = c.categoria_id ");
		sql.append("JOIN grupo_categoria gc ON c.grupocategoria_id = gc.grupocategoria_id ");
		sql.append("JOIN parada ori ON ori.parada_id = b.origen_id ");
		sql.append("JOIN parada des ON des.parada_id = b.destino_id ");
		sql.append("JOIN ruta r ON r.ruta_id = b.ruta_id ");
		sql.append("JOIN tipo_venta tv ON tv.tipoventa_id = b.tipoventa_id ");
		sql.append("JOIN punto_venta ag ON ag.puntoventa_id = b.puntoventa_id ");
		sql.append("JOIN usuario u ON u.usuario_id = b.usuario_id ");
		sql.append("JOIN vigencia_tarifa vt ON b.feccorrida BETWEEN vt.feciniciovigencia AND vt.fecfinvigencia ");
		sql.append("JOIN tarifa tar ON (tar.ruta_id = b.ruta_id ");
		sql.append("    AND tar.marca_id = b.marca_id ");
		sql.append("    AND tar.claseservicio_id = b.claseservicio_id ");
		sql.append("    AND tar.vigenciatarifa_id = vt.vigenciatarifa_id ");
		sql.append("    AND tar.origen_id = b.origen_id ");
		sql.append("    AND tar.destino_id = b.destino_id) ");
		sql.append("JOIN empresa e ON e.empresa_id = b.empresacorrida_id ");
		sql.append("WHERE ");
		sql.append("    gc.grupocategoria_id IN (1,2,3,4) ");
		sql.append("AND b.feccorrida BETWEEN :fecInicio AND :fecFinal ");
		sql.append("AND b.motivocancelacion_id IS NULL ");
		if (!empresa.isEmpty()){
			sql.append("AND b.empresacorrida_id = :empresa_id  ");
		}
		if (!agencia.isEmpty()){
			sql.append("       AND b.puntoventa_id = :puntoventa_id  ");
		}
		if (!ruta.isEmpty()){
			sql.append("       AND b.ruta_id = :ruta_id  ");
		}
		if(!origem.isEmpty()){
			sql.append("       AND ori.parada_id = :origem_id   ");
		}
		if(!destino.isEmpty()){
			sql.append("       AND des.parada_id = :destino_id   ");
		}
		if(!categoria.isEmpty()){
			sql.append("       AND c.categoria_id = :categoria_id  ");
		}
		
		return sql.toString();
	}
}
