package com.njtransit.domain;
import java.util.Calendar;
public class Service implements IService, Comparable<Service> {
private int id;
private int flag;
public Service(int id, boolean... startWithMonday) {
this.id = id;
// SUNDAY IS 1 aka 0
addFlag(startWithMonday[6],0);
addFlag(startWithMonday[0],1);
addFlag(startWithMonday[1],2);
addFlag(startWithMonday[2],3);
addFlag(startWithMonday[3],4);
addFlag(startWithMonday[4],5);
addFlag(startWithMonday[5],6);
}
private void addFlag(boolean add, int pos) {
if(add) {
flag = (flag | (int) Math.pow(2, pos));
} else {
flag = (flag & ~(int)Math.pow(2, pos));
}
}
private boolean hasFlag(int pos) {
int powered = (int)Math.pow(2,pos);
int poweredAndFlagged = powered & flag;
return poweredAndFlagged == powered;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Service other = (Service) obj;
if (id != other.id)
return false;
return true;
}
public int getId() {
return id;
}
public boolean isFriday() {
return hasFlag(5);
}
public boolean isMonday() {
return hasFlag(1);
}
public boolean isSaturday() {
return hasFlag(6);
}
public boolean isSunday() {
return hasFlag(0);
}
public boolean isThursday() {
return hasFlag(4);
}
public boolean isToday() {
int today = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
boolean flag = hasFlag(today-1);
return flag;
}
public boolean isTomorrow() {
int tomorrow = (Calendar.getInstance().get(Calendar.DAY_OF_WEEK)) + 1;
return hasFlag(tomorrow);
}
public boolean isTuesday() {
return hasFlag(2);
}
public boolean isWednesday() {
return hasFlag(3);
}
@Override
public int compareTo(Service another) {
return Integer.valueOf(id).compareTo(another.id);
}
@Override
public boolean isDate(Calendar cal) {
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
if(Calendar.MONDAY==dayOfWeek) {
return isMonday();
}
if(Calendar.TUESDAY==dayOfWeek) {
return isTuesday();
}
if(Calendar.WEDNESDAY==dayOfWeek) {
return isWednesday();
}
if(Calendar.THURSDAY==dayOfWeek) {
return isThursday();
}
if(Calendar.FRIDAY==dayOfWeek) {
return isFriday();
}
if(Calendar.SATURDAY==dayOfWeek) {
return isSaturday();
}
if(Calendar.SUNDAY==dayOfWeek) {
return isSunday();
}
return false;
}
}