package cgeo.geocaching.enumerations;
import cgeo.geocaching.CgeoApplication;
import cgeo.geocaching.R;
import org.apache.commons.lang3.StringUtils;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
/**
* Enum listing cache sizes
*/
public enum CacheSize {
NANO("Nano", 0, R.string.cache_size_nano, "nano"), // used by OC only
MICRO("Micro", 1, R.string.cache_size_micro, "micro"),
SMALL("Small", 2, R.string.cache_size_small, "small"),
REGULAR("Regular", 3, R.string.cache_size_regular, "regular"),
LARGE("Large", 4, R.string.cache_size_large, "large"),
VERY_LARGE("Very large", 5, R.string.cache_size_very_large, "xlarge"), // used by OC only
NOT_CHOSEN("Not chosen", 6, R.string.cache_size_notchosen, ""),
VIRTUAL("Virtual", 7, R.string.cache_size_virtual, "none"),
OTHER("Other", 8, R.string.cache_size_other, "other"),
UNKNOWN("Unknown", -1, R.string.cache_size_unknown, ""); // CacheSize not init. yet
@NonNull
public final String id;
public final int comparable;
private final int stringId;
/**
* lookup for OC JSON requests (the numeric size is deprecated for OC)
*/
private final String ocSize2;
CacheSize(@NonNull final String id, final int comparable, final int stringId, final String ocSize2) {
this.id = id;
this.comparable = comparable;
this.stringId = stringId;
this.ocSize2 = ocSize2;
}
@NonNull
private static final Map<String, CacheSize> FIND_BY_ID = new HashMap<>();
static {
for (final CacheSize cs : values()) {
FIND_BY_ID.put(cs.id.toLowerCase(Locale.US), cs);
if (StringUtils.isNotBlank(cs.ocSize2)) {
FIND_BY_ID.put(cs.ocSize2.toLowerCase(Locale.US), cs);
}
// also add the size icon names of the website
final String imageName = StringUtils.replace(StringUtils.lowerCase(cs.id), " ", "_");
FIND_BY_ID.put(imageName, cs);
}
// add medium as additional string for Regular
FIND_BY_ID.put("medium", REGULAR);
}
@NonNull
public static CacheSize getById(@Nullable final String id) {
if (id == null) {
return UNKNOWN;
}
// avoid String operations for performance reasons
final CacheSize result = FIND_BY_ID.get(id);
if (result != null) {
return result;
}
// only if String was not found, normalize it
final CacheSize resultNormalized = FIND_BY_ID.get(id.toLowerCase(Locale.US).trim());
if (resultNormalized != null) {
return resultNormalized;
}
return getByNumber(id);
}
/**
* Bad GPX files can contain the container size encoded as number.
*/
@NonNull
private static CacheSize getByNumber(final String id) {
try {
final int numerical = Integer.parseInt(id);
if (numerical != 0) {
for (final CacheSize size : CacheSize.values()) {
if (size.comparable == numerical) {
return size;
}
}
}
} catch (final NumberFormatException ignored) {
// ignore, as this might be a number or not
}
return UNKNOWN;
}
@NonNull
public final String getL10n() {
return CgeoApplication.getInstance().getBaseContext().getString(stringId);
}
}