package org.rudirect.android.data.model;
import android.location.Location;
import com.j256.ormlite.field.DataType;
import com.j256.ormlite.field.DatabaseField;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;
public class BusData {
@DatabaseField(id = true)
private final int ID = 9000;
@DatabaseField(dataType = DataType.SERIALIZABLE)
private HashMap<String, BusRoute> busTagsToBusRoutes;
@DatabaseField(dataType = DataType.LONG)
private long dateInMillis;
private static ArrayList<BusRoute> activeRoutes; // Active bus routes
public BusData() {
// Needed for ormlite
}
public int getID() {
return ID;
}
public long getDateInMillis() {
return dateInMillis;
}
public void setDateInMillis(long dateInMillis) {
this.dateInMillis = dateInMillis;
}
public HashMap<String, BusRoute> getBusTagsToBusRoutes() {
return busTagsToBusRoutes;
}
public void setBusTagsToBusRoutes(HashMap<String, BusRoute> busTagsToBusRoutes) {
this.busTagsToBusRoutes = busTagsToBusRoutes;
}
public static ArrayList<BusRoute> getActiveRoutes() {
return activeRoutes;
}
public static void setActiveRoutes(ArrayList<BusRoute> activeRoutes) {
BusData.activeRoutes = activeRoutes;
}
// Returns a list of all bus stops in sorted order
public BusStop[] getAllBusStops() {
// Create list of bus stops
TreeSet<BusStop> busStops = new TreeSet<>();
ArrayList<BusRoute> busRoutes = getBusRoutes();
if (busRoutes != null) {
for (BusRoute route : busRoutes) {
busStops.addAll(Arrays.asList(route.getBusStops()));
}
return busStops.toArray(new BusStop[busStops.size()]);
} else {
return null;
}
}
// Returns a list of the bus routes in sorted order
public ArrayList<BusRoute> getBusRoutes() {
if (busTagsToBusRoutes != null) {
Collection<BusRoute> routeCollection = busTagsToBusRoutes.values();
ArrayList<BusRoute> busRoutes = new ArrayList<>(routeCollection);
Collections.sort(busRoutes);
return busRoutes;
}
return null;
}
// Returns the bus stop nearest to the argument location
public BusStop getNearestStop(Location location) {
BusStop[] busStops = getAllBusStops();
BusStop closestStop = null;
double minDistSq = Double.MAX_VALUE;
if (busStops != null) {
for (BusStop stop : busStops) {
double lat = stop.getLatitude() - location.getLatitude();
double lon = stop.getLongitude() - location.getLongitude();
double distSq = lat * lat + lon * lon;
if (distSq < minDistSq) {
minDistSq = distSq;
closestStop = stop;
}
}
}
return closestStop;
}
}