[LIB-8] Add Event Rounds and Seedings functional
[snooker-score-api.git] / src / main / java / org / hedgecode / snooker / json / JsonEvents.java
1 /*
2  * Copyright (c) 2017. Developed by Hedgecode.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.hedgecode.snooker.json;
18
19 import java.util.ArrayList;
20 import java.util.Calendar;
21 import java.util.Date;
22 import java.util.List;
23
24 import org.hedgecode.snooker.api.Event;
25 import org.hedgecode.snooker.api.Events;
26 import org.hedgecode.snooker.api.Season;
27 import org.hedgecode.snooker.compare.EventComparators;
28
29 /**
30  * Events Entity (set of {@link Event}) to JSON deserialize.
31  *
32  * @author Dmitry Samoshin aka gotty
33  */
34 public class JsonEvents extends JsonCollectionEntity<Event> implements Events {
35
36     private static final JsonEvents EMPTY = new JsonEvents(new Event[0]);
37
38     protected JsonEvents(Event[] entities) {
39         super(entities);
40     }
41
42     protected JsonEvents(List<Event> entities) {
43         super(entities);
44     }
45
46     @Override
47     public Events bySeason(Season season) {
48         List<Event> events = new ArrayList<>();
49         for (Event event : this)
50             if (event.season().equals(season))
51                 events.add(event);
52         return events.isEmpty() ? EMPTY : new JsonEvents(events);
53     }
54
55     @Override
56     public Events byType(String type) {
57         List<Event> events = new ArrayList<>();
58         for (Event event : this)
59             if (event.type().equals(type))
60                 events.add(event);
61         return events.isEmpty() ? EMPTY : new JsonEvents(events);
62     }
63
64     @Override
65     public Events byCity(String city) {
66         List<Event> events = new ArrayList<>();
67         for (Event event : this)
68             if (event.city().equals(city))
69                 events.add(event);
70         return events.isEmpty() ? EMPTY : new JsonEvents(events);
71     }
72
73     @Override
74     public Events byCountry(String country) {
75         List<Event> events = new ArrayList<>();
76         for (Event event : this)
77             if (event.country().equals(country))
78                 events.add(event);
79         return events.isEmpty() ? EMPTY : new JsonEvents(events);
80     }
81
82     @Override
83     public Events bySex(String sex) {
84         List<Event> events = new ArrayList<>();
85         for (Event event : this)
86             if (event.sex().equals(sex))
87                 events.add(event);
88         return events.isEmpty() ? EMPTY : new JsonEvents(events);
89     }
90
91     @Override
92     public Events byStage(String stage) {
93         List<Event> events = new ArrayList<>();
94         for (Event event : this)
95             if (event.stage().equals(stage))
96                 events.add(event);
97         return events.isEmpty() ? EMPTY : new JsonEvents(events);
98     }
99
100     @Override
101     public Events byValueType(String valueType) {
102         List<Event> events = new ArrayList<>();
103         for (Event event : this)
104             if (event.valueType().equals(valueType))
105                 events.add(event);
106         return events.isEmpty() ? EMPTY : new JsonEvents(events);
107     }
108
109     @Override
110     public Events bySnookerId(int worldSnookerId) {
111         List<Event> events = new ArrayList<>();
112         for (Event event : this)
113             if (event.worldSnookerId() == worldSnookerId)
114                 events.add(event);
115         return events.isEmpty() ? EMPTY : new JsonEvents(events);
116     }
117
118     @Override
119     public Events ended() {
120         List<Event> events = new ArrayList<>();
121         long currentTime = System.currentTimeMillis();
122         for (Event event : this)
123             if (currentTime > nextDate(event.endDate()).getTime())
124                 events.add(event);
125         return events.isEmpty() ? EMPTY : new JsonEvents(events);
126     }
127
128     @Override
129     public Events current() {
130         List<Event> events = new ArrayList<>();
131         long currentTime = System.currentTimeMillis();
132         for (Event event : this)
133             if (currentTime > event.startDate().getTime()
134                     && currentTime < nextDate(event.endDate()).getTime())
135                 events.add(event);
136         return events.isEmpty() ? EMPTY : new JsonEvents(events);
137     }
138
139     @Override
140     public Events upcoming() {
141         List<Event> events = new ArrayList<>();
142         long currentTime = System.currentTimeMillis();
143         for (Event event : this)
144             if (currentTime < event.startDate().getTime())
145                 events.add(event);
146         return events.isEmpty() ? EMPTY : new JsonEvents(events);
147     }
148
149     @Override
150     public void sortByDate() {
151         sort(
152                 EventComparators.DATE.comparator()
153         );
154     }
155
156     @Override
157     public void sortBySnookerId() {
158         sort(
159                 EventComparators.SNOOKER_ID.comparator()
160         );
161     }
162
163     private Date nextDate(Date date) {
164         Calendar c = Calendar.getInstance();
165         c.setTime(date);
166         c.add(Calendar.DATE, 1);
167         return c.getTime();
168     }
169
170 }