package com.rjconsultores.ventaboletos.relatorios.impl;

import java.sql.Connection;
import java.sql.ResultSet;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import com.rjconsultores.ventaboletos.relatorios.utilitarios.ArrayDataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

public class RelatorioCteos extends Relatorio {

	public RelatorioCteos(Map<String, Object> parametros, Connection conexao) throws Exception {

		super(parametros, conexao); 

		this.setCustomDataSource(new ArrayDataSource(this) {

			public void initDados() throws Exception {
				Connection conexao = this.relatorio.getConexao();
				Map<String, Object> parametros = this.relatorio.getParametros();

				String sql = getSql(parametros);
				
				Date dtInicio = (Date) parametros.get("DATA_INICIO");
				Date dtFim = (Date) parametros.get("DATA_FIM");			

				NamedParameterStatement ps = new NamedParameterStatement(conexao, sql.toString());
				if(dtInicio != null && dtFim != null) {
					ps.setString("dataInicio", DateUtil.getStringDate(dtInicio, "dd/MM/yyyy") + " 00:00:00");
					ps.setString("dataFinal", DateUtil.getStringDate(dtFim, "dd/MM/yyyy") + " 23:59:59");
				}
				
				ResultSet rset = ps.executeQuery();

				while (rset.next()) {
					Map<String, Object> dataResult = new HashMap<String, Object>();

					dataResult.put("empresa_id", rset.getString("empresa_id"));
					dataResult.put("nombempresa", rset.getString("nombempresa"));
					dataResult.put("dtvenda", rset.getString("dtvenda"));
					dataResult.put("num_bpe", rset.getString("num_bpe"));
					dataResult.put("origem", rset.getString("origem"));
					dataResult.put("destino", rset.getString("destino"));
					dataResult.put("uforigem", rset.getString("uforigem"));
					dataResult.put("ufdestino", rset.getString("ufdestino"));
					dataResult.put("dtviagem", rset.getString("dtviagem"));
					dataResult.put("valor", rset.getBigDecimal("valor"));
					dataResult.put("chbpe", rset.getString("chbpe"));
					dataResult.put("protocolo", rset.getString("protocolo"));
					dataResult.put("num_bpe", rset.getString("num_bpe"));
					dataResult.put("numserie_bpe", rset.getString("numserie_bpe"));
					dataResult.put("evento", rset.getString("evento"));
					dataResult.put("qtd", rset.getString("qtd"));
				
					this.dados.add(dataResult);
				}

				this.resultSet = rset;
			}
		});
	}

	@Override
	protected void processaParametros() throws Exception {
	}

	private String getSql(Map<String, Object> parametros) {

		StringBuilder sql = new StringBuilder(1400);

		String estados = (String) parametros.get("ESTADOS_ID");
		String empresaId = (String) parametros.get("EMPRESA_ID");
		
		sql.append(" SELECT ");
		sql.append("     ep.empresa_id, ");
		sql.append("     ep.nombempresa , ");
		sql.append("     to_char(coalesce(bpe.dt_venda, bol.fechorventa), 'dd/mm/yyyy') AS dtvenda, ");
		sql.append("     bol.num_bpe, ");
		sql.append("     coalesce(bol.numserie_bpe, '1') AS numserie_bpe, ");
		sql.append("     to_char(bol.fechorviaje, 'dd/mm/yyyy HH24:MI') AS dtviagem, ");
		sql.append("     bpe.chbpe, ");
		sql.append("     ori.descparada AS origem, ");
		sql.append("     e.cveestado AS uforigem, ");
		sql.append("     dest.descparada AS destino, ");
		sql.append("     desta.cveestado AS ufdestino, ");
		sql.append("     'EXCESSO BAGAGEM' AS evento, ");
		sql.append("     1 AS qtd, ");
		sql.append("     coalesce(bpe.valorpago, bol.preciopagado) AS valor,  ");
		sql.append("     bpe.nprot AS protocolo ");
		sql.append(" FROM ");
		sql.append("     bpe  bpe ");
		sql.append("     LEFT JOIN boleto       bol ON bol.boleto_id = bpe.boleto_id AND bpe.activo = 1 ");
		sql.append("     LEFT JOIN estado       e ON e.codibge = bpe.uf ");
		sql.append("     LEFT JOIN marca        ma ON bol.marca_id = ma.marca_id ");
		sql.append("     LEFT JOIN empresa      ep ON ma.empresa_id = ep.empresa_id ");
		sql.append("     LEFT JOIN parada       ori ON bol.origen_id = ori.parada_id ");
		sql.append("     LEFT JOIN parada       dest ON bol.destino_id = dest.parada_id ");
		sql.append("     LEFT JOIN ciudad       dcit on dest.ciudad_id = dcit.ciudad_id ");
		sql.append("     LEFT JOIN estado       desta ON dcit.estado_id = desta.estado_id ");
		sql.append(" WHERE ");
		sql.append("     e.activo = 1 ");
		sql.append("     and bpe.codstat = 135 ");
		sql.append("     AND bpe.tipoevento = 110117 ");
		
		if (empresaId != null) {
			sql.append(" AND ep.EMPRESA_ID IN ( " + empresaId + " ) ");
		}
		
		if (estados != null) {
			sql.append(" AND e.ESTADO_ID IN ( " + estados + " )");
		}
		
		sql.append("     AND coalesce(bol.fechorventa_h, bol.fechorventa) >= to_date(:dataInicio, 'DD/MM/YYYY HH24:MI:SS') ");
		sql.append("     AND coalesce(bol.fechorventa_h, bol.fechorventa) <= to_date(:dataFinal, 'DD/MM/YYYY HH24:MI:SS') ");
		sql.append(" ORDER BY ");
		sql.append("     ep.empresa_id,dtvenda, origem ");

		return sql.toString();
	}
}