package com.tevinjeffrey.rutgersct.rutgersapi.utils; import android.os.Parcel; import android.os.Parcelable; import java.util.ArrayList; import java.util.Calendar; import java.util.List; @SuppressWarnings({"MagicNumber", "ValueOfIncrementOrDecrementUsed"}) public class SemesterUtils { private final Calendar calendar; private final int UPPER_LIMIT; private int LOWER_LIMIT = 2011; public SemesterUtils(Calendar calendar) { this.calendar = calendar; UPPER_LIMIT = Integer.parseInt(resolveCurrentYear(calendar)) + 1; LOWER_LIMIT = UPPER_LIMIT - 4; } public String[] getListOfSeasons() { return new String[]{Season.WINTER.getName(), Season.SPRING.getName(), Season.SUMMER.getName(), Season.FALL.getName()}; } public List<String> getListOfYears() { return addYear(new ArrayList<String>(), UPPER_LIMIT); } private List<String> addYear(List<String> list, int limit) { int lowerLimit = LOWER_LIMIT; if (lowerLimit != limit) { list.add(String.valueOf(limit)); addYear(list, --limit); } return list; } private String resolveCurrentYear(Calendar c) { return String.valueOf(c.get(Calendar.YEAR)); } public Semester resolveCurrentSemester() { int month = calendar.get(Calendar.MONTH); int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); String currentYear = resolveCurrentYear(calendar); //Dec 15 <-> Jan 15 = Winter if ((month == 11 && dayOfMonth > 15) || //The first month of the year is 0 for some fucking reason. (month == 0 && dayOfMonth < 15)) { return new Semester(Season.WINTER, month != 0 ? nextYear(currentYear) : currentYear); } //Jan 15 <-> May 20 = Spring else if ((month >= 0 && dayOfMonth >= 15) || (month <= 4 && dayOfMonth < 20)) { return new Semester(Season.SPRING, currentYear); } //May 20 <-> August 20 = Summer else if ((month >= 4 && dayOfMonth >= 20) || (month <= 7 && dayOfMonth < 20)) { return new Semester(Season.SUMMER, currentYear); } //August 20 <-> December 15 = Fall else if ((month >= 7 && dayOfMonth >= 20) || (month <= 11 && dayOfMonth <= 15)) { return new Semester(Season.FALL, currentYear); } else { throw new IllegalStateException("could not resolveSemesterChoices" + " month: " + month + " day: " + dayOfMonth); } } private String nextYear(String year) { int i = Integer.valueOf(year); return String.valueOf(++i); } private Semester[] resolveSemesterChoices(Calendar c) { int month = c.get(Calendar.MONTH); int dayOfMonth = c.get(Calendar.DAY_OF_MONTH); String currentYear = resolveCurrentYear(c); //Oct 1 <-> Jan 15 if ((month >= 9 && dayOfMonth >= 1) || //The first day of the month is 0 for some fucking reason. (month == 0 && dayOfMonth < 15)) { return new Semester[]{new Semester(Season.WINTER, month != 0 ? nextYear(currentYear) : currentYear) , new Semester(Season.SPRING, month != 0 ? nextYear(currentYear) : currentYear)}; } //Jan 15 <-> March 15 else if ((month == 0 && dayOfMonth >= 15) || (month <= 2 && dayOfMonth < 15)) { return new Semester[]{new Semester(Season.SPRING, currentYear) , new Semester(Season.SUMMER, currentYear)}; } //March 15 <-> September 1 else if ((month >= 2 && dayOfMonth >= 15) || (month <= 9 && dayOfMonth <= 31)) { return new Semester[]{new Semester(Season.SUMMER, currentYear) , new Semester(Season.FALL, currentYear)}; } else { throw new IllegalStateException("could not resolveSemesterChoices" + " month: " + month + " day: " + dayOfMonth); } } public Semester resolveSecondarySemester() { return resolveSemesterChoices(calendar)[1]; } public String getSecondarySemester() { return resolveSecondarySemester().toString(); } public Semester resolvePrimarySemester() { return resolveSemesterChoices(calendar)[0]; } public String getPrimarySemester() { return resolvePrimarySemester().toString(); } @Override public String toString() { return "SemesterUtils{" + "UPPER_LIMIT=" + UPPER_LIMIT + ", LOWER_LIMIT=" + LOWER_LIMIT + ", calendar=" + calendar + '}'; } public enum Season { WINTER(0, "Winter"), SPRING(1, "Spring"), SUMMER(7, "Summer"), FALL(9, "Fall"); private final int code; private final String name; Season(int code, String simpleName) { this.code = code; this.name = simpleName; } int getCode() { return this.code; } int getMappedValue() { if (this == WINTER) { return 0; } else if (this == SPRING) { return 1; } else if (this == SUMMER) { return 2; } else if (this == FALL) { return 3; } else { return -1; } } public String getName() { return this.name; } @Override public String toString() { return "Season{" + "code=" + code + ", name='" + name + '\'' + '}'; } } public static class Semester implements Parcelable { Season mSeason; final String mYear; public Semester(Season season, String year) { this.mSeason = season; this.mYear = year; } public Semester(String season, String year) { this.mYear = year; switch (season) { case "Winter": this.mSeason = Season.WINTER; break; case "Spring": this.mSeason = Season.SPRING; break; case "Summer": this.mSeason = Season.SUMMER; break; case "Fall": this.mSeason = Season.FALL; break; default: throw new IllegalArgumentException("error while getting Season enum"); } } public Semester(String yearAndSeason) { this(yearAndSeason.split(" ")[0], yearAndSeason.split(" ")[1]); } public Season getSeason() { return mSeason; } public String getYear() { return mYear; } @Override public String toString() { return mSeason.getName() + " " + mYear; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(this.mSeason == null ? -1 : this.mSeason.ordinal()); dest.writeString(this.mYear); } protected Semester(Parcel in) { int tmpMSeason = in.readInt(); this.mSeason = tmpMSeason == -1 ? null : Season.values()[tmpMSeason]; this.mYear = in.readString(); } public static final Parcelable.Creator<Semester> CREATOR = new Parcelable.Creator<Semester>() { public Semester createFromParcel(Parcel source) { return new Semester(source); } public Semester[] newArray(int size) { return new Semester[size]; } }; } }