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

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

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.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Decimalbox;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Messagebox;

import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Conexion;
import com.rjconsultores.ventaboletos.entidad.ConexionConf;
import com.rjconsultores.ventaboletos.entidad.ConexionDescuento;
import com.rjconsultores.ventaboletos.service.ClaseServicioService;
import com.rjconsultores.ventaboletos.service.ConexionDescuentoService;
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.render.RenderConexionDescuento;

@Controller("editarConexionConfController")
@Scope("prototype")
public class EditarConexionConfController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	private MyComboboxEstandar cmbClasseServicio;
	private MyListbox listBoxDesconto;
	private Decimalbox txtValorDesconto;
	private Decimalbox txtValorDescontoTasaEmbarque;

	private ConexionConf conexionConf;
	private Conexion conexion;
	private List<ConexionDescuento> conexoesDescontoAdicionadas;
	private List<ConexionDescuento> conexoesDescontoRemovidasLocal;
	private HashMap<Integer, ConexionConf> conexionConfHash;
	private List<ConexionDescuento> conexoesDescontoRemovidas;
	private List<ConexionDescuento> conexoesDescontoAdicionadasLocal;

	@Autowired
	private ConexionDescuentoService conexionDescuentoService;

	@Autowired
	private ClaseServicioService claseServicioService;

	public void setConexionConf(ConexionConf conexionConf) {
		this.conexionConf = conexionConf;
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		conexoesDescontoRemovidasLocal = new ArrayList<ConexionDescuento>();
		conexoesDescontoAdicionadasLocal = new ArrayList<ConexionDescuento>();
		recuperaParametros();
		if(conexoesDescontoAdicionadas == null) {
			conexoesDescontoAdicionadas = new ArrayList<ConexionDescuento>();			
		}
		iniciaCampos();
		listBoxDesconto.setItemRenderer(new RenderConexionDescuento());
	}

	@SuppressWarnings("unchecked")
	private void recuperaParametros() {
		conexion = (Conexion) Executions.getCurrent().getArg().get("conexion");
		conexoesDescontoAdicionadas = (List<ConexionDescuento>) Executions.getCurrent().getArg().get("conexoesDescontoAdicionadas");
		conexionConfHash = (HashMap<Integer, ConexionConf>) Executions.getCurrent().getArg().get("conexionConfHash");
		conexoesDescontoRemovidas = (List<ConexionDescuento>) Executions.getCurrent().getArg().get("conexoesDescontoRemovidas");
	}

	private void iniciaCampos() {
		conexionConf = conexionConfHash.get(conexion.getNumgrupo());
		listBoxDesconto.setData(conexion.getConexionesDescuentos());
		cmbClasseServicio.setModel(new ListModelList(claseServicioService.obtenerTodos()));

	}


	public void onClick$btnAddDesconto(Event event) throws InterruptedException {
		ConexionDescuento conexionDescuento = new ConexionDescuento();
		conexionDescuento.setDescuento(txtValorDesconto.getValue());
		conexionDescuento.setDescuentoTasaEmbarque(txtValorDescontoTasaEmbarque.getValue());
		conexionDescuento.setConexion(conexion);
		conexionDescuento.setGrupo(conexion.getNumgrupo());
		conexionDescuento.setSecuencia(conexion.getNumsecuencia());
		conexionDescuento.setClaseServicio(cmbClasseServicio.getSelecteObject(ClaseServicio.class));
		conexionDescuento.setActivo(true);
		if (!listBoxDesconto.getListData().contains(conexionDescuento)) {
			listBoxDesconto.addItemNovo(conexionDescuento);
			txtValorDesconto.setConstraint("");
			txtValorDesconto.setText("");
			txtValorDesconto.setConstraint("no empty");
			txtValorDescontoTasaEmbarque.setText("");
			conexoesDescontoAdicionadasLocal.add(conexionDescuento);
			cmbClasseServicio.setSelectedIndex(-1);
		} else {
			cmbClasseServicio.setSelectedIndex(-1);
			Messagebox.show(Labels.getLabel("editarConexionConfController.MSG.classeRepetida"),
					Labels.getLabel("editarConexionConfController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
		}

	}

	public void onClick$btnRemoverDesconto(Event event) throws InterruptedException {
		if (listBoxDesconto.getSelectedItem() == null) {
			Messagebox.show(Labels.getLabel("editarConexionConfController.MSG.nenhumItemSelecionado"),
					Labels.getLabel("editarConexionConfController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);
			return;
		}

		ConexionDescuento conexionDescuento = (ConexionDescuento) listBoxDesconto.getSelected();
		if (conexionDescuento.getIdConexionDescuento() != null) {
			conexionDescuento.setActivo(false);
			conexoesDescontoRemovidasLocal.add(conexionDescuento);
		}
		listBoxDesconto.removeItem(conexionDescuento);
	}

	@SuppressWarnings("unchecked")
	public void onClick$btnConfirmar(Event event) {
		conexionConfHash.put(conexion.getNumgrupo(), conexionConf);
		if(conexoesDescontoRemovidasLocal!=null && !conexoesDescontoRemovidasLocal.isEmpty()) {
			for (ConexionDescuento conexionDescuento : conexoesDescontoRemovidasLocal) {
				conexoesDescontoRemovidas.add(conexionDescuento);
			}
			
		}
		if(conexoesDescontoAdicionadasLocal!=null && !conexoesDescontoAdicionadasLocal.isEmpty()) {
			for (ConexionDescuento conexionDescuento : conexoesDescontoAdicionadasLocal) {
				conexoesDescontoAdicionadas.add(conexionDescuento);
			}
		}
		conexion.setConexionesDescuentos(listBoxDesconto.getListData());
		closeWindow();
	}
	
	  public void onClick$btnFechar(Event ev) {
		  conexoesDescontoRemovidas.clear();
		  conexion.getConexionesDescuentos().clear();
	      closeWindow();
	    }

	public ConexionConf getConexionConf() {
		return conexionConf;
	}

}
