package com.rjconsultores.ventaboletos.web.gui.controladores.relatorios.integracaoantifraude;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.zkoss.util.resource.Labels;
import org.zkoss.zk.ui.event.EventListener;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioIntegracaoAntiFraude;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.utils.FormataUtil;
import com.rjconsultores.ventaboletos.web.utilerias.EventListenerExecutarRelatorio;

public class EventListenerExecutarRelatorioIntegracaoAntiFraude extends EventListenerExecutarRelatorio<RelatorioIntegracaoAntiFraudeController> implements EventListener {

	private static final String MASCARA_DATA = "dd/MM/yyyy";

	public EventListenerExecutarRelatorioIntegracaoAntiFraude(RelatorioIntegracaoAntiFraudeController controller) {
		super(controller);
	}

	@Override
	protected String getTituloRelatorio() {
		return RelatorioIntegracaoAntiFraudeController.TITULO_RELATORIO;
	}

	@Override
	protected boolean filtrosValidos(RelatorioIntegracaoAntiFraudeController controller) {
		return new ValidaFormRelatorioIntegracaoAntiFraude(controller).isValido();
	}

	@Override
	protected Relatorio configuraRelatorio(RelatorioIntegracaoAntiFraudeController controller) throws SQLException {
		return new RelatorioIntegracaoAntiFraude(getParametros(), controller.getDataSource().getConnection());
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	private Map<String, Object> getParametros() {
		Map<String, Object> parametros = new HashMap<String, Object>();

		parametros.put("NOME_RELATORIO", Labels.getLabel(getTituloRelatorio()));
		parametros.put("dtInicial", getController().getDtInicial().getValue());
		parametros.put("dtFinal", getController().getDtFinal().getValue());
		parametros.put("periodo", obtemPeriodo());

		StringBuilder empresaIds = new StringBuilder();
		StringBuilder empresas = new StringBuilder();
		List<Empresa> lsEmpresasSelecionadas = new ArrayList(Arrays.asList(getController().getEmpresaSelList().getData()));
		if (!lsEmpresasSelecionadas.isEmpty()) {
			for (int i = 0; i < lsEmpresasSelecionadas.size(); i++) {
				Empresa empresa = lsEmpresasSelecionadas.get(i);
				if(empresa != null) {
					if(empresaIds.length() > 0) {
						empresaIds.append(",");
					}
					empresaIds.append(empresa.getEmpresaId());
					
					if(empresas.length() > 0) {
						empresas.append(",");
					}
					empresas.append(empresa.getNombempresa());
				}
			}
			parametros.put("empresaId", empresaIds.toString());
			parametros.put("empresa", empresas.toString());
		} else {
			parametros.put("empresa", "Todas");
		}

		StringBuilder puntoVentaIds = new StringBuilder();
		StringBuilder puntoVentas = new StringBuilder();
		List<PuntoVenta> lsPuntoVentaSelecionados = new ArrayList(Arrays.asList(getController().getPuntoVentaSelList().getData()));
		if (!lsPuntoVentaSelecionados.isEmpty()) {
			for (int i = 0; i < lsPuntoVentaSelecionados.size(); i++) {
				PuntoVenta puntoVenta = lsPuntoVentaSelecionados.get(i);
				if(puntoVenta != null) {
					if(puntoVentaIds.length() > 0) {
						puntoVentaIds.append(",");
					}
					puntoVentaIds.append(puntoVenta.getPuntoventaId());
					
					if(puntoVentas.length() > 0) {
						puntoVentas.append(",");
					}
					puntoVentas.append(puntoVenta.getPuntoventaId());
					puntoVentas = puntoVentas.append(puntoVenta.getNombpuntoventa());
				}
			}
			parametros.put("puntoventaId", puntoVentaIds.toString());
			parametros.put("puntoventa", puntoVentas.toString());
		} else {
			parametros.put("puntoventa", "Todas");
		}

		obtemIdsEDescricaoStatusKondutoSelecionados(parametros);

		return parametros;
	}

	private void obtemIdsEDescricaoStatusKondutoSelecionados(Map<String, Object> parametros) {
		List<EStatusKondutoTotalBus> statusKondutoTotalBusSelecionados = getController().getKondutoTotalBusList().getItensSelecionados(EStatusKondutoTotalBus.class);
		parametros.put(RelatorioIntegracaoAntiFraude.STATUSKONDUTOTOTALBUS_ID, EStatusKondutoTotalBus.getIdTodos(statusKondutoTotalBusSelecionados));
		parametros.put("statusKondutoTotalBus", EStatusKondutoTotalBus.getDescricaoTodos(statusKondutoTotalBusSelecionados));

		List<EStatusKondutoEnvio> statusKondutoEnvioSelecionados = getController().getKondutoEnvioList().getItensSelecionados(EStatusKondutoEnvio.class);
		parametros.put(RelatorioIntegracaoAntiFraude.STATUSKONDUTOENVIO_ID, EStatusKondutoEnvio.getIdTodos(statusKondutoEnvioSelecionados));
		parametros.put("statusKondutoEnvio", EStatusKondutoEnvio.getDescricaoTodos(statusKondutoEnvioSelecionados));

		List<EStatusKonduto> statusKondutoSelecionados = getController().getKondutoList().getItensSelecionados(EStatusKonduto.class);
		parametros.put(RelatorioIntegracaoAntiFraude.STATUSKONDUTO_ID, EStatusKonduto.getIdTodos(statusKondutoSelecionados));
		parametros.put("statusKonduto", EStatusKonduto.getDescricaoTodos(statusKondutoSelecionados));
	}

	private String obtemPeriodo() {
		return FormataUtil.formataDataToString((Date) getController().getDtInicial().getValue(), "", MASCARA_DATA)
				+ " até " + FormataUtil.formataDataToString((Date) getController().getDtFinal().getValue(), "", MASCARA_DATA);
	}

}
