package mi.hdm.recipes; import mi.hdm.exceptions.InvalidNutritionTableException; import java.math.BigDecimal; import java.util.HashMap; import java.util.List; import java.util.Map; public class NutritionTable { private final Map<Nutrition, BigDecimal> table; /** * Creates a new nutrition table that can be used in an ingredient. Expects values for all the nutrition values in order: Calories, Carbs, Fats, Proteins, Fibers, Salt. * All values supplied should be in relation to 100 grams or 1 piece. */ public NutritionTable(double caloriesDouble, double carbsDouble, double fatsDouble, double proteinsDouble, double fibersDouble, double saltDouble) { BigDecimal calories = BigDecimal.valueOf(caloriesDouble), carbs = BigDecimal.valueOf(carbsDouble), fats = BigDecimal.valueOf(fatsDouble), proteins = BigDecimal.valueOf(proteinsDouble), fibers = BigDecimal.valueOf(fibersDouble), salt = BigDecimal.valueOf(saltDouble); if (calories.compareTo(BigDecimal.ZERO) < 0 || carbs.compareTo(BigDecimal.ZERO) < 0 || fats.compareTo(BigDecimal.ZERO) < 0 || proteins.compareTo(BigDecimal.ZERO) < 0 || fibers.compareTo(BigDecimal.ZERO) < 0 || salt.compareTo(BigDecimal.ZERO) < 0) { throw new InvalidNutritionTableException("Can't create NutritionTable where any of the arguments is < 0"); } this.table = new HashMap<>(); table.put(Nutrition.CALORIES, calories); table.put(Nutrition.CARBS, carbs); table.put(Nutrition.FAT, fats); table.put(Nutrition.PROTEINS, proteins); table.put(Nutrition.FIBERS, fibers); table.put(Nutrition.SALT, salt); } public NutritionTable(List<BigDecimal> nutrition) { if (nutrition == null || nutrition.size() != Nutrition.values().length) throw new InvalidNutritionTableException("You supplied a list that was null or had an invalid size."); this.table = new HashMap<>(); for (int i = 0; i < nutrition.size(); i++) { table.put(Nutrition.values()[i], nutrition.get(i)); } } private NutritionTable() { this.table = new HashMap<>(); table.put(Nutrition.CALORIES, BigDecimal.valueOf(0.0)); table.put(Nutrition.CARBS, BigDecimal.valueOf(0.0)); table.put(Nutrition.FAT, BigDecimal.valueOf(0.0)); table.put(Nutrition.PROTEINS, BigDecimal.valueOf(0.0)); table.put(Nutrition.FIBERS, BigDecimal.valueOf(0.0)); table.put(Nutrition.SALT, BigDecimal.valueOf(0.0)); } public Map<Nutrition, BigDecimal> getTable() { return table; } public NutritionTable get() { return this; } /** * Overridden equals method to account for rounding errors when calculating nutrition scores. * * @param o Object that is being compared * @return true if the given object is a NutritionTable and their internal maps are identical */ @Override public boolean equals(Object o) { if (o instanceof NutritionTable n) { return n.getTable().equals(table); } return false; } @Override public String toString() { return "NutritionTable{" + "table=" + table + '}'; } public static NutritionTable empty() { return new NutritionTable(); } }