/*
* Copyright (c) 2016 Washington State Department of Transportation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
package gov.wa.wsdot.mobile.client.activities.ferries.schedules.sailings;
import com.google.code.gwt.database.client.GenericRow;
import com.google.code.gwt.database.client.service.DataServiceException;
import com.google.code.gwt.database.client.service.ListCallback;
import com.google.code.gwt.database.client.service.VoidCallback;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.place.shared.Place;
import com.google.gwt.user.client.ui.AcceptsOneWidget;
import com.google.web.bindery.event.shared.EventBus;
import com.googlecode.mgwt.mvp.client.MGWTAbstractActivity;
import gov.wa.wsdot.mobile.client.ClientFactory;
import gov.wa.wsdot.mobile.client.activities.ferries.schedules.departures.FerriesRouteDeparturesPlace;
import gov.wa.wsdot.mobile.client.event.ActionEvent;
import gov.wa.wsdot.mobile.client.event.ActionNames;
import gov.wa.wsdot.mobile.client.plugins.accessibility.Accessibility;
import gov.wa.wsdot.mobile.client.plugins.analytics.Analytics;
import gov.wa.wsdot.mobile.client.service.WSDOTContract.FerriesSchedulesColumns;
import gov.wa.wsdot.mobile.client.service.WSDOTDataService;
import gov.wa.wsdot.mobile.client.util.Consts;
import gov.wa.wsdot.mobile.shared.FerriesRouteAlertItem;
import gov.wa.wsdot.mobile.shared.FerriesRouteItem;
import gov.wa.wsdot.mobile.shared.FerriesScheduleDateItem;
import gov.wa.wsdot.mobile.shared.FerriesTerminalItem;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class FerriesRouteSailingsActivity extends MGWTAbstractActivity implements
FerriesRouteSailingsView.Presenter {
private final ClientFactory clientFactory;
private FerriesRouteSailingsView view;
private EventBus eventBus;
private Analytics analytics;
private Accessibility accessibility;
private WSDOTDataService dbService;
private static List<FerriesScheduleDateItem> scheduleDateItems = new ArrayList<FerriesScheduleDateItem>();
private static List<FerriesRouteItem> ferriesRouteItems = new ArrayList<FerriesRouteItem>();
private static List<FerriesRouteAlertItem> routeAlertItems = new ArrayList<FerriesRouteAlertItem>();
private static DateTimeFormat dateFormat = DateTimeFormat.getFormat("MMMM d, yyyy h:mm a");
private boolean isStarred = false;
private static int lastTab = 0;
public FerriesRouteSailingsActivity(ClientFactory clientFactory) {
this.clientFactory = clientFactory;
}
@Override
public void start(AcceptsOneWidget panel, final EventBus eventBus) {
view = clientFactory.getFerriesRouteSailingsView();
accessibility = clientFactory.getAccessibility();
dbService = clientFactory.getDbService();
analytics = clientFactory.getAnalytics();
this.eventBus = eventBus;
view.setPresenter(this);
if (Consts.ANALYTICS_ENABLED) {
analytics.trackScreen("/Ferries/Schedules/Sailings");
}
Place place = clientFactory.getPlaceController().getWhere();
if (place instanceof FerriesRouteSailingsPlace) {
FerriesRouteSailingsPlace ferriesRouteSchedulesDaySailingsPlace = (FerriesRouteSailingsPlace) place;
String routeId = ferriesRouteSchedulesDaySailingsPlace.getId();
createTopicsList(routeId);
accessibility.postScreenChangeNotification();
panel.setWidget(view);
}
}
private void createTopicsList(final String routeId) {
dbService.getFerriesSchedulesRoute(routeId, new ListCallback<GenericRow>() {
@Override
public void onFailure(DataServiceException error) {
}
@Override
public void onSuccess(List<GenericRow> result) {
ferriesRouteItems.clear();
scheduleDateItems.clear();
routeAlertItems.clear();
FerriesScheduleDateItem scheduleDate;
FerriesTerminalItem terminal;
FerriesRouteAlertItem routeAlert;
view.showProgressIndicator();
isStarred = result.get(0).getInt(FerriesSchedulesColumns.FERRIES_SCHEDULE_IS_STARRED) != 0;
ferriesRouteItems.add(new FerriesRouteItem(
Integer.parseInt(routeId),
result.get(0)
.getInt(FerriesSchedulesColumns.FERRIES_SCHEDULE_IS_STARRED)));
JSONValue scheduleDateValue = JSONParser.parseStrict(result.get(0).getString(FerriesSchedulesColumns.FERRIES_SCHEDULE_DATE));
JSONArray dates = scheduleDateValue.isArray();
JSONValue routeAlertValue = JSONParser.parseStrict(result.get(0).getString(FerriesSchedulesColumns.FERRIES_SCHEDULE_ALERT));
JSONArray alerts = routeAlertValue.isArray();
int numDates = dates.size();
for (int i = 0; i < numDates; i++) {
scheduleDate = new FerriesScheduleDateItem();
JSONObject date = dates.get(i).isObject();
scheduleDate.setDate(date.get("Date").toString().substring(6, 19));
JSONArray sailings = date.get("Sailings").isArray();
int numSailings = sailings.size();
for (int j=0; j < numSailings; j++) {
terminal = new FerriesTerminalItem();
JSONObject sailing = sailings.get(j).isObject();
terminal.setArrivingTerminalID(Integer.parseInt(sailing.get("ArrivingTerminalID").toString()));
terminal.setArrivingTerminalName(sailing.get("ArrivingTerminalName").isString().stringValue());
terminal.setDepartingTerminalID(Integer.parseInt(sailing.get("DepartingTerminalID").toString()));
terminal.setDepartingTerminalName(sailing.get("DepartingTerminalName").isString().stringValue());
scheduleDate.setFerriesTerminalItem(terminal);
}
scheduleDateItems.add(scheduleDate);
}
int numAlerts = alerts.size();
for (int i = 0; i < numAlerts; i++) {
routeAlert = new FerriesRouteAlertItem();
JSONObject alert = alerts.get(i).isObject();
routeAlert.setBulletinID(Integer.parseInt(alert.get("BulletinID").toString()));
routeAlert.setPublishDate(dateFormat
.format(new Date(Long.parseLong(alert
.get("PublishDate").isString().stringValue()
.substring(6, 19)))));
routeAlert.setAlertDescription(alert.get("AlertDescription").isString().stringValue());
routeAlert.setAlertFullTitle(alert.get("AlertFullTitle").isString().stringValue());
if (alert.get("AlertFullText").toString() != "null") {
routeAlert.setAlertFullText(alert.get("AlertFullText").isString().stringValue());
} else {
routeAlert.setAlertFullText("");
}
routeAlertItems.add(routeAlert);
}
if(routeAlertItems.isEmpty()){
view.showEmptyAlertsMessage();
}else{
view.hideEmptyAlertsMessage();
}
view.hideProgressIndicator();
view.toggleStarButton(isStarred);
view.render(scheduleDateItems.get(0).getFerriesTerminalItem());
view.renderRouteAlerts(routeAlertItems);
view.refresh();
accessibility.postScreenChangeNotification();
}
});
}
@Override
public void onStop() {
view.setPresenter(null);
}
@Override
public void onSailingItemSelected(int index) {
clientFactory.getPlaceController()
.goTo(new FerriesRouteDeparturesPlace(
Integer.toString(ferriesRouteItems.get(0).getRouteID()),
index,
scheduleDateItems.get(0).getFerriesTerminalItem()
.get(index).getDepartingTerminalID()));
}
@Override
public void onRouteAlertSelected(int index) {
FerriesRouteAlertItem item = routeAlertItems.get(index);
clientFactory.getPlaceController().goTo(
new FerriesRouteAlertDetailsPlace(item));
}
@Override
public void onBackButtonPressed() {
ActionEvent.fire(eventBus, ActionNames.BACK);
}
@Override
public void onStarButtonPressed() {
if (isStarred) {
ferriesRouteItems.get(0).setIsStarred(0);
isStarred = false;
} else {
ferriesRouteItems.get(0).setIsStarred(1);
isStarred = true;
}
dbService.updateStarredFerriesSchedules(ferriesRouteItems, new VoidCallback() {
@Override
public void onFailure(DataServiceException error) {
}
@Override
public void onSuccess() {
view.toggleStarButton(isStarred);
}
});
}
@Override
public void onTabSelected(int index) {
int currentTab = index;
switch(currentTab){
case 0:
if (currentTab != lastTab){
if (Consts.ANALYTICS_ENABLED) {
analytics.trackScreen("/Ferries/Schedules/Sailings");
}
}
break;
case 1:
if (currentTab != lastTab){
if (Consts.ANALYTICS_ENABLED) {
analytics.trackScreen("/Ferries/Schedules/Alerts");
}
}
break;
default:
}
lastTab = currentTab;
}
}