package schedule;

import java.util.Collection;
import database.Schedule;
import schedule.InstructorPreference;
import schedule.ScheduleConstraint;
import schedule.ScheduleCourse;

/**
 * The Scheduler class constains all data and methods that have to deal with
 * the scheduler.
 */
public abstract class Scheduler {
  /** 
   * The schedule.
   */
  public Schedule schedule;

  /** 
   * A list of instructor preferences.
   */
  public Collection<InstructorPreference> instructorPreferences;
  
  /** 
   * A list of schedule constraints. 
   */
  public Collection<ScheduleConstraint> scheduleConstraints;
  
  /** 
   * The schedule's generated courses given constraints and preferences. 
   */ 
  public Collection<ScheduleCourse> scheduleCourses;

  /**
   * Adds a constraint to this schedule.
   * @param constraint The constraint to be added.
   */
  /*@ 
    requires
      constraint != null;
    ensures
      scheduleConstraints.contains(constraint);
  @*/
  public abstract void addScheduleConstraint(ScheduleConstraint constraint);

  /**
   * Adds an instructor preference to this schedule.
   * @param preference The preference to be added.
   */ 
  /*@ 
    requires
      preference != null;
    ensures
      instructorPreferences.contains(preference);
  @*/
  public abstract void addInstructorPreference(InstructorPreference preference);

  /**
   * Adds a course to this schedule.
   * @param course The course to be added.
   */
  /*@ 
    requires
      course != null;
    ensures
      scheduleCourses.contains(course);
  @*/
  public abstract void addScheduleCourse(ScheduleCourse course);

  /**
   * Removes a constraint from this schedule.
   * @param constraint The constraint to be removed.
   */
  /*@ 
    requires
      constraint != null;
    ensures
      !scheduleConstraints.contains(constraint);
  @*/
  public abstract void removeScheduleConstraint(ScheduleConstraint constraint);

  /**
   * Removes an instructor preference from this schedule.
   * @param preference The preference to be removed.
   */ 
  /*@ 
    requires
      preference != null;
    ensures
      !instructorPreferences.contains(preference); 
  @*/
  public abstract void removeInstructorPreference(InstructorPreference preference);

  /**
   * Removes a course from this schedule.
   * @param course The course to be removed.
   */
  /*@ 
    requires
      course != null;
    ensures
      !scheduleCourses.contains(course);
  @*/
  public abstract void removeScheduleCourse(ScheduleCourse course);

  /**
   * Publishes or unpublishes this schedule.
   * @param newStatus True if publish, False if unpublished.
   */
  /*@ 
    requires
      newStatus != schedule.published;
    ensures
      newStatus == schedule.published;
  @*/
  public abstract void publish(boolean newStatus);

  /**
   * Generates schedule.
   */
  /*@ 
    ensures
      schedule.generated == true;
  @*/
  public abstract void generateSchedule();

}