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

import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.EnumSet;
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.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioLinhaOperacional;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioLinhaOperacional.EnumEspecie;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.EmpresaService;
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.RenderRelatorioLinhaOperacionalRuta;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderRelatorioLinhaOperacionalRutaSelecionadas;

@Controller("relatorioLinhaOperacionalController")
@Scope("prototype")
public class RelatorioLinhaOperacionalController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	@Autowired
	private DataSource dataSourceRead;
	@Autowired
	private transient PagedListWrapper<Ruta> plwRuta;
	@Autowired
	private EmpresaService empresaService;
	List<Empresa> lsEmpresa;
	private Datebox datInicial;
	private Datebox datFinal;
	private Paging pagingRuta;
	private MyListbox rutaList;
	private MyListbox rutaSelList;
	private Textbox txtPalavraPesquisa;
	private Combobox cmbEmpresa;
	private Combobox cmbEspecie;
	private EnumSet<EnumEspecie> lsEspecie;
	private Bandbox bbPesquisaPuntoVenta;
	private Radio rdAgruparPorDia;
	private Radio rdAgruparPorMes;
	private Radio rdAgruparPorAno;
	private Checkbox chkBilhetesDevolvidos;

	public List<Empresa> getLsEmpresa() {
		return lsEmpresa;
	}

	public void setLsEmpresa(List<Empresa> lsEmpresa) {
		this.lsEmpresa = lsEmpresa;
	}

	public EnumSet<EnumEspecie> getLsEspecie() {
		return lsEspecie;
	}

	public void setLsEspecie(EnumSet<EnumEspecie> lsEspecie) {
		this.lsEspecie = lsEspecie;
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEmpresa = empresaService.obtenerTodos();
		lsEspecie = EnumEspecie.all;
		super.doAfterCompose(comp);

		rutaList.setItemRenderer(new RenderRelatorioLinhaOperacionalRuta());
		rutaSelList.setItemRenderer(new RenderRelatorioLinhaOperacionalRutaSelecionadas());
	}

	private void limparPesquisa() {
		rutaList.setData(new ArrayList<Ruta>());

		bbPesquisaPuntoVenta.setText(getDescRutasSelecionadas());
	}

	private void executarPesquisa() {
		HibernateSearchObject<Ruta> rutaBusqueda =
				new HibernateSearchObject<Ruta>(Ruta.class, pagingRuta.getPageSize());

		rutaBusqueda.addFilterLike("descruta", "%" + txtPalavraPesquisa.getValue() + "%");

		rutaBusqueda.addSortAsc("descruta");

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

		plwRuta.init(rutaBusqueda, rutaList, pagingRuta);

		if (rutaList.getData().length == 0) {
			try {
				Messagebox.show(Labels.getLabel("MSG.ningunRegistro"),
						Labels.getLabel("relatorioLinhaOperacionalController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
			}
		}
	}

	public void onClick$btnLimpar(Event ev) {
		limparPesquisa();
	}

	public void onClick$btnPesquisa(Event ev) {
		executarPesquisa();
	}

	public void onDoubleClick$rutaSelList(Event ev) {
		Ruta ruta = (Ruta) rutaSelList.getSelected();
		rutaSelList.removeItem(ruta);
	}

	public void onDoubleClick$rutaList(Event ev) {
		Ruta ruta = (Ruta) rutaList.getSelected();
		rutaSelList.addItemNovo(ruta);
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	private String getDescRutasSelecionadas() {
		List<Ruta> lsRutasSelecionadas = new ArrayList(Arrays.asList(rutaSelList.getData()));
		StringBuilder selecionadas = new StringBuilder("");
		if (!lsRutasSelecionadas.isEmpty()) {
			for (Ruta ruta : lsRutasSelecionadas) {
				selecionadas.append(ruta.getDescruta()).append(", ");
			}
		}

		return selecionadas.toString();
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public void onClick$btnExecutarRelatorio(Event ev) throws InterruptedException, SQLException {
		List<Ruta> lsRutasSelecionadas = new ArrayList(Arrays.asList(rutaSelList.getData()));

		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		Date dataDe = datInicial.getValue();
		Date dataAte = datFinal.getValue();

		Map<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("DATA_DE", sdf.format(dataDe));
		parametros.put("DATA_ATE", sdf.format(dataAte));

		String linhasIds = "0";
		for (int i = 0; i < lsRutasSelecionadas.size(); i++) {
			Ruta ruta = lsRutasSelecionadas.get(i);
			linhasIds = linhasIds + "," + ruta.getRutaId();
		}
		parametros.put("LINHAS", linhasIds);

		String selecionadas = getDescRutasSelecionadas();
		parametros.put("DESC_LINHAS_SELECIONADAS", selecionadas.isEmpty() ? "Todas" : selecionadas);

		Comboitem cbiEmpresa = cmbEmpresa.getSelectedItem();
		String empresaId;
		if (cbiEmpresa != null) {
			Empresa empresa = (Empresa) cbiEmpresa.getValue();
			empresaId = empresa.getEmpresaId().toString();
		} else {
			empresaId = "0";
			for (int i = 0; i < lsEmpresa.size(); i++) {
				Empresa empresa = lsEmpresa.get(i);
				empresaId = empresaId + "," + empresa.getEmpresaId();
			}
		}
		parametros.put("EMPRESA_IDS", empresaId);

		Comboitem cbiEspecie = cmbEspecie.getSelectedItem();
		if (cbiEspecie != null) {
			EnumEspecie especie = (EnumEspecie) cbiEspecie.getValue();
			parametros.put("ESPECIE", especie);
		} else {
			parametros.put("ESPECIE", EnumEspecie.BILHETE);
		}

		Boolean agruparPorDia = rdAgruparPorDia.isSelected();
		Boolean agruparPorMes = rdAgruparPorMes.isSelected();
		Boolean agruparPorAno = rdAgruparPorAno.isSelected();

		parametros.put("agruparPorDia", agruparPorDia);
		parametros.put("agruparPorMes", agruparPorMes);
		parametros.put("agruparPorAno", agruparPorAno);

		Boolean desconsiderarBilhetesDevolvidos = chkBilhetesDevolvidos.isChecked();
		parametros.put("desconsiderarBilhetesDevolvidos", desconsiderarBilhetesDevolvidos);

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

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

		openWindow("/component/reportView.zul",
						Labels.getLabel("relatorioLinhaOperacionalController.window.title"), args, MODAL);
	}
}
