/**
 * Licensed under the MICE s.r.l.
 * End User License Agreement
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.micegroup.it/voila/license.html
 */
package it.mice.voila.runtime.util;

import java.util.ArrayList;
import java.util.Iterator;

/**
 */
public class UserMessages extends ArrayList<UserMessage> {
    /**
	 * 
	 */
	private static final long serialVersionUID = 7909113289540900419L;
	
	/**
	 * constant for object dump serialization
	 */
    private static final String MESSAGE_DELIMITER = "|___|";    
    
	public UserMessages() {
    }
	
	public void addMessage(String key, String severity, String fieldPath, Object... params) {
		UserMessage msg = new UserMessage(key, params);
		msg.setSeverity(severity);
		msg.setFieldPath(fieldPath);
		add(msg);
	}
	
	public void addUserMessages(UserMessages userMessages) {
		addAll(userMessages);
	}
	
	public void addUserMessage(UserMessage userMessage) {
		add(userMessage);
	}
	
	public void addInfoMessage(String key, Object... params) {
		addMessage(key, UserMessage.SEVERITY_INFO, null, params);
	}
	
	public void addWarningMessage(String key, Object... params) {
		addMessage(key, UserMessage.SEVERITY_WARNING, null, params);
	}
	
	public void addErrorMessage(String key, Object... params) {
		addMessage(key, UserMessage.SEVERITY_ERROR, null, params);
	}
	
	public void addFieldError(String key, String fieldPath, Object... params) {
		addMessage(key, UserMessage.SEVERITY_ERROR, fieldPath, params);
	}

	public void addFieldErrorWithRejectedValue(String key, String fieldPath, Object rejectedValue, Object... params) {
		UserMessage msg = new UserMessage(key, params);
		msg.setSeverity(UserMessage.SEVERITY_ERROR);
		msg.setFieldPath(fieldPath);
		msg.setRejectedValue(rejectedValue);
		add(msg);
	}
	
    /**
     * controlla se nella lista degli UserMessage esiste almeno un messaggio con la severity indicata come parametro
     * @param severity - livello di severity che si vuole cercare
     * @return true : esiste
     * 		   false: non esiste
     */
    public boolean checkErrorLevel(String severity) {
        boolean trovato = false;
        Iterator<UserMessage> iter = this.iterator();
        while (iter.hasNext() && !trovato ) {
            UserMessage elemUser = (UserMessage) iter.next();
            trovato = (elemUser.getSeverity().compareToIgnoreCase(severity)==0);
        }
        return trovato;
    }

    /**
     * controlla se nella lista degli UserMessage esiste almeno un messaggio con la severity indicata come parametro
     * @param severity - livello di severity che si vuole cercare
     * @return true : esiste
     * 		   false: non esiste
     */
    public String getHighestLevel() {
    	if (checkErrorLevel(UserMessage.SEVERITY_ERROR)) {
    		return UserMessage.SEVERITY_ERROR;
    	}
    	if (checkErrorLevel(UserMessage.SEVERITY_WARNING)) {
    		return UserMessage.SEVERITY_WARNING;
    	}
    	if (checkErrorLevel(UserMessage.SEVERITY_INFO)) {
    		return UserMessage.SEVERITY_INFO;
    	}
        return "";
    }

    public boolean hasErrors() {
    	return checkErrorLevel(UserMessage.SEVERITY_ERROR);
    }
    
    public String toString() {
        final StringBuffer sb = new StringBuffer();
        sb.append("UserMessages=");
        sb.append("{");
        Iterator<UserMessage> i = this.iterator();
        while (i.hasNext()) {
            UserMessage userMessage = (UserMessage) i.next();
            sb.append(userMessage);
            if (i.hasNext())
                sb.append(userMessage).append(", ");
        }
        sb.append("}");
        return sb.toString();
    }
    
	public String toObjectDump() {
        final StringBuffer sb = new StringBuffer();
        Iterator<UserMessage> i = this.iterator();
        while (i.hasNext()) {
            UserMessage userMessage = (UserMessage) i.next();
            sb.append(userMessage.toObjectDump());
            if (i.hasNext())
                sb.append(MESSAGE_DELIMITER);
        }
        return sb.toString();
	}
	
	public void setObjectDump(String key) {
		String[] array = org.apache.commons.lang.StringUtils.splitByWholeSeparator(key, MESSAGE_DELIMITER);
		for (String userMessageStr : array) {
			UserMessage userMessage = new UserMessage();
			userMessage.setObjectDump(userMessageStr);
			addUserMessage(userMessage);
		}
	}	
}
