package com.rjconsultores.ventaboletos.relatorios.impl;

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

import org.apache.commons.lang.StringUtils;

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

public class RelatorioTrocoSimples extends Relatorio {
	
	public RelatorioTrocoSimples(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);

				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql);
				ResultSet rset = stmt.executeQuery();

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

					dataResult.put("valorTroco", rset.getBigDecimal("valorTroco"));
					dataResult.put("puntoVenta", rset.getString("puntoVenta"));					
					dataResult.put("bilhetero", getNombUsuarioCompleto(rset.getString("bilhetero"), rset.getString("paterno"), rset.getString("materno")));
					dataResult.put("boleto", rset.getString("boleto"));
					dataResult.put("transacao", rset.getString("transacao"));
					
					this.dados.add(dataResult);
				}

				this.resultSet = rset;
			}
		});
	}
	
	@Override
	protected void processaParametros() throws Exception {
	}

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

		StringBuilder sql = new StringBuilder();

		String formatToDate = ("'dd/MM/yyyy hh24:mi:ss'");
		SimpleDateFormat formatSemHora = new SimpleDateFormat("dd/MM/yyyy");

		Date dataInicial = (Date) parametros.get("DATA_INICIAL");
		Date dataFinal = (Date) parametros.get("DATA_FINAL");
		Integer empresaId = (Integer) parametros.get("EMPRESA_ID");
		String puntoVentas = (String) parametros.get("NUMPUNTOVENTA");
		Integer usuarioId = (Integer) parametros.get("BILHETEIRO_ID");
		
		sql.append("SELECT ee.impingreso as valorTroco, ");
		sql.append("pv.nombpuntoventa as puntoVenta, ");
		sql.append("u.nombusuario as bilhetero, ");
		sql.append("u.nombpaterno as paterno, ");
		sql.append("u.nombmaterno as materno, ");
		sql.append("ee.boleto_id AS boleto, "); 
	    sql.append("ee.descinfo AS transacao ");
		sql.append("FROM TIPO_EVENTO_EXTRA tee ");
		sql.append("INNER JOIN EVENTO_EXTRA ee ON ee.tipoeventoextra_id = tee.tipoeventoextra_id ");
		sql.append("INNER JOIN PUNTO_VENTA pv ON pv.puntoventa_id = ee.puntoventa_id ");
		sql.append("INNER JOIN USUARIO u ON u.USUARIO_ID = ee.USUARIO_ID ");

		sql.append("WHERE tee.cvesistema = 'TIPO_EVENTO_EXTRA_TROCO_SIMPLES' ");
		
		if (empresaId != null) {
		sql.append(" AND ee.empresa_id = " + empresaId);
		}
		if (dataInicial != null && dataFinal != null) {
		sql.append(" AND ee.fechoringreso BETWEEN TO_DATE('" + formatSemHora.format(dataInicial) + " 00:00:00', " + formatToDate + ") "
				+ "AND TO_DATE('" + formatSemHora.format(dataFinal) + " 23:59:59', " + formatToDate + ") ");
		}
		if (puntoVentas != null && !puntoVentas.isEmpty()) {
			sql.append(" AND pv.puntoventa_id IN (" + puntoVentas + ") ");
		}
		if(usuarioId != null) {
			sql.append(" AND ee.usuario_id = " + usuarioId);
		}
		
		return sql.toString();
	}
	
	public String getNombUsuarioCompleto(String nome, String nomePaterno, String nomeMaterno) {
		StringBuilder sNome = new StringBuilder(nome);
		if(StringUtils.isNotBlank(nomePaterno)) {
			sNome.append(" ")
				 .append(nomePaterno);
		}
		if(StringUtils.isNotBlank(nomeMaterno)) {
			sNome.append(" ")
			.append(nomeMaterno);
		}
		
		return sNome.toString();
	}

}
