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

import java.text.SimpleDateFormat;
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.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
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.Datebox;
import org.zkoss.zul.Paging;
import org.zkoss.zul.Timebox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioImpressaoPosterior;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextbox;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.HibernateSearchObject;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.PagedListWrapper;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderParadaImpressaoPosterior;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderParadaImpressaoPosteriorSelecionado;

@Controller("relatorioImpressaoPosteriorController")
@Scope("prototype")
public class RelatorioImpressaoPosteriorController extends MyGenericForwardComposer {
	private static final long serialVersionUID = 1L;
	private static Logger log = LogManager.getLogger(RelatorioImpressaoPosteriorController.class);

	@Autowired
	private DataSource dataSourceRead;
	@Autowired 
	private EmpresaService empresaService;
	@Autowired
	private transient PagedListWrapper<Parada> plwParada;
	
	private Datebox datVendaInicial;
	private Datebox datVendaFinal;
	private Timebox horVendaInicial;
	private Timebox horVendaFinal;
	private Datebox datViagemInicial;
	private Datebox datViagemFinal;
	private Timebox horViagemInicial;
	private Timebox horViagemFinal;
	private MyComboboxEstandar cmbEmpresa;
	private Bandbox bbPesquisaOrigem;
	private Bandbox bbPesquisaDestino;
	private MyTextbox txtNombreOrigem;
	private MyListbox origemList;
	private MyListbox origemSelList;
	private Paging pagingOrigem;
	private MyTextbox txtNombreDestino;
	private MyListbox destinoList;
	private MyListbox destinoSelList;
	private Paging pagingDestino;
	
	private List<Empresa> lsEmpresas;
	
	@SuppressWarnings({ "unchecked", "rawtypes" })
	private void executarRelatorio() throws Exception {
		try {
			Map<String, Object> parametros = new HashMap<String, Object>();
			
			Empresa empresa = cmbEmpresa.getSelectedItem() != null ? (Empresa)cmbEmpresa.getSelectedItem().getValue() : null;
			
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
			SimpleDateFormat sdfTime = new SimpleDateFormat("HH:mm:ss");
			
			if (this.datVendaInicial.getValue() != null){
				parametros.put("datVendaInicial", sdf.format(this.datVendaInicial.getValue()));
			}
			
			if (this.datVendaFinal.getValue() != null){
				parametros.put("datVendaFinal", sdf.format(this.datVendaFinal.getValue()));
			}
				
			if (this.datViagemInicial.getValue() != null){
				parametros.put("datViagemInicial", sdf.format(this.datViagemInicial.getValue()));
			}
			
			if (this.datViagemFinal.getValue() != null){
				parametros.put("datViagemFinal", sdf.format(this.datViagemFinal.getValue()));
			}
			
			if (this.horVendaInicial.getValue() != null){
				parametros.put("horVendaInicial", sdfTime.format(this.horVendaInicial.getValue()));
			}
			
			if (this.horVendaFinal.getValue() != null){
				parametros.put("horVendaFinal", sdfTime.format(this.horVendaFinal.getValue()));
			}
			
			if (this.horViagemInicial.getValue() != null){
				parametros.put("horViagemInicial", sdfTime.format(this.horViagemInicial.getValue()));
			}
			
			if (this.horViagemFinal.getValue() != null){
				parametros.put("horViagemFinal", sdfTime.format(this.horViagemFinal.getValue()));
			}
			
			if (empresa != null){
				parametros.put("empresa", empresa.getEmpresaId());
				parametros.put("empresaNome", empresa.getNombempresa());
			}
			
			parametros.put("TITULO", Labels.getLabel("indexController.mniRelatorioImpressaoPosterior.label"));
			
			String origemIds = "";
			String origem = "";
			List<Parada> lsOrigemSelecionadas = new ArrayList(Arrays.asList(origemSelList.getData()));
			if (lsOrigemSelecionadas.isEmpty()) {
				origem = "Todas";
			} else {
				for (int i = 0; i < lsOrigemSelecionadas.size(); i++) {
					Parada parada = lsOrigemSelecionadas.get(i);
					origem = origem + parada.getDescparada() + ",";
	
					origemIds = origemIds + parada.getParadaId() + ",";
				}
	
				// removendo ultima virgula
				origemIds = origemIds.substring(0, origemIds.length() - 1);
				origem = origem.substring(0, origem.length() - 1);
				parametros.put("NUMORIGEM", origemIds);
				parametros.put("DESCORIGEM", origem);
			}
			
			String destinoIds = "";
			String destino = "";
			List<Parada> lsDestinoSelecionadas = new ArrayList(Arrays.asList(destinoSelList.getData()));
			if (lsDestinoSelecionadas.isEmpty()) {
				destino = "Todas";
			} else {
				for (int i = 0; i < lsDestinoSelecionadas.size(); i++) {
					Parada parada = lsDestinoSelecionadas.get(i);
					destino = destino + parada.getDescparada() + ",";
	
					destinoIds = destinoIds + parada.getParadaId() + ",";
				}
	
				// removendo ultima virgula
				destinoIds = destinoIds.substring(0, destinoIds.length() - 1);
				destino = destino.substring(0, destino.length() - 1);
				parametros.put("NUMDESTINO", destinoIds);
				parametros.put("DESCDESTINO", destino);
			}
			
			Relatorio relatorio = new RelatorioImpressaoPosterior(parametros, dataSourceRead.getConnection());
	
			Map<String, Object> args = new HashMap<String, Object>();
			args.put("relatorio", relatorio);
	
			openWindow("/component/reportView.zul",
					Labels.getLabel("indexController.mniRelatorioImpressaoPosterior.label"), args, MODAL);
		}catch (Exception e) {
			log.error(e);
			throw e;
		}

	}

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

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEmpresas = empresaService.obtenerTodos();
		super.doAfterCompose(comp);
		origemList.setItemRenderer(new RenderParadaImpressaoPosterior());
		origemSelList.setItemRenderer(new RenderParadaImpressaoPosteriorSelecionado());
		destinoList.setItemRenderer(new RenderParadaImpressaoPosterior());
		destinoSelList.setItemRenderer(new RenderParadaImpressaoPosteriorSelecionado());
	}
	
	private void executarPesquisaOrigem() {
		HibernateSearchObject<Parada> paradaBusqueda =
				new HibernateSearchObject<Parada>(Parada.class, pagingOrigem.getPageSize());

		paradaBusqueda.addFilterILike("descparada", "%" + txtNombreOrigem.getValue() + "%");
		paradaBusqueda.addFilterEqual("activo", Boolean.TRUE);

		paradaBusqueda.addSortAsc("descparada");

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

		plwParada.init(paradaBusqueda, origemList, pagingOrigem);

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

	public void onClick$btnPesquisaOrigem(Event ev) {
		executarPesquisaOrigem();
	}

	public void onDoubleClick$origemSelList(Event ev) {
		Parada parada = (Parada) origemSelList.getSelected();
		origemSelList.removeItem(parada);
	}

	public void onDoubleClick$origemList(Event ev) {
		Parada parada = (Parada) origemList.getSelected();
		origemSelList.addItemNovo(parada);
	}

	public void onClick$btnLimparOrigem(Event ev) {
		origemList.setData(new ArrayList<Parada>());

		bbPesquisaOrigem.setText("");
	}

	private void executarPesquisaDestino() {
		HibernateSearchObject<Parada> paradaBusqueda =
				new HibernateSearchObject<Parada>(Parada.class, pagingDestino.getPageSize());

		paradaBusqueda.addFilterILike("descparada", "%" + txtNombreDestino.getValue() + "%");
		paradaBusqueda.addFilterEqual("activo", Boolean.TRUE);

		paradaBusqueda.addSortAsc("descparada");

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

		plwParada.init(paradaBusqueda, destinoList, pagingDestino);

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

	public void onClick$btnPesquisaDestino(Event ev) {
		executarPesquisaDestino();
	}

	public void onDoubleClick$destinoSelList(Event ev) {
		Parada parada = (Parada) destinoSelList.getSelected();
		destinoSelList.removeItem(parada);
	}

	public void onDoubleClick$destinoList(Event ev) {
		Parada parada = (Parada) destinoList.getSelected();
		destinoSelList.addItemNovo(parada);
	}

	public void onClick$btnLimparDestino(Event ev) {
		destinoList.setData(new ArrayList<Parada>());

		bbPesquisaDestino.setText("");
	}

	public MyComboboxEstandar getCmbEmpresa() {
		return cmbEmpresa;
	}

	public void setCmbEmpresa(MyComboboxEstandar cmbEmpresa) {
		this.cmbEmpresa = cmbEmpresa;
	}

	public List<Empresa> getLsEmpresas() {
		return lsEmpresas;
	}

	public void setLsEmpresas(List<Empresa> lsEmpresas) {
		this.lsEmpresas = lsEmpresas;
	}
	
	

}
