package cgeo.geocaching.connector.trackable;
import cgeo.geocaching.CgeoApplication;
import cgeo.geocaching.R;
import cgeo.geocaching.connector.UserAction;
import cgeo.geocaching.connector.gc.GCConnector;
import cgeo.geocaching.connector.gc.GCParser;
import cgeo.geocaching.enumerations.Loaders;
import cgeo.geocaching.log.AbstractLoggingActivity;
import cgeo.geocaching.models.Trackable;
import cgeo.geocaching.network.Network;
import cgeo.geocaching.network.Parameters;
import cgeo.geocaching.settings.Settings;
import org.apache.commons.lang3.StringUtils;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.util.List;
import java.util.regex.Pattern;
public class TravelBugConnector extends AbstractTrackableConnector {
/**
* TB codes really start with TB1, there is no padding or minimum length
*/
private static final Pattern PATTERN_TB_CODE = Pattern.compile("(TB[0-9A-Z&&[^ILOSU]]+)|([0-9A-Z]{6})|([0-9]{5})", Pattern.CASE_INSENSITIVE);
@Override
public int getPreferenceActivity() {
return R.string.preference_screen_gc;
}
@Override
public boolean canHandleTrackable(@Nullable final String geocode) {
return PATTERN_TB_CODE.matcher(geocode).matches();
}
@NonNull
@Override
public String getServiceTitle() {
return CgeoApplication.getInstance().getString(R.string.settings_title_gc);
}
@Override
@NonNull
public String getUrl(@NonNull final Trackable trackable) {
return getHostUrl() + "//track/details.aspx?tracker=" + trackable.getGeocode();
}
static String getTravelbugViewstates(final String guid) {
return Network.getResponseData(Network.getRequest("https://www.geocaching.com/track/log.aspx", new Parameters("wid", guid)));
}
@Override
public boolean isLoggable() {
return true;
}
@Override
public boolean isRegistered() {
return Settings.hasGCCredentials();
}
@Override
@Nullable
public Trackable searchTrackable(final String geocode, final String guid, final String id) {
return GCParser.searchTrackable(geocode, guid, id);
}
/**
* initialization on demand holder pattern
*/
private static class Holder {
private static final TravelBugConnector INSTANCE = new TravelBugConnector();
}
private TravelBugConnector() {
// singleton
}
public static TravelBugConnector getInstance() {
return Holder.INSTANCE;
}
@Override
@Nullable
public String getTrackableCodeFromUrl(@NonNull final String url) {
// coord.info URLs
final String code1 = StringUtils.substringAfterLast(url, "coord.info/");
if (canHandleTrackable(code1)) {
return code1;
}
final String code2 = StringUtils.substringAfterLast(url, "?tracker=");
if (canHandleTrackable(code2)) {
return code2;
}
return null;
}
@Override
@NonNull
public List<UserAction> getUserActions() {
// travel bugs should have the same actions as GC caches
return GCConnector.getInstance().getUserActions();
}
@Override
@NonNull
public TrackableBrand getBrand() {
return TrackableBrand.TRAVELBUG;
}
@Override
public int getTrackableLoggingManagerLoaderId() {
return Loaders.LOGGING_TRAVELBUG.getLoaderId();
}
@Override
public AbstractTrackableLoggingManager getTrackableLoggingManager(final AbstractLoggingActivity activity) {
return new TravelBugLoggingManager(activity);
}
@Override
@NonNull
public String getHost() {
return "www.geocaching.com";
}
@Override
@NonNull
public String getTestUrl() {
return "https://" + getHost() + "/play";
}
}