package caltool.model.view;

import caltool.model.caldb.*;
import caltool.model.schedule.*;
import mvp.*;
import java.util.*;

/****
 *
 * Class Lists is the model class that encapsulates the View->Lists commands.
 * These are commands to list appointments, meetings, tasks, events, and all
 * items.  Lists also has a reference to the CustomLists class, which has
 * methods and data to support editing custom lists of items.
 *                                                                          <p>
 * There are couple design alternatives for this class.  In Alternative 1, the
 * way the class is currently designed, this Lists class supplies
 * array-returning methods that trace to the operations in the abstract spec.
 * These methods have been refined to return array values intstead of whole
 * model objects.  This refinement supports the companion view classes that are
 * implemented as JTables, the rows of which are easily populated with
 * array-valued data.
 *                                                                          <p>
 * Alternative 2, not currently implemented, would be patterned after the
 * current MontlyAgenda/MonthlyAgendaDisplay design.  In this version of the
 * design,, the Lists class would have data fields that point to instances of
 * AppointmentLists, etc, and each such list class would provide iterator
 * methods, a la MontlyAgenda.  In this case, the traceable
 * viewAppointmentsList method returns a (persistent) AppointmentList object
 * that serves as the appointment list factory, a la MonthlyAgenda.
 *                                                                          <p>
 * Alternative 1 is more directly traceable to the spec, and more functional in
 * style, since the return values of the methods are not persistent objects.
 * Alternative 2 can be considered more object-oriented in style, with its
 * persistent object instances and iterator methods.  I see no real qualitative
 * difference between the two designs, only a stylistic difference.
 *
 * @author Gene Fisher (gfisher@calpoly.edu)
 * @version 13apr15
 *
 */
public class Lists extends mvp.Model {

    public Lists(CalendarDB caldb) {
    }


    /**
     * List all appointments between the current list-start and list-end option
     * settings.  The default start/end setting is the three-week period
     * starting one week prior to today's date through two weeks after today's
     * date.  The list of values is returned in an array of <a href=
     * AppointmentListItem.html> AppointmentListItems </a>.
     *
     * The current implementation is a stub that returns a sample list with
     * values taken from <a href=
     * ../../../../requirements/list-viewing.html#Figure Basic Appointments List>
     * Figure 32 </a> of the requirements.
     */
    public Object[] viewAppointmentsList() {
        return generateSampleList();    
    }

    /**
     * Generate a sample appointments list for initial view testing.  The list
     * is based on
     * ../../requirements/list-viewing.html#Figure Basic Appointments List> 
     * Figure 32 </a> of the requirements, with additional data added to
     * reflect that which is not visible in the default 20-line view.  The data
     * were generated with the assistance of Emacs editing macros.
     */
    protected Object[] generateSampleList() {

        Vector<AppointmentListItem> list = new Vector();

        list.add(
            new AppointmentListItem(
                "Racket Ball",
                new caltool.model.schedule.Date("sep 17, 2015"),
                new Time("8 AM"),
                new Duration(1, 0),
                true, 
                new Category("personal"),
                "Rec centre",
                Security.PublicTitle,
                Priority.Optional)
        );

        list.add(
            new AppointmentListItem(
                "Office Hours",
                new caltool.model.schedule.Date("sep 21, 2015"),
                new Time("9 AM"),
                new Duration(1, 0),
                true, 
                new Category("classes"),
                "14-210",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Data Structures Lecture",
                new caltool.model.schedule.Date("sep 21, 2015"),
                new Time("10 AM"),
                new Duration(1, 0),
                true, 
                new Category("classes"),
                "14-256",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Data Structures Lab",
                new caltool.model.schedule.Date("sep 21, 2015"),
                new Time("11 AM"),
                new Duration(1, 0),
                true, 
                new Category("classes"),
                "14-232",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Software Engineering Graduate Seminar",
                new caltool.model.schedule.Date("sep 21, 2015"),
                new Time("3 PM"),
                new Duration(2, 0),
                true, 
                new Category("classes"),
                "14-301",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Racket Ball",
                new caltool.model.schedule.Date("sep 22, 2015"),
                new Time("8 AM"),
                new Duration(1, 0),
                true, 
                new Category("personal"),
                "Rec centre",
                Security.PublicTitle,
                Priority.Optional)
        );

        list.add(
            new AppointmentListItem(
                "Research",
                new caltool.model.schedule.Date("sep 22, 2015"),
                new Time("9 AM"),
                new Duration(8, 0),
                true, 
                new Category("research"),
                "14-210",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Office Hours",
                new caltool.model.schedule.Date("sep 23, 2015"),
                new Time("9 AM"),
                new Duration(1, 0),
                true, 
                new Category("classes"),
                "14-210",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Data Structures Lecture",
                new caltool.model.schedule.Date("sep 23, 2015"),
                new Time("10 AM"),
                new Duration(1, 0),
                true, 
                new Category("classes"),
                "14-256",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Data Structures Lab",
                new caltool.model.schedule.Date("sep 23, 2015"),
                new Time("11 AM"),
                new Duration(1, 0),
                true, 
                new Category("classes"),
                "14-232",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Lunch with Microsoft",
                new caltool.model.schedule.Date("sep 23, 2015"),
                new Time("12 PM"),
                new Duration(1, 30),
                false, 
                new Category("department"),
                "Staff dining",
                Security.Public,
                Priority.Optional)
        );

        list.add(
            new AppointmentListItem(
                "Racket Ball",
                new caltool.model.schedule.Date("sep 24, 2015"),
                new Time("8 AM"),
                new Duration(1, 0),
                true, 
                new Category("personal"),
                "Rec centre",
                Security.PublicTitle,
                Priority.Optional)
        );

        list.add(
            new AppointmentListItem(
                "Office Hours",
                new caltool.model.schedule.Date("sep 24, 2015"),
                new Time("1:15 PM"),
                new Duration(1, 45),
                true, 
                new Category("classes"),
                "14-210",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Software Engineering Graduate Seminar",
                new caltool.model.schedule.Date("sep 24, 2015"),
                new Time("3 PM"),
                new Duration(2, 0),
                true, 
                new Category("classes"),
                "14-301",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Dentist",
                new caltool.model.schedule.Date("sep 25, 2015"),
                new Time("8 AM"),
                new Duration(1, 30),
                false, 
                new Category("personal"),
                "1342 Sycamore Dr",
                Security.PublicTitle,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Office Hours",
                new caltool.model.schedule.Date("sep 25, 2015"),
                new Time("9 AM"),
                new Duration(1, 0),
                true, 
                new Category("classes"),
                "14-210",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Data Structures Lecture",
                new caltool.model.schedule.Date("sep 25, 2015"),
                new Time("10 AM"),
                new Duration(1, 0),
                true, 
                new Category("classes"),
                "14-256",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Data Structures Lab",
                new caltool.model.schedule.Date("sep 25, 2015"),
                new Time("11 AM"),
                new Duration(1, 0),
                true, 
                new Category("classes"),
                "14-232",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Office Hours",
                new caltool.model.schedule.Date("sep 28, 2015"),
                new Time("9 AM"),
                new Duration(1, 0),
                true, 
                new Category("classes"),
                "14-210",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Data Structures Lecture",
                new caltool.model.schedule.Date("sep 28, 2015"),
                new Time("10 AM"),
                new Duration(1, 0),
                true, 
                new Category("classes"),
                "14-256",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Data Structures Lab",
                new caltool.model.schedule.Date("sep 28, 2015"),
                new Time("11 AM"),
                new Duration(1, 0),
                true, 
                new Category("classes"),
                "14-232",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Software Engineering Graduate Seminar",
                new caltool.model.schedule.Date("sep 28, 2015"),
                new Time("3 PM"),
                new Duration(2, 0),
                true, 
                new Category("classes"),
                "14-301",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Racket Ball",
                new caltool.model.schedule.Date("sep 29, 2015"),
                new Time("8 AM"),
                new Duration(1, 0),
                true, 
                new Category("personal"),
                "Rec centre",
                Security.PublicTitle,
                Priority.Optional)
        );

        list.add(
            new AppointmentListItem(
                "Research",
                new caltool.model.schedule.Date("sep 29, 2015"),
                new Time("9 AM"),
                new Duration(8, 0),
                true, 
                new Category("research"),
                "14-210",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Office Hours",
                new caltool.model.schedule.Date("sep 30, 2015"),
                new Time("9 A"),
                new Duration(1, 0),
                true, 
                new Category("classes"),
                "14-210",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Data Structures Lecture",
                new caltool.model.schedule.Date("sep 30, 2015"),
                new Time("10 AM"),
                new Duration(1, 0),
                true, 
                new Category("classes"),
                "14-256",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Data Structures Lab",
                new caltool.model.schedule.Date("sep 30, 2015"),
                new Time("11 AM"),
                new Duration(1, 0),
                true, 
                new Category("classes"),
                "14-232",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "CAD Research Project Meeting",
                new caltool.model.schedule.Date("sep 30, 2015"),
                new Time("2:30 PM"),
                new Duration(2, 0),
                true, 
                new Category("research"),
                "14-301",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Racket Ball",
                new caltool.model.schedule.Date("oct 1, 2015"),
                new Time("8 AM"),
                new Duration(1, 0),
                true, 
                new Category("personal"),
                "Rec centre",
                Security.PublicTitle,
                Priority.Optional)
        );

        list.add(
            new AppointmentListItem(
                "Office Hours",
                new caltool.model.schedule.Date("oct 1, 2015"),
                new Time("1:15 PM"),
                new Duration(1, 45),
                true, 
                new Category("classes"),
                "14-210",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Software Engineering Graduate Seminar",
                new caltool.model.schedule.Date("oct 1, 2015"),
                new Time("3 PM"),
                new Duration(2, 0),
                true, 
                new Category("classes"),
                "14-301",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Office Hours",
                new caltool.model.schedule.Date("oct 2, 2015"),
                new Time("9 AM"),
                new Duration(1, 0),
                true, 
                new Category("classes"),
                "14-210",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Data Structures Lecture",
                new caltool.model.schedule.Date("oct 2, 2015"),
                new Time("10 AM"),
                new Duration(1, 0),
                true, 
                new Category("classes"),
                "14-256",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Data Structures Lab",
                new caltool.model.schedule.Date("oct 2, 2015"),
                new Time("11 AM"),
                new Duration(1, 0),
                true, 
                new Category("classes"),
                "14-232",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Office Hours",
                new caltool.model.schedule.Date("oct 5, 2015"),
                new Time("9 AM"),
                new Duration(1, 0),
                true, 
                new Category("classes"),
                "14-210",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Data Structures Lecture",
                new caltool.model.schedule.Date("oct 5, 2015"),
                new Time("10 AM"),
                new Duration(1, 0),
                true, 
                new Category("classes"),
                "14-256",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Data Structures Lab",
                new caltool.model.schedule.Date("oct 5, 2015"),
                new Time("11 AM"),
                new Duration(1, 0),
                true, 
                new Category("classes"),
                "14-232",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Software Engineering Graduate Seminar",
                new caltool.model.schedule.Date("oct 5, 2015"),
                new Time("3 PM"),
                new Duration(2, 0),
                true, 
                new Category("classes"),
                "14-301",
                Security.Public,
                Priority.Must)
        );

        list.add(
            new AppointmentListItem(
                "Racket Ball",
                new caltool.model.schedule.Date("oct 6, 2015"),
                new Time("8 AM"),
                new Duration(1, 0),
                true, 
                new Category("personal"),
                "Rec centre",
                Security.PublicTitle,
                Priority.Optional)
        );

        list.add(
            new AppointmentListItem(
                "Research",
                new caltool.model.schedule.Date("oct 6, 2015"),
                new Time("9 AM"),
                new Duration(8, 0),
                true, 
                new Category("research"),
                "14-210",
                Security.Public,
                Priority.Must)
        );

        return list.toArray();

    }

}