package org.azavea.otm.data;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.LatLngBounds;
import org.azavea.helpers.Logger;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
public class InstanceInfo extends Model {
// Commonly accessed fields are loaded into class
// fields to avoid having to deal with potential
// JSONEncoding exceptions through the app
private int instanceId;
private String geoRevId;
private String name;
private String urlName;
public class InstanceExtent {
public final double minLongitude;
public final double minLatitude;
public final double maxLongitude;
public final double maxLatitude;
public InstanceExtent(double minLng, double minLat, double maxLng, double maxLat) {
this.minLongitude = minLng;
this.minLatitude = minLat;
this.maxLongitude = maxLng;
this.maxLatitude = maxLat;
}
}
// Default constructor required for RestHandler instantiation
public InstanceInfo() {
}
public InstanceInfo(int instanceId, String geoRevId, String name) {
this.instanceId = instanceId;
this.geoRevId = geoRevId;
this.name = name;
}
@Override
public void setData(JSONObject data) {
try {
name = data.getString("name");
setGeoRevId(data.getString("geoRevHash"));
urlName = data.getString("url");
instanceId = data.getInt("id");
super.setData(data);
} catch (JSONException ex) {
Logger.error("Invalid Instance Info Received", ex);
}
}
public String getName() {
return name;
}
public String getGeoRevId() {
return geoRevId;
}
public void setGeoRevId(String geoRevId) {
this.geoRevId = geoRevId;
}
public int getInstanceId() {
return instanceId;
}
public String getUrlName() {
return urlName;
}
public String getShortDateFormat() {
return (String) getField("short_date_format");
}
public String getLongDateFormat() {
return (String) getField("date_format");
}
public JSONArray getDisplayFieldKeys() {
return (JSONArray) getField("field_key_groups");
}
public JSONObject getFieldDefinitions() {
return (JSONObject) getField("fields");
}
public JSONObject getSearchDefinitions() {
return (JSONObject) getField("search");
}
public double getRadius() throws JSONException { return data.getLong("extent_radius"); }
public boolean canAddTree() {
Boolean canAdd = (Boolean) getValueForKey("meta_perms.can_add_tree");
return canAdd == null ? false : canAdd;
}
public boolean canEditTree() {
Boolean canEdit = (Boolean) getValueForKey("meta_perms.can_edit_tree");
return canEdit == null ? false : canEdit;
}
public boolean canEditTreePhoto() {
Boolean canEdit = (Boolean) getValueForKey("meta_perms.can_edit_tree_photo");
return canEdit == null ? false : canEdit;
}
public JSONObject getPlotEcoFields() {
return getEcoFields("plot");
}
/**
* Get eco definitions for a particular model type.
*
* @param model ex: 'plot'
*/
public JSONObject getEcoFields(String model) {
JSONObject eco = this.data.optJSONObject("eco");
if (eco != null && eco.optBoolean("supportsEcoBenefits")) {
JSONArray benefits = eco.optJSONArray("benefits");
if (benefits != null) {
for (int i = 0; i < benefits.length(); i++) {
JSONObject ecoBen = benefits.optJSONObject(i);
if (ecoBen != null && ecoBen.optString("model", "").equalsIgnoreCase(model)) {
return ecoBen;
}
}
}
}
return null;
}
public double getLat() {
return getCenter("lat");
}
public double getLon() {
return getCenter("lng");
}
public LatLngBounds getExtent() {
try {
JSONObject json = data.getJSONObject("extent");
return new LatLngBounds.Builder()
.include(new LatLng(json.getDouble("min_lat"), json.getDouble("min_lng")))
.include(new LatLng(json.getDouble("max_lat"), json.getDouble("max_lng")))
.build();
} catch (JSONException e) {
Logger.error("Invalid Instance extent Received", e);
}
return null;
}
private double getCenter(String coordinatePart) {
try {
JSONObject center = (JSONObject) getField("center");
return center.getDouble(coordinatePart);
} catch (JSONException e) {
Logger.error("Can't get center-part for instance:" + coordinatePart, e);
return 0;
}
}
public LatLng getStartPos() {
return new LatLng(getLat(), getLon());
}
@Override
public String toString() {
return getName();
}
public static ArrayList<InstanceInfo> getInstanceInfosFromJSON(JSONArray instances) {
ArrayList<InstanceInfo> instanceInfos = new ArrayList<>();
if (instances != null) {
for (int i = 0; i < instances.length(); i++) {
InstanceInfo instanceInfo = new InstanceInfo();
try {
instanceInfo.setData(instances.getJSONObject(i));
instanceInfos.add(instanceInfo);
} catch (JSONException e) {
Logger.error("Could not load instance info", e);
}
}
}
return instanceInfos;
}
}