package com.fp.common.exception;

import java.text.MessageFormat;
import java.util.Locale;
import java.util.ResourceBundle;

/**
 * Clase que se encarga del manejo de excepciones. 
 * @author Jorge Vaca.
 * @version 2.1
 */
public abstract class ExceptionManager {
	
	/**Bundle que maneja los texto de error por idioma, locale*/
	private ResourceBundle messages;
	/**Locale con el cual se obtiene el bundle.*/
	private Locale locale;
	
	/**
	 * Metodoq ue entrega el mensaje de usuario dada la Excepcion. 
	 * @param pException  Excepcion utilizada para obtener el mensaje de usuario.   
	 * @return String
	 */
	abstract public String getUserMessage(Throwable pException);
	
	/**
	 * Metodo que entrega el codigo de excepcion.  
	 * @param pException  Excepcion utilizada para obtener el codigo de excepcion.
	 * @return  String
	 */
	abstract public String getCode(Throwable pException);
	
	/**
	 * Metodo que fija el Locale, que sirve para obtener el bundel que maneja los textos de la excepcion. 
	 * @param pLocale
	 */
	public void setLocale(Locale pLocale) {
		locale = pLocale;
		messages = ResourceBundle.getBundle("userMessages", locale);
	}
	
	
	/**
	 * Entrega el mensaje del bundle. 
	 * @param pKey  Codigo de mensaje del bundle.
	 * @return
	 */
	protected String getMessage(String pKey) {
		try {
			return messages.getString(pKey);
		} catch (Throwable e) {
			return null;
		}
	}
	
	/**
	 * Entrega el mensaje del bundle. 
	 * @param pKey  Codigo de mensaje del bundle.
	 * @param pParameters   Parametros con los que se cpmpleta el mensaje definido en el bundle.
	 * @return  String
	 */
	protected String getMessage(String pKey, Object... pParameters) {
		try {
			String msg = this.getMessage(pKey);
			if(msg == null){
				msg = pKey;
			}
			return MessageFormat.format(msg, pParameters);
		} catch (Throwable e) {
			return null;
		}
	}
}
