package com.ejie.ab39a.utils;

import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.stereotype.Component;
import org.springframework.util.PropertyPlaceholderHelper;

/**
 * Clase para recuperar valores de propiedades
 * 
 *  
 * 
 */
@Component(value = "applicationProperties")
public class UtilProperties extends PropertyPlaceholderConfigurer {

	private static final Logger logger = LoggerFactory.getLogger(UtilProperties.class);

	/**
	 * Propiedades definidas en el ".properties".
	 * 
	 *  
	 * 
	 */
	public static enum Props {
		// Para oficina en gfi
		en_oficina("en_oficina"), //
		token_oficina("token.oficina"),
		// Carpeta temporal de ficheros
		temp_path("temp.path"),
		// Path imagenes reports Jasper
		report_images_path("report.images.path"), ruta_plantilla_temporal("ruta.plantilla.temporal"), excel_plantilla(
				"excel.plantilla"), certificados_admitidos(
						"certificates"), certificado_entidad("certificado.entidad"), certificado_representante(
								"certificado.representante"), certificados_acceso_directo(
										"certificados.acceso.directo"), certificado_personal_publico(
												"certificado.personal.publico");

		private String name;

		/**
		 * Constructor del enumerado
		 * 
		 * @param name
		 *            String
		 */
		private Props(String name) {
			this.name = name;
		}

		/**
		 * Obtiene el valor de la propiedad
		 * 
		 * @return String
		 */
		public String getValue() {
			return UtilProperties.getProperty(this.name);
		}
	}

	private static Map<String, String> propertiesMap;

	@Override
	protected void processProperties(ConfigurableListableBeanFactory beanFactory, final Properties props)
			throws BeansException {

		super.processProperties(beanFactory, props);
		UtilProperties.propertiesMap = new HashMap<String, String>();
		final PropertyPlaceholderHelper.PlaceholderResolver resolver = new PropertyPlaceholderHelper.PlaceholderResolver() {
			public String resolvePlaceholder(final String key) {
				return props.getProperty(key);
			}
		};
		final PropertyPlaceholderHelper helper = new PropertyPlaceholderHelper(DEFAULT_PLACEHOLDER_PREFIX,
				DEFAULT_PLACEHOLDER_SUFFIX, DEFAULT_VALUE_SEPARATOR, true);
		for (final Object key : props.keySet()) {
			UtilProperties.propertiesMap.put((String) key,
					helper.replacePlaceholders(props.getProperty((String) key), resolver));
		}
	}

	/**
	 * Recuperar valor de una propiedad
	 * 
	 * @param name
	 *            String name
	 * @return String String
	 */
	public static String getProperty(String name) {
		String value = UtilProperties.propertiesMap.get(name);
		UtilProperties.logger.trace("getProperty ({}) = [{}]", name, value);
		return value;
	}
}