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

import static com.rjconsultores.ventaboletos.web.gui.controladores.relatorios.vendabilheteidoso.RelatorioPosicaoVendaBilheteIdosoController.LISTAR_TODAS;

import java.sql.SQLException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.zkoss.util.resource.Labels;

import com.rjconsultores.ventaboletos.entidad.Categoria;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.utils.FormataUtil;
import com.rjconsultores.ventaboletos.web.gui.controladores.relatorios.EspecializaLista;
import com.rjconsultores.ventaboletos.web.utilerias.EventListenerExecutarRelatorio;

public class EventListenerExecutarRelatorioVendaBilheteIdoso extends EventListenerExecutarRelatorio<RelatorioPosicaoVendaBilheteIdosoController> {

	private static final String MASCARA_DATA_COMPLETA = "dd/MM/yyyy hh:mm:ss";

	public EventListenerExecutarRelatorioVendaBilheteIdoso(RelatorioPosicaoVendaBilheteIdosoController controller) {
		super(controller);
	}

	@Override
	protected boolean filtrosValidos(RelatorioPosicaoVendaBilheteIdosoController controller) {
		return new ValidaFormRelatorioVendaBilheteIdoso(controller).isValido();
	}

	@Override
	protected Relatorio configuraRelatorio(RelatorioPosicaoVendaBilheteIdosoController controller) throws SQLException {
		return getTipoRelatorio().getInstance(getParametros(), controller.getDataSource().getConnection());
	}

	@Override
	protected String getTituloRelatorio() {
		return getTipoRelatorio().getTituloRelatorio();
	}
	
	private ETipoRelatorioVendaBilheteIdoso getTipoRelatorio() {
		return ETipoRelatorioVendaBilheteIdoso.getEnumById(Integer.valueOf(
				(getController().getTipoRelatorio().getSelectedItem()).getValue()));
	}

	private ETipoPeriodoRelatorioPosicaoVendaBilheteIdoso getTipoDataSelecionada() {
		return ETipoPeriodoRelatorioPosicaoVendaBilheteIdoso.getEnumById(Integer.valueOf(
				(getController().getTipoData().getSelectedItem()).getValue()));
	}

	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());
		parametros.put("tpData", getTipoDataSelecionada());
		parametros.put("empresaId", getController().getEmpresaSelecionada().getEmpresaId());
		parametros.put("empresa", getController().getEmpresaSelecionada().getNombempresa());
		configuraParametrosLinha(parametros);
		getParametroTipoPassagem(parametros);
		parametros.put("tipoData", getTipoDataSelecionada().getNome());
		parametros.put("orgao", ((OrgaoConcedente)getController().getCmbOrgaoConcedente().getSelectedItem().getValue()).getDescOrgao());
		
		return parametros;
	}

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

	private void getParametroTipoPassagem(Map<String, Object> parametros) {
		EspecializaLista<Categoria> especializaLista = new EspecializaLista<Categoria>(Categoria.class, getController().getTpPassagemSelList(), "getCategoriaId");
		if (!especializaLista.getLista().isEmpty()) {
			parametros.put("categoriaId", especializaLista.obtemIds());
		}
	}

	private void configuraParametrosLinha(Map<String, Object> parametros) {
		EspecializaLista<Ruta> especializaLista = new EspecializaLista<Ruta>(Ruta.class, getController().getLinhaSelList(), "getRutaId");
		parametros.put("rutaId", especializaLista.getLista().contains(new Ruta(LISTAR_TODAS)) ? 
				LISTAR_TODAS : especializaLista.obtemIds());
		if (LISTAR_TODAS.equals(parametros.get("rutaId"))) {
			parametros.put("linha", "TODAS");
		} else {
			StringBuilder linhas = new StringBuilder();
			for (Ruta linha : especializaLista.getLista()) {
				linhas.append(linha.getDescruta());
				linhas.append(", ");
			}
			parametros.put("linha", linhas.substring(0, linhas.length()-2));
		}
	}
}
