package com.ejie.ad74a.util.comun;

import java.util.List;
import java.util.Locale;

import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.context.ContextLoader;

import com.ejie.ad74a.exceptions.ParametroKey;

public final class UtilLiterales {

	/**
	 * Constructor de UtilidadesLiterales
	 */
	private UtilLiterales() {
		super();
	}

	/**
	 * Consigue el mensaje "code" del messageSource indicado, en el idioma pasado
	 * como parametro locale
	 *
	 *
	 * @param messageSource ReloadableResourceBundleMessageSource messageSource
	 * @param code          String code
	 * @param locale        Locale locale
	 * @return String message
	 */
	public static String getLiteralMessage(ReloadableResourceBundleMessageSource messageSource, Locale locale,
			String code) {
		return messageSource.getMessage(code, null, locale);
	}

	/**
	 * Consigue el mensaje "code" del messageSource indicado, en el idioma actual
	 *
	 * *Es posible que si se cambian los literales a BBDD, haga falta cambiar*
	 *
	 * @param messageSource ReloadableResourceBundleMessageSource messageSource
	 * @param code          String code
	 * @return String message
	 */
	public static String getLiteralMessage(ReloadableResourceBundleMessageSource messageSource, String code) {
		Locale locale = LocaleContextHolder.getLocale();
		return UtilLiterales.getLiteralMessage(messageSource, locale, code);
	}

	/**
	 * Metodo que parsea los parametros a objects
	 *
	 * @param messageSource ReloadableResourceBundleMessageSource messageSource
	 * @param list          List<ParametroKey> list
	 * @return Object[] objetos
	 */
	public static Object[] parseParametroKeyToObject(ReloadableResourceBundleMessageSource messageSource,
			List<ParametroKey> list) {
		Object[] objetos = null;
		if (!Utilidades.isEmptyList(list)) {
			objetos = new Object[list.size()];
			int i = 0;
			for (ParametroKey parametroKey : list) {
				objetos[i] = parametroKey.isEsKey()
						? UtilLiterales.getLiteralMessage(messageSource, parametroKey.getValorParametro())
						: parametroKey.getValorParametro();
				i++;
			}
		}
		return objetos;
	}

	/**
	 * Consigue el mensaje "code" del messageSource indicado, en el idioma actual,
	 * utilizando los parametros indicados
	 *
	 * *Es posible que si se cambian los literales a BBDD, haga falta cambiar*
	 *
	 * @param messageSource ReloadableResourceBundleMessageSource messageSource
	 * @param code          String code
	 * @param params        Object[] params
	 * @return String message
	 */
	public static String getLiteralMessageWithParams(ReloadableResourceBundleMessageSource messageSource, String code,
			Object[] params) {
		Locale locale = LocaleContextHolder.getLocale();
		return messageSource.getMessage(code, params, locale);
	}

	/**
	 * Obtiene un objeto del contexto de Spring
	 * 
	 * @param name String nombre del bean del contexto a obtener
	 * @return Object objeto devuelto desde el contexto
	 */
	public static Object obtenerWebApplicationObjectContext(String name) {
		return ContextLoader.getCurrentWebApplicationContext().getBean(name);
	}

}