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

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.zkoss.util.resource.Labels;
import org.zkoss.zhtml.Messagebox;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Bandbox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.ComboitemRenderer;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Usuario;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioCheckin;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParada;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParadaCve;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.HibernateSearchObject;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.PagedListWrapper;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioCheckinUsuario;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioCheckinUsuariosSelecionados;

@Controller("relatorioCheckinController")
@Scope("prototype")
public class RelatorioCheckinController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;

	private Datebox datInicial;
	private Datebox datFinal;
	private Intbox txtCorridaId;
	private Bandbox bbPesquisaBilhetero;
	private Paging pagingUsuario;
	private Textbox txtPalavraPesquisa;
	@Autowired
	private transient PagedListWrapper<Usuario> plwUsuario;
	private MyListbox usuarioList;
	private MyListbox usuarioSelList;

	private MyComboboxParada cmbParadaOrigem;
	private MyComboboxParadaCve cmbParadaOrigemCve;

	@Autowired
	private DataSource dataSourceRead;

	@Override
	public void doAfterCompose(Component comp) throws Exception {

		super.doAfterCompose(comp);

		cmbParadaOrigemCve.setItemRenderer(new ComboitemRenderer() {
			@Override
			public void render(Comboitem cmbtm, Object o) throws Exception {
				Parada parada = (Parada) o;

				cmbtm.setLabel(parada.getCveparada());
				cmbtm.setValue(parada);
			}
		});
		
		usuarioList.setItemRenderer(new RenderRelatorioCheckinUsuario());
		usuarioSelList.setItemRenderer(new RenderRelatorioCheckinUsuariosSelecionados());
		
	}
	
	public void onClick$btnPesquisa(Event ev) {
		executarPesquisa();
	}
	
	public void onDoubleClick$usuarioList(Event ev) {
		Usuario usuario = (Usuario) usuarioList.getSelected();
		usuarioSelList.addItemNovo(usuario);
	}
	
	private void executarPesquisa() {
		HibernateSearchObject<Usuario> usuarioBusqueda =
				new HibernateSearchObject<Usuario>(Usuario.class, pagingUsuario.getPageSize());

		usuarioBusqueda.addFilterLike("claveUsuario", "%" + txtPalavraPesquisa.getValue() + "%");

		usuarioBusqueda.addSortAsc("nombusuario");

		usuarioBusqueda.addFilterEqual("activo", Boolean.TRUE);

		plwUsuario.init(usuarioBusqueda, usuarioList, pagingUsuario);

		if (usuarioList.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("indexController.mniRelatorioCheckin.label"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
			}
		}
	}

	public void onClick$btnExecutarRelatorio(Event ev) throws Exception {

		List<Usuario> lsUsuariosSelecionados = new ArrayList(Arrays.asList(usuarioSelList.getData()));
		
		Integer origenId = cmbParadaOrigemCve.getSelectedItem() == null ? null
				: ((Parada) cmbParadaOrigemCve.getSelectedItem().getValue()).getParadaId();
		String origen = cmbParadaOrigemCve.getSelectedItem() == null ? null
				: ((Parada) cmbParadaOrigemCve.getSelectedItem().getValue()).getDescparada();

		if (datInicial.getValue() == null && datFinal.getValue() == null) {

			Messagebox.show(Labels.getLabel("relatorioCheckinController.MSG.erroPeriodo"),
					Labels.getLabel("indexController.mniRelatorioCheckin.label"),
					Messagebox.OK, Messagebox.INFORMATION);
			return;
		}

		Map<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("CORRIDA_ID", txtCorridaId.getValue());
		parametros.put("DATA_INICIAL", datInicial.getValue());
		parametros.put("DATA_FINAL", datFinal.getValue());
		parametros.put("ORIGEN_ID", origenId);
		parametros.put("ORIGEN", origen);
		parametros.put("NOME_RELATORIO", Labels.getLabel("indexController.mniRelatorioCheckin.label"));
		
		String usuariosIds = "";
		for (int i = 0; i < lsUsuariosSelecionados.size(); i++) {
			Usuario usuario = lsUsuariosSelecionados.get(i);
			if(i == 0){
				usuariosIds = usuariosIds + " " + usuario.getUsuarioId();
			}else{
				usuariosIds = usuariosIds + "," + usuario.getUsuarioId();
			}
			
		}
		parametros.put("IDS_BILHETEIROS", usuariosIds);
		

		Relatorio relatorio = new RelatorioCheckin(parametros, dataSourceRead.getConnection());

		Map<String, Object> args = new HashMap<String, Object>();
		args.put("relatorio", relatorio);

		openWindow("/component/reportView.zul",
				Labels.getLabel("indexController.mniRelatorioCheckin.label"), args, MODAL);
	}

	public void onSelect$cmbParadaOrigemCve(Event ev) {
		if (cmbParadaOrigemCve.getSelectedItem() != null) {
			cmbParadaOrigem.setComboItemByParada((Parada) cmbParadaOrigemCve.getSelectedItem().getValue());
		}
	}

	public void onSelect$cmbParadaOrigem(Event ev) {
		if (cmbParadaOrigem.getSelectedItem() != null)
			cmbParadaOrigemCve.setComboItemByParada((Parada) cmbParadaOrigem.getSelectedItem().getValue());
	}
	
	public void onClick$btnLimpar(Event ev) {
		limparPesquisa();
	}
	
	private void limparPesquisa() {
		usuarioList.setData(new ArrayList<Usuario>());

		bbPesquisaBilhetero.setText(getDescBilheteirosSelecionados());
	}
	
	@SuppressWarnings({ "unchecked", "rawtypes" })
	private String getDescBilheteirosSelecionados() {
		List<Usuario> lsUsuariosSelecionados = new ArrayList(Arrays.asList(usuarioSelList.getData()));
		StringBuilder selecionados = new StringBuilder("");
		if (!lsUsuariosSelecionados.isEmpty()) {
			for (Usuario usuario : lsUsuariosSelecionados) {
				selecionados.append(usuario.getNombusuario()).append(", ");
			}
		}

		txtPalavraPesquisa.setText("");
		return selecionados.toString();
	}

}
