package es.dalocar.software;

import java.text.MessageFormat;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

import es.dalocar.software.utils.ResourceUtils;

/**
 * Clase de internacionalización de la aplicacion
 * @author dlopez
 *
 */
public class Messages {
	
	private static final String BUNDLE_NAME = "messages"; //$NON-NLS-1$

	private static final Locale locale = es.dalocar.software.utils.ResourceUtils.getLocale(ResourceUtils.APP_LOCALE);
	
	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
			.getBundle(BUNDLE_NAME, locale);

	/**
	 * Constructor privado
	 *
	 */
	private Messages() {
	}
	
	/**
	 * Devuelve la cadena especifificada internacionalizada
	 * @param key clave del mensaje
	 * @return mensaje localizado
	 */
	public static String getString(String key) {
		try {
			return RESOURCE_BUNDLE.getString(key);
		} catch (MissingResourceException e) {
			return '!' + key + '!';
		}
	}
	
	/**
	 * Contatena e internacionaliza el array de strings que se le pasa
	 * @param prefix Prefijo
	 * @param strings Array de strings para internacionalizar
	 * @param separator separador entre cadenas
	 * @return una cadena que es concatenacion del resto e incluye separadores
	 */
	public static String getStrings(String prefix, String[] strings, String separator) {

		List list = Arrays.asList(strings);
		return getStrings(prefix, strings, separator);

	}
	
	
	/**
	 * Contatena e internacionaliza la lista de strings que se le pasa
	 * @param prefix Prefijo
	 * @param strings lista de strings para internacionalizar
	 * @param separator separador entre cadenas
	 * @return una cadena que es concatenacion del resto e incluye separadores
	 */
	public static String getStrings(String prefix, List strings, String separator) {
		StringBuffer sb = new StringBuffer();
		Iterator it = strings.iterator();
		while (it.hasNext()) {
			Object obj = it.next();
			String translated = getString(obj.toString());
			sb.append(prefix);
			sb.append(translated);
			sb.append(separator);
		}
		return sb.toString();
	}
	
	
    /**
     * Devuelve un mensaje con formato.  
     * 
     * @param key clave del mensaje
     * @param arguments An array of arguments to be inserted into the message.
     * @return the message
     */
    public static String getFormattedString(String key, Object[] arguments) {
        if (locale == null) {
            throw new IllegalArgumentException("Locale not specified"); //$NON-NLS-1$
        }
        String template = getString(key);
        MessageFormat messageFormat = new MessageFormat(template);
        messageFormat.setLocale(locale);
        return messageFormat.format(arguments, new StringBuffer(), null).toString();
    }
}
