package es.dalocar.software.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
import java.util.StringTokenizer;

import org.springframework.util.StringUtils;

/**
 * Clase de utilidades para los recursos
 * @author dlopez
 *
 */
public class ResourceUtils {

	private static final String DEFAULT_CONFIG_FILENAME = "resources.properties";
	
	public static final String APP_USER = "app.user";
	public static final String APP_LOCALE = "app.locale";
	public static final String BUTTON_HEIGHT = "button.height";
	public static final String TEXT_HEIGHT = "text.height";
	public static final String WIDGET_REQUIRED_BACKGROUND = "widget.required.background";
	public static final String WIDGET_XXL_WIDTH = "widget.xxl.width";
	public static final String WIDGET_XL_WIDTH = "widget.xl.width";
	public static final String WIDGET_LARGE_WIDTH = "widget.large.width";
	public static final String WIDGET_MEDIUM_WIDTH = "widget.medium.width";
	public static final String WIDGET_SHORT_WIDTH = "widget.short.width";
	public static final String IMAGE_LOGO = "image.logo";
	public static final String IMAGE_APP_ICON = "image.app.icon";
	public static final String YEAR_RANGE = "year.range";
	public static final String DEVELOP_MODE = "develop.mode";
	public static final String AWARD_RANGE = "award.range";
	public static final String MONTH_CHANGE = "month.change";
	
	public static final String DESC_LINEAFACTURA="lineafactura.descripcion";
	public static final String IVA_LINEAFACTURA ="lineafactura.iva";
	public static final String CANT_LINEAFACTURA ="lineafactura.cantidad";
	public static final String PRECIO_LINEAFACTURA ="lineafactura.precio";
	
	public static final String IRPF_FACTURA ="factura.irpf";
	
	
	private static String configFileName;
	private static Properties props = null;
	
	//Carga de datos de configuracion
	static {
	    configFileName = DEFAULT_CONFIG_FILENAME;
	    getProperties();
	}
	
	private ResourceUtils() {
		//Nada que hacer
	}
	
	/**
	 * Carga y devuelve las propiedades de configuracion
	 * @return las propiedades de configuracion
	 */
	public static Properties getProperties() {
	    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
		try {
			InputStream is = classLoader.getResourceAsStream(configFileName);
			props = new Properties();
			props.load(is);
			is.close();
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
		return props;
	}
	
	/**
	 * Devuelve el nombre del archivo de configuracion
	 * @return el nombre del archivo de configuracion
	 */
	public static String getConfigFileName() {
		return configFileName;
	}
	
	/**
	 * Establece el nombre del fichero de configuracion
	 * @param name
	 */
	public static void setConfigFileName(String name) {
	    configFileName = name;
	    getProperties();
	}
	
	/**
	 * Devuelve la propiedad de configuracion
	 * @param key
	 * @return valor de la propiedad
	 */
	public static String getString(String key) {
		return props.getProperty(key);
	}
	
	
	/**
	 * Devuelve la propiedad de configuracion en forma de <code>int</code>
	 * @param key 
	 * @return Recurso como entero
	 */
	public static int getInt(String key) {
	    return Integer.valueOf(getString(key)).intValue();
	}
	
	/**
	 * Devuelve la propiedad de configuracion en forma de <code>boolean</code>
	 * @param key
	 * @return Recurso como boleano
	 */
	public static boolean getBoolean(String key) {		
	    return Boolean.parseBoolean(getString(key));
	}
	
	/**
	 * Obtiene una definicion de color RGB desde el archivo de recursos
	 * @param key clave de la definicion del color
	 * @return un objeto ColorDefinition
	 */
	public static ColorDefinition getColorDefinition(String key) {
		String str = getString(key);
		ColorDefinition colorDefinition = new ColorDefinition();
		List tokens = new ArrayList(); 
		StringTokenizer st = new StringTokenizer(str, ",");
		
		while (st.hasMoreTokens()) {
			tokens.add(st.nextToken().trim());
		}
		
		if (tokens.size() == 3) {
			colorDefinition.setRed(Integer.parseInt((String) tokens.get(0)));
			colorDefinition.setGreen(Integer.parseInt((String) tokens.get(1)));
			colorDefinition.setBlue(Integer.parseInt((String) tokens.get(2)));
		}
		
		return colorDefinition;
	}
	
	/**
	 * Devuelve el Locale correspondiente a la cadena de texto especificada
	 * @param key la clave del objeto Locale
	 * @return el objeto Locale
	 */
	public static Locale getLocale(String key) {
		String loc = getString(key);
		return StringUtils.parseLocaleString(loc);
	}
	
}
