-
Notifications
You must be signed in to change notification settings - Fork 129
Expand file tree
/
Copy pathTollCalculator.java
More file actions
111 lines (96 loc) · 3.72 KB
/
TollCalculator.java
File metadata and controls
111 lines (96 loc) · 3.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import java.util.*;
import java.util.concurrent.*;
public class TollCalculator {
/**
* Calculate the total toll fee for one day
*
* @param vehicle - the vehicle
* @param dates - date and time of all passes on one day
* @return - the total toll fee for that day
*/
public int getTollFee(Vehicle vehicle, Date... dates) {
Date intervalStart = dates[0];
int totalFee = 0;
for (Date date : dates) {
int nextFee = getTollFee(date, vehicle);
int tempFee = getTollFee(intervalStart, vehicle);
TimeUnit timeUnit = TimeUnit.MINUTES;
long diffInMillies = date.getTime() - intervalStart.getTime();
long minutes = timeUnit.convert(diffInMillies, TimeUnit.MILLISECONDS);
if (minutes <= 60) {
if (totalFee > 0) totalFee -= tempFee;
if (nextFee >= tempFee) tempFee = nextFee;
totalFee += tempFee;
} else {
totalFee += nextFee;
intervalStart = date;
}
}
if (totalFee > 60) totalFee = 60;
return totalFee;
}
private boolean isTollFreeVehicle(Vehicle vehicle) {
if(vehicle == null) return false;
String vehicleType = vehicle.getType();
return vehicleType.equals(TollFreeVehicles.MOTORBIKE.getType()) ||
vehicleType.equals(TollFreeVehicles.TRACTOR.getType()) ||
vehicleType.equals(TollFreeVehicles.EMERGENCY.getType()) ||
vehicleType.equals(TollFreeVehicles.DIPLOMAT.getType()) ||
vehicleType.equals(TollFreeVehicles.FOREIGN.getType()) ||
vehicleType.equals(TollFreeVehicles.MILITARY.getType());
}
public int getTollFee(final Date date, Vehicle vehicle) {
if(isTollFreeDate(date) || isTollFreeVehicle(vehicle)) return 0;
Calendar calendar = GregorianCalendar.getInstance();
calendar.setTime(date);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
if (hour == 6 && minute <= 29) return 8;
else if (hour == 6) return 13;
else if (hour == 7) return 18;
else if (hour == 8 && minute <= 29) return 13;
else if (hour >= 8 && hour <= 14) return 8;
else if (hour == 15 && minute <= 29) return 13;
else if (hour == 15 || hour == 16) return 18;
else if (hour == 17) return 13;
else if (hour == 18 && minute <= 29) return 8;
else return 0;
}
private Boolean isTollFreeDate(Date date) {
Calendar calendar = GregorianCalendar.getInstance();
calendar.setTime(date);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
if (dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY) return true;
if (year == 2013) {
if (month == Calendar.JANUARY && day == 1 ||
month == Calendar.MARCH && (day == 28 || day == 29) ||
month == Calendar.APRIL && (day == 1 || day == 30) ||
month == Calendar.MAY && (day == 1 || day == 8 || day == 9) ||
month == Calendar.JUNE && (day == 5 || day == 6 || day == 21) ||
month == Calendar.JULY ||
month == Calendar.NOVEMBER && day == 1 ||
month == Calendar.DECEMBER && (day == 24 || day == 25 || day == 26 || day == 31)) {
return true;
}
}
return false;
}
private enum TollFreeVehicles {
MOTORBIKE("Motorbike"),
TRACTOR("Tractor"),
EMERGENCY("Emergency"),
DIPLOMAT("Diplomat"),
FOREIGN("Foreign"),
MILITARY("Military");
private final String type;
TollFreeVehicles(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
}