package es.tier.portlet.base.preferences;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import javax.portlet.PortletPreferences;
import javax.portlet.ReadOnlyException;

import org.apache.log4j.Logger;

public class PortletPreferencesConfig {

	/** Log */
	protected static Logger log = Logger.getLogger(PortletPreferencesConfig.class);

	/** Atributos */
	protected PortletPreferences preferences;
	
	/** Constructor de la clase
	 * @param prefs : objeto PortletPreferences obtenido del request de la petición	 */
	public PortletPreferencesConfig(PortletPreferences prefs){
		preferences = prefs;
	}
	
	
	public void getConfiguracion(IPortletPreferencesBean portletPreferencesBean) {
		log.debug("getConfiguracion() - Leyendo atributos de preferencias...");
		List<String> atributos = Collections.list(preferences.getNames());
		for (String atributo : atributos) {
			String valor = preferences.getValue(atributo, "");
			log.debug("                 - Atributo: " + atributo + ". Valor: " + valor);
			portletPreferencesBean.setPreference(atributo, valor);
		}
	}

	/** Método que actualiza las preferencias del portlet a partir de los parámetros de 
	 * configuración 
	 * @throws PreferencesPortletException */
	public void setConfiguracion(IPortletPreferencesBean portletPreferencesBean) throws PreferencesPortletException {
		try{
			log.debug("setConfiguracion() - Salvando atributos de preferencias...");
			Map<String, String> preferencias = portletPreferencesBean.getPreferences();
			List<String> atributos = new ArrayList<String>(preferencias.keySet());
			for (String atributo : atributos) {
				String valor = preferencias.get(atributo);
				log.debug("                 - Atributo: " + atributo + ". Valor: " + valor);
				preferences.setValue(atributo, valor);	
			}
			preferences.store();
		}
		catch(Exception e){
			throw new PreferencesPortletException("Se ha producido un error al intentar salvar la configuración.", e);
		}
	}
	
	/** Elimina todas las preferencias */
	/** Este método no debería usarse porque puede borrar todas las preferencias del portlet, incluso las que utiliza Liferay. */
	@Deprecated
	public void reset(){
		log.debug("reset() - Reseteando atributos de preferencias...");
		List<String> atributos = Collections.list(preferences.getNames());
		for (String atributo : atributos) {
			try{
				preferences.reset(atributo);
			}
			catch(ReadOnlyException ignore){
				// las preferencias readOnly las ignoramos
			}
		}
	}

}
