package no.ntnu.fp.model;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import no.ntnu.fp.model.Meeting.State;
public class Calendar implements Iterable<CalendarEntry>, Serializable, PropertyChangeListener {
private static final long serialVersionUID = 3084624718665667718L;
public static final String ENTRIES_PROPERTY = "entries";
private PropertyChangeSupport pcs = new PropertyChangeSupport(this);
private List<CalendarEntry> entries = new ArrayList<CalendarEntry>();
private User user;
public Calendar(User user) {
this.user = user;
}
public void addMeeting(Meeting meeting){
entries.add(meeting);
meeting.addPropertyChangeListener(this);
pcs.fireIndexedPropertyChange(ENTRIES_PROPERTY, entries.size()-1, null, meeting);
}
/**
* Removes a CalenderEntry at the given index
* **/
public void removeEntry(int index){
entries.remove(index);
pcs.fireIndexedPropertyChange(ENTRIES_PROPERTY, index, index, null);
}
public boolean removeMeeting(Meeting meeting){
int index = entries.indexOf(meeting);
if(entries.remove(meeting)) {
pcs.fireIndexedPropertyChange(ENTRIES_PROPERTY, index, meeting, null);
return true;
} else {
return false;
}
}
public void addAppointment(Appointment appointment){
entries.add(appointment);
appointment.addPropertyChangeListener(this);
pcs.fireIndexedPropertyChange(ENTRIES_PROPERTY, entries.size()-1, null, appointment);
}
public boolean removeAppointment(Appointment appointment){
int index = entries.indexOf(appointment);
if (entries.remove(appointment)) {
pcs.fireIndexedPropertyChange(ENTRIES_PROPERTY, index, appointment, null);
return true;
} else {
return false;
}
}
public void addCalendarEntry(CalendarEntry entry) {
entries.add(entry);
entry.addPropertyChangeListener(this);
pcs.fireIndexedPropertyChange(ENTRIES_PROPERTY, entries.size()-1, null, entry);
}
public int getNumEntries() {
return entries.size();
}
public CalendarEntry get(int i) {
return entries.get(i);
}
public List<Notification> getMeetingNotifications() {
List<Notification> notifications = new ArrayList<Notification>();
for(CalendarEntry entry : entries) {
if (entry instanceof Meeting) {
Meeting meeting = (Meeting)entry;
if (meeting.getOwner().equals(user)) {
for (User user : meeting.getParticipants()) {
State state = meeting.getState(user);
if (state == State.Rejected) {
notifications.add(new MeetingReplyNotification(user, meeting));
}
}
} else {
State state = meeting.getState(user);
if (state == State.Pending) {
notifications.add(new MeetingInviteNotification(user, meeting));
}
}
}
}
return notifications;
}
@Override
public Iterator<CalendarEntry> iterator() {
return entries.iterator();
}
public String toString() {
StringBuilder builder = new StringBuilder();
for(CalendarEntry entry : entries) {
builder.append(entry.getDescription() + '\n');
}
return builder.toString();
}
public void addPropertyChangeListener(PropertyChangeListener l) {
pcs.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l) {
pcs.removePropertyChangeListener(l);
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
pcs.firePropertyChange(evt);
}
}