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

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

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

import com.rjconsultores.ventaboletos.entidad.ConfiguracionProducto;
import com.rjconsultores.ventaboletos.entidad.ConfiguracionProductoParada;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.TipoEventoExtra;
import com.rjconsultores.ventaboletos.service.ConfiguracionProductoParadaService;
import com.rjconsultores.ventaboletos.service.ConfiguracionProductoService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.MyTextboxDecimal;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderConfiguracionProductoParada;

/**
 * 
 * @author Luis Espina
 */
@Controller("editarConfiguracionProductosController")
@Scope("prototype")
public class EditarConfiguracionProductosController extends MyGenericForwardComposer{

	private static final long serialVersionUID = 1L;
	@Autowired
	private ConfiguracionProductoService configuracionProductoService;
	
	@Autowired
	private ConfiguracionProductoParadaService configuracionProductoParadaService;
	
	private static Logger log = LogManager.getLogger(EditarConfiguracionProductosController.class);
	private ConfiguracionProducto configuracionProducto;
	private BusquedaConfiguracionProductosController winCPC;
	@SuppressWarnings("unused")
	private MyListbox lstPrincipal;
	private Combobox cmbTipoEventoExtra;
	private List<TipoEventoExtra> lsTipoEventoExtra;
	private List<ConfiguracionProductoParada> configuracionProductoParadaLst;
	private TipoEventoExtra tipoEventoExtra;
	private MyTextboxDecimal txtPrecio;
	private MyListbox configuracionProductoParadaList;
	private Button btnApagar;
	private Datebox fecInicio;
    private Datebox fecFinal;
    private Combobox cmbParada;
	
	@SuppressWarnings("unchecked")
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		
		configuracionProducto = (ConfiguracionProducto) Executions.getCurrent().getArg().get("configuracionProducto");
		winCPC = (BusquedaConfiguracionProductosController) Executions.getCurrent().getArg().get("principal");
		lstPrincipal = (MyListbox) Executions.getCurrent().getArg().get("configuracionProductoList");
		lsTipoEventoExtra = (List<TipoEventoExtra>) Executions.getCurrent().getArg().get("lsTipoEventoExtra");
	
		configuracionProductoParadaLst = new ArrayList<ConfiguracionProductoParada>();
		configuracionProductoParadaList.setItemRenderer(new RenderConfiguracionProductoParada());
		
		if (configuracionProducto.getConfiguracionProductoId() == null) {
			btnApagar.setVisible(Boolean.FALSE);
		}else {
			configuracionProductoParadaLst = configuracionProductoParadaService.buscarPorId(configuracionProducto);
			configuracionProductoParadaList.setData(configuracionProductoParadaLst);
		}
	}
	
	public void onClick$btnAdicionarProductoParada(Event ev) throws InterruptedException {
		try {
			if (!cmbParada.getValue().equals("")) {
				Parada parada = (Parada) cmbParada.getSelectedItem().getValue();
				ConfiguracionProductoParada configuracionProductoParada = new ConfiguracionProductoParada();
				configuracionProductoParada.setConfiguracionProducto(configuracionProducto);
				configuracionProductoParada.setParadaId(parada);
				configuracionProductoParada.setActivo(Boolean.TRUE);
				configuracionProductoParada.setFecmodif(Calendar.getInstance().getTime());
				configuracionProductoParada.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				
				configuracionProductoParadaLst.add(configuracionProductoParada);
				configuracionProductoParadaList.setData(new ArrayList<ConfiguracionProductoParada>());
				List<ConfiguracionProductoParada> lsTemp = new ArrayList<ConfiguracionProductoParada>();
				for (ConfiguracionProductoParada cpp : configuracionProductoParadaLst) {
					if (cpp.getActivo()) {
						lsTemp.add(cpp);
					}
				}
				configuracionProductoParadaList.setData(lsTemp);
			
			}else {
				Messagebox.show(
						Labels.getLabel("editarConfiguracionProductosController.MSG.selectItemParada"),
						Labels.getLabel("editarConfiguracionProductosController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (Exception ex) {
			log.error("Erro adicionar cargo" ,ex);
			Messagebox.show(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarConfiguracionProductosController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}
	}
	
	public void onClick$btnRemoverProductoParada(Event ev) throws InterruptedException {
		try {
			ConfiguracionProductoParada cpp = (ConfiguracionProductoParada) configuracionProductoParadaList.getSelected();
			if (cpp != null) {
				configuracionProductoParadaLst.remove(cpp);
				cpp.setFecmodif(Calendar.getInstance().getTime());
				cpp.setActivo(Boolean.FALSE);
				cpp.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
				configuracionProductoParadaList.updateItem(cpp);
				configuracionProductoParadaList.removeItem(cpp);
				configuracionProductoParadaLst.add(cpp);
			}else {
				Messagebox.show(
						Labels.getLabel("editarConfiguracionProductosController.MSG.selectItem"),
						Labels.getLabel("editarConfiguracionProductosController.window.title"),
						Messagebox.OK, Messagebox.EXCLAMATION);
			}
		} catch (Exception ex) {
			log.error("Erro remover cargo: " + ex);
			Messagebox.show(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarConfiguracionProductosController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}
	}
	
	public void onClick$btnSalvar(Event ev) throws InterruptedException {
		cmbTipoEventoExtra.getValue();
		cmbParada.getValue();
		Date dataInicio = fecInicio.getValue();
	    Date dataFin = fecFinal.getValue();
		
		TipoEventoExtra tipoEventoExtra = (TipoEventoExtra) (cmbTipoEventoExtra.getSelectedItem() == null ? null : cmbTipoEventoExtra.getSelectedItem().getValue());
		if (tipoEventoExtra != null) {
			configuracionProducto.setTipoeventoextra(tipoEventoExtra);
		}else {
			Messagebox.show(
					Labels.getLabel("editarConfiguracionProductosController.MSG.selectItemTipoEventoExtra"),
					Labels.getLabel("editarConfiguracionProductosController.window.title"),
					Messagebox.OK, Messagebox.EXCLAMATION);
			return;
		}
		if (fecInicio.getValue().after(fecFinal.getValue())) {
			try {
				Messagebox.show(Labels.getLabel("editarConfiguracionProductosController.MSG.busquedaPeriodo"),
						Labels.getLabel("editarConfiguracionProductosController.window.title"), Messagebox.OK,
						Messagebox.INFORMATION);
			} catch (InterruptedException ex) {
				log.error(ex);
			}
		}else {
			configuracionProducto.setFecVigenciaInicial(dataInicio);
			configuracionProducto.setFecVigenciaFinal(dataFin);
		}
		
		configuracionProducto.setActivo(Boolean.TRUE);
		configuracionProducto.setFecmodif(Calendar.getInstance().getTime());
		configuracionProducto.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
		
		if (configuracionProducto.getConfiguracionProductoId() == null) {
			configuracionProductoService.suscribir(configuracionProducto);
			
			
		}else {
			configuracionProductoService.actualizacion(configuracionProducto);
		}
		if (configuracionProductoParadaLst != null || !configuracionProductoParadaLst.isEmpty()) {
			for (ConfiguracionProductoParada configuracionProductoParada : configuracionProductoParadaLst) {
				if (configuracionProductoParada.getConfiguracionProductoParadaId() == null) {
					if (configuracionProductoParada.getActivo()) {
						configuracionProductoParada.setConfiguracionProducto(configuracionProducto);
						configuracionProductoParadaService.suscribir(configuracionProductoParada);
					}
					
				}else {
					if (!configuracionProductoParada.getActivo()) {
						configuracionProductoParadaService.actualizacion(configuracionProductoParada);
					}
					
				}
			}
		}
		
		Messagebox.show(
				Labels.getLabel("editarConfiguracionProductosController.MSG.suscribirOK"),
				Labels.getLabel("editarConfiguracionProductosController.window.title"),
				Messagebox.OK, Messagebox.INFORMATION);
		winCPC.onClick$btnRefresh(new Event(""));
		closeWindow();
	}
	
	public void onClick$btnApagar(Event ev) throws InterruptedException {
		try {
			int resp = Messagebox.show(
					Labels.getLabel("editarConfiguracionCancelacionController.MSG.borrarPergunta"),
					Labels.getLabel("editarConfiguracionCancelacionController.window.title"),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

			if (resp == Messagebox.YES) {
				if (configuracionProductoParadaLst != null || !configuracionProductoParadaLst.isEmpty()) {
					for (ConfiguracionProductoParada configuracionProductoParada : configuracionProductoParadaLst) {
						configuracionProductoParadaService.borrar(configuracionProductoParada);
					}
				}
				configuracionProductoService.borrar(configuracionProducto);
				Messagebox.show(
						Labels.getLabel("editarConfiguracionProductosController.MSG.borrarOK"),
						Labels.getLabel("editarConfiguracionProductosController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				winCPC.onClick$btnRefresh(new Event(""));
				closeWindow();
			}
		} catch (Exception ex) {
			log.error("",ex);
			Messagebox.show(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarConfiguracionProductosController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
		}
	}

	public ConfiguracionProducto getConfiguracionProducto() {
		return configuracionProducto;
	}

	public void setConfiguracionProducto(ConfiguracionProducto configuracionProducto) {
		this.configuracionProducto = configuracionProducto;
	}

	public Datebox getFecInicio() {
		return fecInicio;
	}

	public void setFecInicio(Datebox fecInicio) {
		this.fecInicio = fecInicio;
	}

	public Datebox getFecFinal() {
		return fecFinal;
	}

	public void setFecFinal(Datebox fecFinal) {
		this.fecFinal = fecFinal;
	}

	public Combobox getCmbParada() {
		return cmbParada;
	}

	public void setCmbParada(Combobox cmbParada) {
		this.cmbParada = cmbParada;
	}

	public Combobox getCmbTipoEventoExtra() {
		return cmbTipoEventoExtra;
	}

	public void setCmbTipoEventoExtra(Combobox cmbTipoEventoExtra) {
		this.cmbTipoEventoExtra = cmbTipoEventoExtra;
	}

	public MyTextboxDecimal getTxtPrecio() {
		return txtPrecio;
	}

	public void setTxtPrecio(MyTextboxDecimal txtPrecio) {
		this.txtPrecio = txtPrecio;
	}

	public List<TipoEventoExtra> getLsTipoEventoExtra() {
		return lsTipoEventoExtra;
	}

	public void setLsTipoEventoExtra(List<TipoEventoExtra> lsTipoEventoExtra) {
		this.lsTipoEventoExtra = lsTipoEventoExtra;
	}

	public TipoEventoExtra getTipoEventoExtra() {
		return tipoEventoExtra;
	}

	public void setTipoEventoExtra(TipoEventoExtra tipoEventoExtra) {
		this.tipoEventoExtra = tipoEventoExtra;
	}

	public List<ConfiguracionProductoParada> getConfiguracionProductoParadaLst() {
		return configuracionProductoParadaLst;
	}

	public void setConfiguracionProductoParadaLst(List<ConfiguracionProductoParada> configuracionProductoParadaLst) {
		this.configuracionProductoParadaLst = configuracionProductoParadaLst;
	}

	public MyListbox getConfiguracionProductoParadaList() {
		return configuracionProductoParadaList;
	}

	public void setConfiguracionProductoParadaList(MyListbox configuracionProductoParadaList) {
		this.configuracionProductoParadaList = configuracionProductoParadaList;
	}
	
	
}
