package carpool.dbservice;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map.Entry;
import org.json.JSONObject;
import carpool.carpoolDAO.CarpoolDaoBasic;
import carpool.carpoolDAO.CarpoolDaoLocation;
import carpool.configurations.CarpoolConfig;
import carpool.exception.location.LocationException;
import carpool.exception.location.LocationNotFoundException;
import carpool.exception.validation.ValidationException;
import carpool.locationService.CarpoolLocationLoader;
import carpool.model.Location;
import carpool.model.representation.DefaultLocationRepresentation;
/**
* universal interface for location access, to replace the old LocationManager
*
*/
public class LocationDaoService {
public static int defalutLocationsNum=0;
public static void init() throws LocationException, ValidationException, LocationNotFoundException{
if (!CarpoolDaoLocation.isLocationPoolEmpty()){
return;
}
ArrayList<HashMap<String, String>> bufferList = CarpoolLocationLoader.loadLocationFromFile("LocationData.txt");
defalutLocationsNum = bufferList.size();
for (HashMap<String, String> bufferMap : bufferList){
Location location = new Location(bufferMap.get("province"),bufferMap.get("city"),bufferMap.get("region"),bufferMap.get("name"),bufferMap.get("address"),Double.parseDouble(bufferMap.get("lat")),Double.parseDouble(bufferMap.get("lng")),-1l);
DefaultLocationRepresentation defaultLocationRep = new DefaultLocationRepresentation(location, Integer.parseInt(bufferMap.get("radius")), bufferMap.get("synonyms"));
CarpoolDaoLocation.addDefaultLocation(defaultLocationRep);
}
}
public static ArrayList<DefaultLocationRepresentation> getDefaultLocations(){
ArrayList<DefaultLocationRepresentation> defaultLocationList = new ArrayList<DefaultLocationRepresentation>();
defaultLocationList = CarpoolDaoLocation.getDefaultLocationRepresentations();
return defaultLocationList;
}
public static Location addLocation(Location newLocation){
newLocation = CarpoolDaoLocation.addLocationToDatabases(newLocation);
return newLocation;
}
public static boolean isLocationValid(Location location){
return CarpoolDaoLocation.isLocationPoolEmpty();
}
/*
* 'M' is statute miles
* 'K' is kilometers (default)
* 'N' is nautical miles
*/
public static boolean withIntheDistance(Location l1, Location l2, String Unit, double distance){
double lat1 = l1.getLat();
double lat2 = l2.getLat();
double lon1 = l1.getLng();
double lon2 = l2.getLng();
double radlat1 = Math.PI * lat1/180;
double radlat2 = Math.PI * lat2/180;
double theta = lon1-lon2;
double radtheta = Math.PI * theta/180;
double calDist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
calDist = Math.acos(calDist);
calDist = calDist * 180/Math.PI;
calDist = calDist * 60 * 1.1515;
if (Unit=="K") { calDist = calDist * 1.609344; }
if (Unit=="N") { calDist = calDist * 0.8684; }
//System.out.println("The distance between two places is "+calDist+"Km");
return calDist<=distance;
}
}