package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

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

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

public class RelatorioSegundaViaSeguroOpcional extends Relatorio {

	private static Logger log = LogManager.getLogger(RelatorioSegundaViaSeguroOpcional.class);
	private SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
	private List<RelatorioSegundaViaSeguroOpcionalBean> lsDadosRelatorio;

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

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

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

				Date dataInicial = (Date) parametros.get("dataInicial");
				Date dataFinal = (Date) parametros.get("dataFinal");
				Integer empresaId = (Integer) parametros.get("empresaId");
				Integer puntoVentaId = (Integer) parametros.get("puntoVentaId");

				String sql = getSqlDados(dataInicial, dataFinal, empresaId, puntoVentaId);
				ResultSet rset = null;
				NamedParameterStatement stmt = null;
				Connection conexao = this.relatorio.getConexao();

				stmt = new NamedParameterStatement(conexao, sql);
				stmt.setTimestamp("dataInicial", getDataHoraInicial(dataInicial));
				stmt.setTimestamp("dataFinal", getDataHoraFinal(dataFinal));

				parametros.put("dataInicial", sdf.format(dataInicial));
				parametros.put("dataFinal", sdf.format(dataFinal));
				try {
					rset = stmt.executeQuery();

					lsDadosRelatorio = new ArrayList<RelatorioSegundaViaSeguroOpcionalBean>();
					while (rset.next()) {
						lsDadosRelatorio.add(criarRelatorioSegundaViaBean(rset));
					}
					setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio));
				} catch (Exception e) {
					log.error(e.getMessage(), e);
				} finally {
					try {
						if (rset != null) {
							rset.close();
						}
						if (stmt != null) {
							stmt.close();
						}
					} catch (SQLException e) {
						log.error(e.getMessage(), e);
					}
				}
			}

			private RelatorioSegundaViaSeguroOpcionalBean criarRelatorioSegundaViaBean(ResultSet rset) throws SQLException {
				RelatorioSegundaViaSeguroOpcionalBean r = new RelatorioSegundaViaSeguroOpcionalBean();

				r.setBilheteiro(rset.getString("bilheteiro"));
				r.setBilhete(rset.getString("numfoliosistema"));
				r.setDataVenda(rset.getDate("dataVenda"));
				r.setDataViagem(rset.getDate("dataViagem"));
				r.setSeguro(rset.getBigDecimal("seguro"));
				r.setNomeAgencia(rset.getString("nomeAgencia"));
				r.setLinha(rset.getString("linha"));
				r.setNumBpe(rset.getString("numBpe"));
				r.setNumeroApolice(rset.getString("numeroApolice"));
				return r;
			}
		});
	}

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

	private String getSqlDados(Date dataInicial, Date dataFinal, Integer empresaId, Integer puntoVentaId) {
		StringBuilder sql = new StringBuilder();

		sql.append("SELECT DISTINCT B.BOLETO_ID, ");
		sql.append("                PT.NOMBPUNTOVENTA AS nomeAgencia, ");
		sql.append("                USUARIO.NOMBUSUARIO AS bilheteiro, ");
		sql.append("                B.FECHORVENTA AS dataVenda, ");
		sql.append("                B.FECHORVIAJE AS dataViagem, ");
		sql.append("                R.DESCRUTA AS linha,");
		sql.append("                B.NUMFOLIOSISTEMA as numfoliosistema, ");
		sql.append("                SEG.VALOR AS seguro, ");
		sql.append("                B.NUM_BPE AS numBpe, ");
		sql.append("                SEG.NUMSEGURO AS numeroApolice ");
		sql.append("FROM BOLETO B ");
		sql.append("INNER JOIN EVENTO_EXTRA EE ON (EE.BOLETO_ID = B.BOLETO_ID) ");
		sql.append("INNER JOIN USUARIO USUARIO ON B.USUARIO_ID = USUARIO.USUARIO_ID ");
		sql.append("INNER JOIN RUTA R ON R.RUTA_ID = B.RUTA_ID ");
		sql.append("INNER JOIN PUNTO_VENTA PT ON PT.PUNTOVENTA_ID = EE.PUNTOVENTASEGUNDAVIAID ");
		sql.append("INNER JOIN SEGPOLV SEG ON (SEG.BOLETO_ID = B.BOLETO_ID) ");


		sql.append("WHERE  EE.INDSEGUNDAVIAIMPRESSA = 1   ");
		if (dataInicial != null && dataFinal != null) {
			sql.append(" AND EE.FECSEGUNDAVIA BETWEEN :dataInicial and :dataFinal ");
		}
		if (empresaId != null && empresaId != -1) {
			sql.append(" AND B.EMPRESACORRIDA_ID = " + empresaId);
		}
		if (puntoVentaId != null && puntoVentaId != -1) {
			sql.append(" AND B.PUNTOVENTA_ID = " + puntoVentaId);
		}
		sql.append(" ORDER BY B.FECHORVENTA ");
		
		return sql.toString();
	}

	@Override
	protected void processaParametros() throws Exception {

	}

	private Timestamp getDataHoraInicial(Date dataInicial) {
		Calendar calendar = Calendar.getInstance();

		calendar.setTime(dataInicial);
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);

		return new Timestamp(calendar.getTime().getTime());
	}

	private Timestamp getDataHoraFinal(Date dataFinal) {
		Calendar calendar = Calendar.getInstance();

		calendar.setTime(dataFinal);
		calendar.set(Calendar.HOUR_OF_DAY, 23);
		calendar.set(Calendar.MINUTE, 59);
		calendar.set(Calendar.SECOND, 59);

		return new Timestamp(calendar.getTime().getTime());
	}

}
