package org.solovyev.android.calculator.converter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import org.solovyev.android.calculator.Named;
import org.solovyev.android.calculator.R;
import javax.measure.unit.Dimension;
import javax.measure.unit.NonSI;
import javax.measure.unit.SI;
import javax.measure.unit.Unit;
import java.util.*;
enum UnitDimension implements ConvertibleDimension {
TIME(Dimension.TIME, R.string.cpp_converter_time),
AMOUNT_OF_SUBSTANCE(Dimension.AMOUNT_OF_SUBSTANCE, R.string.cpp_converter_amount_of_substance),
ELECTRIC_CURRENT(Dimension.ELECTRIC_CURRENT, R.string.cpp_converter_electric_current),
LENGTH(Dimension.LENGTH, R.string.cpp_converter_length),
MASS(Dimension.MASS, R.string.cpp_converter_mass),
TEMPERATURE(Dimension.TEMPERATURE, R.string.cpp_converter_temperature);
// todo serso: better to provide a dimension-id pair as units might not be unique in different dimensions
@NonNull
private static final Set<String> excludedUnits = new HashSet<>(Arrays.asList("year_sidereal", "year_calendar", "day_sidereal", "foot_survey_us", "me", "u"));
@NonNull
private static final Map<Dimension, List<Convertible>> units = new HashMap<>();
static {
for (Unit<?> unit : SI.getInstance().getUnits()) {
addUnit(unit);
}
for (Unit<?> unit : NonSI.getInstance().getUnits()) {
addUnit(unit);
}
}
@NonNull
public final Dimension dimension;
@StringRes
public final int name;
UnitDimension(@NonNull Dimension dimension, @StringRes int name) {
this.dimension = dimension;
this.name = name;
}
private static void addUnit(@NonNull Unit<?> unit) {
if (excludedUnits.contains(unit.toString())) {
return;
}
final Dimension dimension = unit.getDimension();
List<Convertible> unitsInDimension = units.get(dimension);
if (unitsInDimension == null) {
unitsInDimension = new ArrayList<>();
units.put(dimension, unitsInDimension);
}
unitsInDimension.add(UnitConvertible.create(unit));
}
@Nullable
public static UnitDimension of(@NonNull Unit<?> unit) {
for (UnitDimension myDimension : values()) {
if (myDimension.dimension.equals(unit.getDimension())) {
return myDimension;
}
}
return null;
}
@NonNull
@Override
public Named<ConvertibleDimension> named(@NonNull Context context) {
return Named.<ConvertibleDimension>create(this, name, context);
}
@NonNull
@Override
public List<Convertible> getUnits() {
return units.get(dimension);
}
}