/*
 * @(#) SecurityBean.java $Revision: 1.1 $ $Date: 2008/07/09 23:05:30 $ 
 *
 * Copyright 2008 Sigtao Software S.A. de C.V. Todos los derechos reservados.
 */
package com.sigmatao.security.view.bean;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.ResourceBundle;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.myfaces.tobago.component.UIBox;
import org.apache.myfaces.tobago.component.UIData;
import org.apache.myfaces.tobago.event.SortActionEvent;
import org.apache.myfaces.tobago.model.SheetState;
import com.sigmatao.framework.util.FunctionsUtils;
import com.sigmatao.framework.util.ConstantsUtil;
import com.sigmatao.security.dao.CProfile;
import com.sigmatao.security.dao.CProfileDAO;

/**
 * @author sfbravo
 *
 */
public class CProfileBean {
	/**
	 * 
	 */
	private static final Log LOG = LogFactory.getLog(CProfileBean.class);
	/**
	 * 
	 */
	private int pageSize;
	/**
	 * 
	 */
	private String description;
	/**
	 * 
	 */
	private String mode;
	/**
	 * 
	 */
	private ArrayList<CProfile> profileList;
	/**
	 * @param event
	 * 
	 * <!-- Control de cambios <br>
	 * Autor: Salvador F. Bravo Villegas. <br>
	 * Fecha: 10/07/2008. <br>
	 * Creación del método. <br>
	 * --------------------------------- <br>
	 * Autor: Nombre de la persona que modifica el método. <br>
	 * Fecha: DD/MM/AAAA. <br>
	 * Motivo del cambio: Descripción del cambio realizado al método. <br>
	 * -->
	 */
	@SuppressWarnings("unchecked")
	public void sheetSorter(ActionEvent event) {
		if (event instanceof SortActionEvent) {
			mode = null;
			SortActionEvent sortEvent = (SortActionEvent) event;
			UIData sheet = sortEvent.getSheet();
			SheetState sheetState 
				= sheet.getSheetState(FacesContext.getCurrentInstance());
			String columnId = sheetState.getSortedColumnId();
			List<CProfile> list = (List<CProfile>) sheet.getValue();
			Comparator<CProfile> comparator = null;
			if ("profileId".equals(columnId)) {
				LOG.info("sheetSorter:userId");
			} else if ("profileDesc".equals(columnId)) {
				comparator = new Comparator<CProfile>() {
					public int compare(CProfile o1, CProfile o2) {
						if (o1.getDescription() == null) {
							o1.setDescription("");
						}
						if (o2.getDescription() == null) {
							o2.setDescription("");
						}
						return o1.getDescription().compareToIgnoreCase(
								o2.getDescription());
					}
				};
			} 
			Collections.sort(list, comparator);
			if (!sheetState.isAscending()) {
				Collections.reverse(list);
			}
		}
	}
	
	/**
	 * @param event Event to take mode of search mode.
	 * 
	 * <!-- Control de cambios <br>
	 * Autor: Salvador F. Bravo Villegas. <br>
	 * Fecha: 14/07/2008. <br>
	 * Creación del método. <br>
	 * --------------------------------- <br>
	 * Autor: Nombre de la persona que modifica el método. <br>
	 * Fecha: DD/MM/AAAA. <br>
	 * Motivo del cambio: Descripción del cambio realizado al método. <br>
	 * -->
	 */
	public void saveMode(ActionEvent event) {
		UIParameter  x = (UIParameter) event.getComponent()
			.findComponent("paramProfile");
        mode = x.getValue().toString().trim();
	}
		
	/**
	 * @param actionEvent
	 * 
	 * <!-- Control de cambios <br>
	 * Autor: Salvador F. Bravo Villegas. <br>
	 * Fecha: 10/07/2008. <br>
	 * Creación del método. <br>
	 * --------------------------------- <br>
	 * Autor: Nombre de la persona que modifica el método. <br>
	 * Fecha: DD/MM/AAAA. <br>
	 * Motivo del cambio: Descripción del cambio realizado al método. <br>
	 * -->
	 */
	public void add(ActionEvent actionEvent) {
		if ((description != null) && !(description.equals(""))) {
			CProfile cProfile = new CProfile();
			CProfileDAO cProfileDAO = new CProfileDAO();
			cProfile.setDescription(this.description);
			cProfileDAO.insert(cProfile);
			this.mode = ConstantsUtil.FULL;
		} else {
			FunctionsUtils.addMessage(FacesMessage.SEVERITY_ERROR,
					"incomplete", "", "gsoa");
		}
	}
	
	/**
	 * @param actionEvent
	 * 
	 * <!-- Control de cambios <br>
	 * Autor: Salvador F. Bravo Villegas. <br>
	 * Fecha: 10/07/2008. <br>
	 * Creación del método. <br>
	 * --------------------------------- <br>
	 * Autor: Nombre de la persona que modifica el método. <br>
	 * Fecha: DD/MM/AAAA. <br>
	 * Motivo del cambio: Descripción del cambio realizado al método. <br>
	 * -->
	 */
	public void update(ActionEvent actionEvent) {
		if ((description != null) || !(description.equals(""))) {
			UIComponent component = actionEvent.getComponent();
		    while (!(component instanceof UIBox)) {
		      component = component.getParent();
		    }
		    component = (UIComponent) component.getChildren()
		    	.get(ConstantsUtil.CUATRO);
		    component = (UIComponent) component.getChildren()
		    	.get(ConstantsUtil.CERO);
		    UIData sheet = (UIData) component;
			List<Integer> indexes = sheet.getSheetState(
					FacesContext.getCurrentInstance()).getSelectedRows();
			if (indexes.size() != 0) {
				CProfile cProfile = new CProfile();
				CProfileDAO cProfileDAO = new CProfileDAO();
				cProfile.setProfileId(profileList.get(indexes.get(0))
						.getProfileId());
				cProfile.setDescription(this.description);
				cProfileDAO.update(cProfile);
				this.mode = ConstantsUtil.FULL;
			} else {
				FunctionsUtils.addMessage(FacesMessage.SEVERITY_ERROR,
						"profileNotSelected", "", "gsoa");
			}
		} else {
			FunctionsUtils.addMessage(FacesMessage.SEVERITY_ERROR,
					"incomplete", "", "gsoa");
		}
	}
	
	/**
	 * @param actionEvent
	 * 
	 * <!-- Control de cambios <br>
	 * Autor: Salvador F. Bravo Villegas. <br>
	 * Fecha: 10/07/2008. <br>
	 * Creación del método. <br>
	 * --------------------------------- <br>
	 * Autor: Nombre de la persona que modifica el método. <br>
	 * Fecha: DD/MM/AAAA. <br>
	 * Motivo del cambio: Descripción del cambio realizado al método. <br>
	 * -->
	 */
	public void delete(ActionEvent actionEvent) {
		if ((description != null) || !(description.equals(""))) {
			UIComponent component = actionEvent.getComponent();
		    while (!(component instanceof UIBox)) {
		      component = component.getParent();
		    }
		    component = (UIComponent) component.getChildren()
		    	.get(ConstantsUtil.CUATRO);
		    component = (UIComponent) component.getChildren()
		    	.get(ConstantsUtil.CERO);
		    UIData sheet = (UIData) component;
			List<Integer> indexes = sheet.getSheetState(
					FacesContext.getCurrentInstance()).getSelectedRows();
			sheet.getSheetState(FacesContext.getCurrentInstance())
				.setSelectedRows(null);
			if (indexes.size() != 0) {
				CProfile cProfile = new CProfile();
				CProfileDAO cProfileDAO = new CProfileDAO();
				cProfile.setProfileId(profileList.get(indexes.get(0))
						.getProfileId());
				cProfile.setDescription(profileList.get(indexes.get(0))
						.getDescription());
				cProfileDAO.delete(cProfile);
				this.mode = ConstantsUtil.FULL;
			} else {
				FunctionsUtils.addMessage(FacesMessage.SEVERITY_ERROR,
						"profileNotSelected", "", "gsoa");
			}
		} else {
			FunctionsUtils.addMessage(FacesMessage.SEVERITY_ERROR,
				"incomplete", "", "gsoa");
		}
	}
	
	public void search(ActionEvent actionEvent) {
		CProfile cProfile = new CProfile();
		CProfileDAO cProfileDao = new CProfileDAO();
		cProfile = cProfileDao.getByDesc(description);
		if (cProfile != null) {
			profileList.clear();
			profileList.add(cProfile);
		} else {
			FunctionsUtils.addMessage(FacesMessage.SEVERITY_ERROR,
					"incomplete", "", "gsoa");
		}
	}

	/**
	 * Devuelve el valor de pageSize.
	 *
	 * @return the pageSize
	 */
	public int getPageSize() {
		final ResourceBundle resourceBundle = ResourceBundle.getBundle("gsoa");
		pageSize = Integer.parseInt(resourceBundle.getString("pageSizeBig"));
		return pageSize;
	}

	/**
	 * Asigna el valor pageSize a pageSize.
	 *
	 * @param pPageSize the pageSize to set
	 */
	public void setPageSize(int pPageSize) {
		this.pageSize = pPageSize;
	}
	
	/**
	 * Devuelve el valor de profileList.
	 *
	 * @return the profileList
	 */
	public ArrayList<CProfile> getProfileList() {
		CProfileDAO cProfileDAO = new CProfileDAO();
		if (mode != null) {
			profileList = cProfileDAO.getAll();
		}
		return profileList;
	}

	/**
	 * Asigna el valor pProfileList a profileList.
	 *
	 * @param pProfileList the profileList to set
	 */
	public void setProfileList(ArrayList<CProfile> pProfileList) {
		profileList = pProfileList;
	}

	/**
	 * Devuelve el valor de description.
	 *
	 * @return the description
	 */
	public String getDescription() {
		return description;
	}

	/**
	 * Asigna el valor pDescription a description.
	 *
	 * @param pDescription the description to set
	 */
	public void setDescription(String pDescription) {
		description = pDescription;
	}

	/**
	 * Devuelve el valor de mode.
	 *
	 * @return the mode
	 */
	public String getMode() {
		return mode;
	}

	/**
	 * Asigna el valor pMode a mode.
	 *
	 * @param pMode the mode to set
	 */
	public void setMode(String pMode) {
		mode = pMode;
	}	
}
