/*
 * WepsMessage.java
 *
 * Created on January 11, 2006, 1:24 PM
 *
 * Designed to store messages to be given to the user or written to a log.
 */
package usda.weru.util;

import java.util.*;

/**
 *
 * @author Joseph Levin
 */
public class WepsMessage extends Exception {

    private static final long serialVersionUID = 1L;

    /**
     *
     */
    public enum MessageSeverity implements Comparator<Object> {

        /**
         *
         */
        INFORMATION(1),
        /**
         *
         */
        WARNING(2),
        /**
         *
         */
        ERROR(3);

        /**
         *
         * @param a
         * @param b
         * @return
         */
        @Override
        public int compare(Object a, Object b) {
            if (a instanceof MessageSeverity && b instanceof MessageSeverity) {
                if (((MessageSeverity) a).getNumericSeverity() == ((MessageSeverity) b).getNumericSeverity()) {
                    return 0;
                } else if (((MessageSeverity) a).getNumericSeverity() < ((MessageSeverity) b).getNumericSeverity()) {
                    return 1;
                } else if (((MessageSeverity) a).getNumericSeverity() > ((MessageSeverity) b).getNumericSeverity()) {
                    return -1;
                }

            }
            return 0;
        }

        private final int c_numericSeverity;

        MessageSeverity(int numericSeverity) {
            c_numericSeverity = numericSeverity;
        }

        /**
         *
         * @return
         */
        public int getNumericSeverity() {
            return c_numericSeverity;
        }

        /**
         *
         * @param severity
         * @return
         */
        public boolean isMoreSevereThan(MessageSeverity severity) {
            return (c_numericSeverity > severity.getNumericSeverity());
        }

        /**
         *
         * @param severity
         * @return
         */
        public boolean isLessSevereThan(MessageSeverity severity) {
            return (c_numericSeverity < severity.getNumericSeverity());
        }

        /**
         *
         * @param severity
         * @return
         */
        public boolean isAsSevere(MessageSeverity severity) {
            return (c_numericSeverity == severity.getNumericSeverity());
        }

    }

    private MessageSeverity c_severity = MessageSeverity.INFORMATION;
    private String c_message = "";
    private Date c_timestamp;

    private int _unnamed_;

    /**
     * Creates a new instance of WepsMessage 
     * @param severity
     * @param message
     */
    public WepsMessage(MessageSeverity severity, String message) {
        c_severity = severity;
        c_message = message;
        c_timestamp = new Date();
    }

    /**
     *
     * @param severity
     * @param e
     */
    public WepsMessage(MessageSeverity severity, Exception e) {
        c_severity = severity;
        c_message = e.getMessage();
        c_timestamp = new Date();
    }

    /**
     *
     * @param e
     */
    public WepsMessage(Exception e) {
        this(WepsMessage.MessageSeverity.ERROR, e);
    }

    /**
     *
     * @return
     */
    @Override
    public String getMessage() {
        return c_message;
    }

    /**
     *
     * @return
     */
    public MessageSeverity getSeverity() {
        return c_severity;
    }

    /**
     *
     * @return
     */
    @Override
    public String toString() {
        return c_severity.toString() + ": " + c_message;
    }

    /**
     *
     * @param message
     * @return
     */
    public static WepsMessage informationMessage(String message) {
        return new WepsMessage(MessageSeverity.INFORMATION, message);
    }

    /**
     *
     * @param message
     * @return
     */
    public static WepsMessage warningMessage(String message) {
        return new WepsMessage(MessageSeverity.WARNING, message);
    }

    /**
     *
     * @param message
     * @return
     */
    public static WepsMessage errorMessage(String message) {
        return new WepsMessage(MessageSeverity.ERROR, message);
    }

}
