package com.pennapps.labs.pennmobile.classes;
import android.os.Parcel;
import android.os.Parcelable;
import com.google.gson.annotations.SerializedName;
import org.joda.time.Interval;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DiningHall implements Parcelable {
private int id;
private String name;
// Refers to whether the dining hall is residential or retail
private boolean residential;
private HashMap<String, Interval> openHours;
private Venue venue;
@SerializedName("tblDayPart") public List<Menu> menus = new ArrayList<>();
public DiningHall(int id, String name, boolean residential, HashMap<String, Interval> hours, Venue venue) {
this.id = id;
this.name = name;
this.residential = residential;
this.openHours = hours;
this.venue = venue;
}
protected DiningHall(Parcel in) {
boolean[] booleanArray = new boolean[1];
in.readBooleanArray(booleanArray);
residential = booleanArray[0];
openHours = new HashMap<>();
menus = new ArrayList<>();
in.readMap(openHours, Interval.class.getClassLoader());
in.readList(menus, ArrayList.class.getClassLoader());
id = in.readInt();
name = in.readString();
}
public static final Creator<DiningHall> CREATOR = new Creator<DiningHall>() {
@Override
public DiningHall createFromParcel(Parcel in) {
return new DiningHall(in);
}
@Override
public DiningHall[] newArray(int size) {
return new DiningHall[size];
}
};
public void sortMeals(List<Menu> menus) {
this.menus = menus;
String[] meals = {"Breakfast", "Brunch", "Lunch", "Dinner", "Express"};
final List<String> mealOrder = Arrays.asList(meals);
Collections.sort(this.menus, new Comparator<Menu>() {
@Override
public int compare(Menu lhs, Menu rhs) {
return mealOrder.indexOf(lhs.name) - mealOrder.indexOf(rhs.name);
}
});
}
public int describeContents(){
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeBooleanArray(new boolean[] {residential});
dest.writeMap(openHours);
dest.writeList(menus);
dest.writeInt(id);
dest.writeString(name);
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public boolean isResidential() {
return residential;
}
public boolean hasMenu() {
return menus.size() > 0;
}
public List<String> getExtras(){
return venue.getExtras();
}
public Venue getVenue(){
return venue;
}
public String closingTime() {
for (Interval openInterval : openHours.values()) {
if (openInterval.containsNow()) {
return openInterval.getEnd().toString("h:mma");
}
}
return "";
}
public List<Map.Entry<String, Interval>> orderedHours() {
List<Map.Entry<String, Interval>> list = new ArrayList<>(openHours.entrySet());
Collections.sort( list, new Comparator<Map.Entry<String, Interval>>() {
public int compare( Map.Entry<String, Interval> x, Map.Entry<String, Interval> y )
{
return x.getValue().getStart().compareTo(y.getValue().getStart());
}
});
return list;
}
public String openingTime() {
List<Map.Entry<String, Interval>> list = orderedHours();
for (int i = 0; i < list.size(); i++) {
Interval openInterval = list.get(i).getValue();
if (openInterval.isAfterNow()) {
return openInterval.getStart().toString("h:mma");
}
}
return "";
}
public boolean isOpen() {
for (Interval openInterval : openHours.values()) {
if (openInterval.containsNow()) {
return true;
}
}
return false;
}
public String openMeal() {
for (Map.Entry<String, Interval> entry : openHours.entrySet()) {
Interval openInterval = entry.getValue();
if (openInterval.containsNow()) {
return entry.getKey();
}
}
return null;
}
public String nextMeal() {
List<Map.Entry<String, Interval>> list = orderedHours();
for (int i = 0; i < list.size(); i++) {
Interval openInterval = list.get(i).getValue();
if (openInterval.isAfterNow()) {
return list.get(i).getKey();
}
}
return "";
}
/**
* Created by Adel on 12/18/14.
* Class for a single menu, ie. Lunch, Dinner
*/
public static class Menu implements Parcelable{
@SerializedName("txtDayPartDescription") public String name;
@SerializedName("tblStation") public List<DiningStation> stations = new ArrayList<>();
protected Menu(Parcel in) {
name = in.readString();
}
public static final Creator<Menu> CREATOR = new Creator<Menu>() {
@Override
public Menu createFromParcel(Parcel in) {
return new Menu(in);
}
@Override
public Menu[] newArray(int size) {
return new Menu[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
}
}
/**
* Created by Adel on 12/18/14.
* Class for a station at a dining hall
*/
public static class DiningStation {
@SerializedName("txtStationDescription") public String name;
@SerializedName("tblItem") public List<FoodItem> items = new ArrayList<>();
}
/**
* Created by Adel on 12/18/14.
* Class for Food items in Dining menus
*/
public static class FoodItem {
@SerializedName("txtTitle") public String title;
@SerializedName("txtDescription") String description;
}
}