package hu.supercluster.overpasser.app.view;
import android.content.Context;
import android.content.res.Resources;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.View;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.model.Marker;
import org.androidannotations.annotations.EBean;
import org.androidannotations.annotations.RootContext;
import java.util.HashMap;
import java.util.Map;
import hu.supercluster.overpasser.R;
import hu.supercluster.overpasser.adapter.OverpassQueryResult;
import hu.supercluster.overpasser.adapter.OverpassQueryResult.Element;
import hugo.weaving.DebugLog;
@EBean(scope = EBean.Scope.Singleton)
public class PoiInfoWindowAdapter implements GoogleMap.InfoWindowAdapter {
private Map<String, OverpassQueryResult.Element> map;
@RootContext
Context context;
public PoiInfoWindowAdapter() {
map = new HashMap<>();
}
public void addMarkerInfo(Marker marker, OverpassQueryResult.Element poi) {
map.put(marker.getId(), poi);
}
@Override
public View getInfoWindow(Marker marker) {
return null;
}
@Override
@DebugLog
public View getInfoContents(Marker marker) {
Element poi = getElement(marker);
if (poi != null) {
return createView(poi);
} else {
return null;
}
}
private Element getElement(Marker marker) {
return map.get(marker.getId());
}
@NonNull
private View createView(Element poi) {
PoiInfoWindowView view = PoiInfoWindowView_.build(context);
view.setTitle(poi.tags.name);
view.setBody(getPoiDescription(poi));
return view;
}
String getPoiDescription(Element poi) {
StringBuilder builder = new StringBuilder();
Element.Tags info = poi.tags;
builder.append(getLine(getAddressLine1(info)));
builder.append(getLine(getAddressLine2(info)));
builder.append(getLine(info.phone));
builder.append(getLine(info.website));
builder.append("\n");
builder.append(getLine(info.wheelchairDescription));
builder.append(getLine(getFeeInfo(info)));
return builder.toString().trim();
}
private String getFeeInfo(Element.Tags info) {
return getBooleanInfo(info.fee, R.string.poi_info_payant);
}
@Nullable
private String getBooleanInfo(String info, int label) {
if (info != null) {
Resources resources = context.getResources();
int i = mapChoice(info);
return String.format("%s: %s",
resources.getString(label),
i > 0 ? resources.getString(i) : info
);
} else {
return null;
}
}
private String getAddressLine1(Element.Tags info) {
return info.addressCity;
}
private String getAddressLine2(Element.Tags info) {
StringBuilder builder = new StringBuilder();
if (info.addressStreet != null) {
builder.append(info.addressStreet);
builder.append(" ");
}
if (info.addressHouseNumber != null) {
builder.append(info.addressHouseNumber);
builder.append(".");
}
return builder.toString().trim();
}
String getLine(String text) {
return text == null ? "" : text + "\n";
}
private int mapChoice(String choice) {
switch (choice.toLowerCase()) {
case "yes":
case "designated":
return R.string.yes;
case "limited":
return R.string.limited;
case "no":
return R.string.no;
default:
return 0;
}
}
}