package caltool.schedule;

import caltool.PrecondViolation;
import java.util.*;

/****
 *
 * Class ScheduleEventPrecondViolation defines and
 * exception containing error conditions for the
 * Schedule.scheduleEvent method.  It contains a list of
 * the specific error messages that may be output in
 * response to a precondition having been violated by a
 * call to scheduleEvent.
 *
 * @author Gene Fisher (gfisher@calpoly.edu)
 * @version 17feb12
 */
public class ScheduleEventPrecondViolation
    extends Exception
        implements PrecondViolation {

    /**
     * Construct this by initializing the error message
     * list to an empty list, initializing the numErrors
     * count to 0, and initializing local copies of the
     * error message text for each of the possible errors
     * from Schedule.scheduleEvent.
     */
    public ScheduleEventPrecondViolation() {

        errors = new ArrayList();

        emptyTitleMessage = new String(
           "Event title cannot be empty.");
        alreadyScheduledMessage = new String(
           "An event of the given start date and title is already scheduled.");
        invalidStartDateMessage = new String(
            "Invalid start date.");
        invalidEndDateMessage = new String(
            "Invalid end date.");
        noActiveCalendarMessage = new String(
            "There is no active calendar in the Calendar Tool workspace.");

        numErrors = 0;
    }

    /*-*
     * Implemented interface methods.
     */

    /**
     * Return the error list.
     */
    public String[] getErrors() {
        return (String[]) errors.toArray(new String[1]);
    }

    /**
     * Clear all error messages.
     */
    public void clear() {
        errors = new ArrayList();
        numErrors = 0;
    }

    /**
     * Return true if any errors have been set.
     */
    public boolean anyErrors() {
        return (numErrors > 0);
    }
    
    /**
     * Return the number of errors.
     */
    public int numberOfErrors() {
        return numErrors;
    }


    /*-*
     * Error-setting methods
     */

    /**
     * Set the empty title error message.
     */
    public void setEmptyTitleError() {
        errors.add(emptyTitleMessage);
        numErrors++;
    }

    /**
     * Set the already scheduled error message.
     */
    public void setAlreadyScheduledError() {
        errors.add(alreadyScheduledMessage);
        numErrors++;
    }

    /**
     * Set the invalid start date error message.
     */
    public void setInvalidStartDateError() {
        errors.add(invalidStartDateMessage);
        numErrors++;
    }

    /**
     * Set the invalid end date error message.
     */
    public void setInvalidEndDateError() {
        errors.add(invalidEndDateMessage);
        numErrors++;
    }

    /**
     * Set the no active calendar error message.
     */
    public void setNoActiveCalendarError() {
        errors.add(noActiveCalendarMessage);
        numErrors++;
    }


    /*-*
     * Data fields
     */

    /** List of current error messages */
    protected ArrayList errors;

    /** Error message count */
    protected int numErrors;


    /** Error message for empty title */
    protected String emptyTitleMessage;

    /** Error message for event of same date,title already
        scheduled */
    protected String alreadyScheduledMessage;

    /** Error message for invalid start date */
    protected String invalidStartDateMessage;

    /** Error message for invalid end date */
    protected String invalidEndDateMessage;

    /** Error message for no currently active calendar in
        the workspace */
    protected String noActiveCalendarMessage;

}