package com.ejie.ad74a.exceptions;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.ejie.ad74a.constantes.Constantes;

/**
 * Mensaje.
 * 
 * @author
 */
public class Mensaje implements Serializable {

	private static final long serialVersionUID = 1L;

	// Key
	private String key = null;
	// Lista de parametros
	private List<ParametroKey> parametrosKey = null;
	// Indicativo si key ya es un valor traducido o si hace falta traducirlo
	private boolean traducido = false;

	/**
	 * Constructor para formar mensajes sin parametros y que debe recuperar el
	 * literal de BD
	 * 
	 * @param key {@link String}
	 */
	public Mensaje(String key) {
		this.key = key;
		this.parametrosKey = null;
	}

	/**
	 * Constructor para formar mensajes con el literal ya traducido
	 * 
	 * @param key       {@link String}
	 * @param traducido {@link boolean}
	 */
	public Mensaje(String key, boolean traducido) {
		this.key = key;
		this.traducido = traducido;
		this.parametrosKey = null;
	}

	/**
	 * Constructor para formar mensajes con un parametro el cual se indica si se
	 * debe recueprar el parametro de literales
	 * 
	 * @param key        {@link String}
	 * @param param      {@link String}
	 * @param paramIsKey {@link boolean}
	 */
	public Mensaje(String key, String param, boolean paramIsKey) {
		this.key = key;
		this.parametrosKey = new ArrayList<ParametroKey>();
		this.parametrosKey.add(new ParametroKey(param, paramIsKey));
	}

	/**
	 * Constructor para formar mensajes con varios parámetros los cuales se indican
	 * si se deben recuperar desde literales
	 * 
	 * @param key        {@link String}
	 * @param paramIsKey {@link boolean}
	 * @param params     {@link String}
	 */
	public Mensaje(String key, boolean paramIsKey, String... params) {
		this.key = key;
		this.parametrosKey = new ArrayList<ParametroKey>();
		for (String param : params) {
			this.parametrosKey.add(new ParametroKey(param, paramIsKey));
		}

	}

	/**
	 * Constructor para formar mensajes con dos parametros los cuales se deben
	 * recuperar de BD
	 * 
	 * @param key    {@link String}
	 * @param param1 {@link String}
	 * @param param2 {@link String}
	 * @param isKey  {@link boolean}
	 */
	public Mensaje(String key, String param1, String param2, boolean isKey) {
		this.key = key;
		this.parametrosKey = new ArrayList<ParametroKey>();
		ParametroKey parametroKey1 = new ParametroKey(param1, isKey);
		ParametroKey parametroKey2 = new ParametroKey(param2, isKey);
		this.parametrosKey.add(parametroKey1);
		this.parametrosKey.add(parametroKey2);
	}

	/**
	 * Constructor para formar mensajes con un parametro el cual se debe recuperar
	 * de BD
	 * 
	 * @param key      {@link String}
	 * @param paramKey {@link String}
	 */
	public Mensaje(String key, String paramKey) {
		this(key, paramKey, true);
	}

	/**
	 * Method 'getKey'.
	 * 
	 * @return {@link String}
	 */
	public String getKey() {
		return this.key;
	}

	/**
	 * Method 'setKey'.
	 * 
	 * @param key {@link String}
	 */
	public void setKey(String key) {
		this.key = key;
	}

	/**
	 * Method 'getParametrosKey'.
	 * 
	 * @return List<ParametroKey>
	 */
	public List<ParametroKey> getParametrosKey() {
		return this.parametrosKey;
	}

	/**
	 * Method 'setParametrosKey'.
	 * 
	 * @param parametrosKey List<ParametroKey>
	 */
	public void setParametrosKey(List<ParametroKey> parametrosKey) {
		this.parametrosKey = parametrosKey;
	}

	/**
	 * Method 'isTraducido'
	 * 
	 * @return boolean
	 */
	public boolean isTraducido() {
		return this.traducido;
	}

	/**
	 * Method 'setTraducido'
	 * 
	 * @param traducido boolean
	 */
	public void setTraducido(boolean traducido) {
		this.traducido = traducido;
	}

	/**
	 * Comprueba si el mensaje tiene parametros
	 * 
	 * @return boolean
	 */
	public boolean isParametrosKeyList() {
		return (this.parametrosKey != null && !this.parametrosKey.isEmpty());
	}

	/**
	 * Retorna los parametros seguidos por comas
	 * 
	 * @return String
	 */
	public String getParametrosKeyStr() {
		StringBuilder stb = new StringBuilder(Constantes.STRING_BUILDER_INIT);
		if (this.isParametrosKeyList()) {
			boolean isPrimeraVez = true;
			for (ParametroKey parametroKey : this.getParametrosKey()) {
				if (!isPrimeraVez) {
					stb.append(",");
				}
				stb.append(parametroKey.getValorParametro());
				isPrimeraVez = false;

			}
		}
		return stb.toString();
	}

	/**
	 * Retorna los parametros como Array de Object
	 * 
	 * @return Object[]
	 */
	public Object[] getParametrosKeyObject() {
		Object[] objs = null;
		if (this.isParametrosKeyList()) {
			objs = new Object[this.getParametrosKey().size()];
			Iterator<ParametroKey> itParametrosKey = this.getParametrosKey().iterator();
			int i = 0;
			while (itParametrosKey.hasNext()) {
				objs[i] = itParametrosKey.next().getValorParametro();
				i++;
			}
		}
		return objs;
	}
}