/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rjconsultores.ventaboletos.web.gui.controladores.seguridad;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.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.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Button;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.ComboitemRenderer;
import org.zkoss.zul.Radio;
import org.zkoss.zul.Radiogroup;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;

import com.rjconsultores.ventaboletos.entidad.FuncionSistema;
import com.rjconsultores.ventaboletos.entidad.Perfil;
import com.rjconsultores.ventaboletos.entidad.PerfilFuncion;
import com.rjconsultores.ventaboletos.service.FuncionSistemaService;
import com.rjconsultores.ventaboletos.service.PerfilFuncionService;
import com.rjconsultores.ventaboletos.service.PerfilService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.vo.segurida.PerfilJerarquia;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderPermiso;

/**
 * 
 * @author rodrigo
 */
@Controller("editarPerfilController")
@Scope("prototype")
public class EditarPerfilController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	private static Logger log = Logger.getLogger(EditarPerfilController.class);

	@Autowired
	private PerfilService perfilService;
	@Autowired
	private FuncionSistemaService funcionSistemaService;
	@Autowired
	private PerfilFuncionService perfilFuncionService;
	private Perfil perfil;
	private MyListbox perfilList;
	private MyListbox permisoList;
	private Textbox txtDescPerfil;
	private List<FuncionSistema> lsFuncionSistema;
	private List<FuncionSistema> lsAllFuncionPerfil;
	private List<PerfilFuncion> lsPermiso;
	private Combobox cmbFuncionSistema;
	private Button btnApagar;
	private Window winEditarPerfil;
	private Radiogroup indPermiso;
	private Radio radReadOnly;
	private Radio radWrite;

	public Perfil getPerfil() {
		return perfil;
	}

	public void setPerfil(Perfil perfil) {
		this.perfil = perfil;
	}

	public Combobox getCmbFuncionSistema() {
		return cmbFuncionSistema;
	}

	public void setCmbFuncionSistema(Combobox cmbFuncionSistema) {
		this.cmbFuncionSistema = cmbFuncionSistema;
	}

	public List<FuncionSistema> getLsFuncionSistema() {
		return lsFuncionSistema;
	}

	public void setLsFuncionSistema(List<FuncionSistema> lsFuncionSistema) {
		this.lsFuncionSistema = lsFuncionSistema;
	}

	public Button getBtnApagar() {
		return btnApagar;
	}

	public void setBtnApagar(Button btnApagar) {
		this.btnApagar = btnApagar;
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsFuncionSistema = funcionSistemaService.obtenerTodos();
		lsAllFuncionPerfil = new ArrayList<FuncionSistema>();

		super.doAfterCompose(comp);

		permisoList.setItemRenderer(new RenderPermiso());

		permisoList.addEventListener("onDoubleClick", new EventListener() {
			@Override
			public void onEvent(Event event) throws Exception {
				PerfilFuncion pf = (PerfilFuncion) permisoList.getSelected();
				abrirPefilFuncion(pf);
			}
		});

		perfil = (Perfil) Executions.getCurrent().getArg().get("perfil");
		if (perfil.getPerfilId() != null) {
			perfil = perfilService.obtenerID(perfil.getPerfilId());

			for (FuncionSistema fas : lsFuncionSistema) {
				for (PerfilFuncion pf : perfil.getPerfilFuncionList()) {
					FuncionSistema fs = pf.getFuncionSistema();
					if (fas.equals(fs)) {
						lsAllFuncionPerfil.add(fas);
					}
				}
			}
		}

		perfilList = (MyListbox) Executions.getCurrent().getArg().get("perfilList");

		if (perfil.getPerfilFuncionList() == null) {
			lsPermiso = new ArrayList<PerfilFuncion>();
		} else {
			lsPermiso = perfil.getPerfilFuncionList();
			Collections.sort(lsPermiso, new Comparator<PerfilFuncion>() {

				@Override
				public int compare(PerfilFuncion o1, PerfilFuncion o2) {
					return o1.getFuncionSistema().getNombfuncion().compareTo(o2.getFuncionSistema().getNombfuncion());
				}

			});
		}
		permisoList.setData(lsPermiso);

		if (perfil.getPerfilId() == null) {
			btnApagar.setVisible(Boolean.FALSE);
		}
		cmbFuncionSistema.setItemRenderer(new ComboitemRenderer() {

			@Override
			public void render(Comboitem cmbtm, Object o) throws Exception {
				FuncionSistema fsItem = (FuncionSistema) o;
				for (FuncionSistema fs : lsAllFuncionPerfil) {
					if (fsItem.getFuncionsistemaId().equals(fs.getFuncionsistemaId())) {
						cmbtm.setVisible(false);
					}
				}
				cmbtm.setLabel(fsItem.getNombfuncion());
				cmbtm.setValue(fsItem);
			}
		});

		winEditarPerfil.addEventListener("onClose", new EventListener() {

			@Override
			public void onEvent(Event event) throws Exception {
				txtDescPerfil.getText();
				if (lsPermiso.isEmpty()) {
					Clients.alert(Labels.getLabel("editarPerfilController.MSG.funcionObligatorio"),
							Labels.getLabel("editarPerfilController.window.title"),
							Messagebox.INFORMATION);

				}
				event.stopPropagation();

			}
		});

		txtDescPerfil.focus();
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public void abrirPefilFuncion(PerfilFuncion perfilFuncion) {
		Map args = new HashMap();
		args.put("perfilFuncion", perfilFuncion);
		args.put("permisoList", permisoList);

		openWindow("/gui/seguridad/editarPerfilFuncion.zul",
				Labels.getLabel("editarPerfilController.window.title"), args, MODAL);

	}

	private boolean duplicado() {
		List<Perfil> listPerfil = perfilService.buscar(txtDescPerfil.getText());
		if (listPerfil.isEmpty()) {
			return false;
		}
		boolean duplicado = true;

		if (perfil.getPerfilId() == null) {
			return true;
		}

		for (Perfil p : listPerfil) {
			if (p.getPerfilId().equals(perfil.getPerfilId())) {
				duplicado = false;
			}
		}

		return duplicado;
	}

	public void onClick$btnSalvar(Event ev) {
		txtDescPerfil.getText();

		try {
			if (lsPermiso.isEmpty()) {
				Clients.alert(Labels.getLabel("editarPerfilController.MSG.funcionObligatorio"),
						Labels.getLabel("editarPerfilController.window.title"),
						Messagebox.INFORMATION);

				return;
			}

			if (duplicado()) {
				Clients.alert(Labels.getLabel("MSG.Registro.Existe"),
						Labels.getLabel("editarPerfilController.window.title"),
						Messagebox.INFORMATION);

				return;
			}

			perfil.setActivo(Boolean.TRUE);
			perfil.setFecmodif(Calendar.getInstance().getTime());
			perfil.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			perfil.setPerfilFuncionList(lsPermiso);

			if (perfil.getPerfilId() == null) {
				perfilService.suscribir(perfil);
				perfilList.addItem(perfil);
			} else {
				perfilService.actualizacion(perfil);
				perfilList.updateItem(perfil);
			}

			Messagebox.show(
					Labels.getLabel("editarPerfilController.MSG.suscribirOK"),
					Labels.getLabel("editarPerfilController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);

			closeWindow();
		} catch (Exception ex) {
			log.error(ex);
			Clients.alert(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarEstacionController.window.title"),
					Messagebox.INFORMATION);
		}
	}

	public void onClick$btnApagar(Event ev) {
		try {
			int resp = Messagebox.show(
					Labels.getLabel("editarPerfilController.MSG.borrarPergunta"),
					Labels.getLabel("editarPerfilController.window.title"),
					Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

			if (resp == Messagebox.YES) {
				for (PerfilFuncion pf : perfil.getPerfilFuncionList()) {
					pf.setActivo(Boolean.FALSE);
					pf.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
					pf.setFecmodif(Calendar.getInstance().getTime());
				}

				perfilService.borrar(perfil);

				Messagebox.show(
						Labels.getLabel("editarPerfilController.MSG.borrarOK"),
						Labels.getLabel("editarPerfilController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);

				perfilList.removeItem(perfil);

				closeWindow();
			}
		} catch (Exception ex) {
			log.error(ex);
			Clients.alert(
					Labels.getLabel("MSG.Error"),
					Labels.getLabel("editarEstacionController.window.title"),
					Messagebox.INFORMATION);
		}
	}

	public void onClick$btnAdicionarPermiso(Event ev) {
		Comboitem comboItem = cmbFuncionSistema.getSelectedItem();
		if (comboItem != null && indPermiso.getSelectedItem() != null) {
			FuncionSistema fs = (FuncionSistema) comboItem.getValue();
			PerfilFuncion pf = new PerfilFuncion();
			pf.setActivo(Boolean.TRUE);
			pf.setFuncionSistema(fs);
			pf.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			pf.setFecmodif(Calendar.getInstance().getTime());
			pf.setPerfil(perfil);

			if (radReadOnly.isChecked()) {
				pf.setIndLectura(Boolean.TRUE);
			} else if (radWrite.isChecked()) {
				pf.setIndLectura(Boolean.FALSE);
			}

			lsPermiso.add(pf);
			permisoList.setData(lsPermiso);
			perfil.setPerfilFuncionList(lsPermiso);

			cmbFuncionSistema.setSelectedItem(null);
			cmbFuncionSistema.setValue(null);
			comboItem.setVisible(false);
		}
	}

	public void onClick$btnRemoverPermiso(Event ev) {
		PerfilFuncion pf = (PerfilFuncion) permisoList.getSelected();
		if (pf != null) {
			pf.setActivo(Boolean.FALSE);
			pf.setUsuarioId(UsuarioLogado.getUsuarioLogado().getUsuarioId());
			pf.setFecmodif(Calendar.getInstance().getTime());

			if (pf.getPerfilfuncionId() != null) {
				perfilFuncionService.borrar(pf);
			}

			int indice = 0;
			for (int i = 0; i < lsPermiso.size(); i++) {
				PerfilFuncion pfL = lsPermiso.get(i);
				if (pfL.getFuncionSistema() != null) {
					if (pfL.getFuncionSistema().equals(pf.getFuncionSistema())) {
						indice = i;
					}
				}
			}

			lsPermiso.remove(indice);
			permisoList.setData(lsPermiso);
			perfil.setPerfilFuncionList(lsPermiso);

			List<Component> children = cmbFuncionSistema.getChildren();
			for (Component c : children) {
				if (c instanceof Comboitem) {
					Comboitem ci = (Comboitem) c;
					if ((!ci.isVisible()) && ((FuncionSistema) ci.getValue()).getFuncionsistemaId().equals(pf.getFuncionSistema().getFuncionsistemaId())) {
						ci.setVisible(true);
					}
				}
			}
		}
	}
	@SuppressWarnings({ "rawtypes", "unchecked" })
	public void onClick$btnCopiar(Event ev) throws InterruptedException {

		if(perfil == null || perfil.getPerfilId() == null) {
			Clients.alert(
					Labels.getLabel("editarPerfilController.MSG.selecioneUmPerfil"),
					Labels.getLabel("editarEstacionController.window.title"),
					Messagebox.INFORMATION);
			return;
		}
		
		Map args = new HashMap();
		args.put("perfil", perfil);

		openWindow("/gui/seguridad/copiarPerfil.zul",
				Labels.getLabel("copiarPerfilController.window.title"), args, MODAL);

	}
}
