/*
 * WepsMessageLog.java
 *
 * Created on January 17, 2006, 3:57 PM
 *
 * To change this template, choose Tools | Options and locate the template under
 * the Source Creation and Management node. Right-click the template and choose
 * Open. You can then make changes to the template in the Source Editor.
 */
package usda.weru.util;

import java.util.ArrayList;
import java.util.Collections;


/**
 *
 * @author joelevin
 */
public class WepsMessageLog {

    private final ArrayList<WepsMessage> c_messages;

    /** Creates a new instance of WepsMessageLog */
    public WepsMessageLog() {
        c_messages = new ArrayList<WepsMessage>();
    }

    /**
     *
     * @param messages
     */
    public WepsMessageLog(ArrayList<WepsMessage> messages) {
        c_messages = messages;
    }

    /**
     * Logs the passed message object
     * @param message WepsMessage object to be place in the log.
     */
    public synchronized void logMessage(WepsMessage message) {
        c_messages.add(message);
        switch (message.getSeverity()) {
            case ERROR:
                //System.err.println(message.toString());
                break;
            case WARNING:
                //System.out.println(message.toString());
                break;
            case INFORMATION:
                //System.out.println(message.toString());
                break;
        }
    }

    /**
     * Logs a message with the given severity and text.
     * @param severity WepsMessage.MessageSeverity indicating how serious the text is.  
     * @param text The string message to store.
     */
    public void logMessage(WepsMessage.MessageSeverity severity, String text) {
        logMessage(new WepsMessage(severity, text));

    }

    /**
     * Clears the message log.
     */
    public void clear() {
        c_messages.clear();

    }

    /**
     * Returns all the messages in the log.
     * @return 
     */
    public ArrayList<WepsMessage> getMessages() {
        return c_messages;

    }

    /**
     * Returns messages in the log matching the given severities
     * @param broadInclude If true the method will return messages with equal or lesser severity than the severities in the passed array.
     * @param severities
     * @return 
     */
    public ArrayList<WepsMessage> getMessages(boolean broadInclude, WepsMessage.MessageSeverity... severities) {
        ArrayList<WepsMessage> filteredMessages = new ArrayList<WepsMessage>();
        for (WepsMessage message : c_messages) {
            for (WepsMessage.MessageSeverity severity : severities) {
                if (broadInclude) { //Lesser and equal severities.
                    if (message.getSeverity().isAsSevere(severity) || message.getSeverity().isLessSevereThan(severity)) {
                        filteredMessages.add(message);
                        break;
                    }
                } else {//Only what is asked for.
                    if (message.getSeverity() == severity) {
                        filteredMessages.add(message);
                        break;
                    }
                }
            }
        }

        return filteredMessages;
    }

    /**
     *
     * @param severities
     * @return
     */
    public ArrayList<WepsMessage> getMessages(WepsMessage.MessageSeverity... severities) {
        return getMessages(false, severities);
    }

    /**
     *
     * @return
     */
    public ArrayList<WepsMessage.MessageSeverity> getSortedSeverites() {
        ArrayList<WepsMessage.MessageSeverity> sortedSeverities = new ArrayList<>();
        for (WepsMessage message : c_messages) {
            if (!sortedSeverities.contains(message.getSeverity())) {
                sortedSeverities.add(message.getSeverity());
            }
        }

        Collections.sort(sortedSeverities, WepsMessage.MessageSeverity.INFORMATION);
        return sortedSeverities;
    }

    /**
     *
     * @return
     */
    public int getCount() {
        return c_messages.size();
    }

    /**
     *
     * @param broadInclude
     * @param severities
     * @return
     */
    public int getCount(boolean broadInclude, WepsMessage.MessageSeverity... severities) {
        return getMessages(broadInclude, severities).size();
    }

    /**
     *
     * @param severities
     * @return
     */
    public int getCount(WepsMessage.MessageSeverity... severities) {
        return getCount(false, severities);
    }

    /**
     *
     * @param broadInclude
     * @param severities
     * @return
     */
    public boolean hasMessage(boolean broadInclude, WepsMessage.MessageSeverity... severities) {
        return (getMessages(broadInclude, severities).size() > 0);
    }

    /**
     *
     * @param severities
     * @return
     */
    public boolean hasMessage(WepsMessage.MessageSeverity... severities) {
        return hasMessage(false, severities);
    }

    /**
     *
     * @return
     */
    public boolean hasMessage() {
        return (c_messages.size() > 0);
    }

    /**
     *
     * @param log
     */
    public void mergeLog(WepsMessageLog log) {
        for (WepsMessage message : log.getMessages()) {
            logMessage(message);
        }
    }
}
