public async Task <SingleResponse <Diet> > GenerateDiet(int id, DateTime date) { SingleResponse <User> user = await userService.GetById(id); try { double breakfastCalories = user.Data.Daily_Calories * 0.3; double breakfastCarbohydrates = user.Data.Daily_Carbohydrates * 0.3; double breakfastProteins = user.Data.Daily_Protein * 0.3; double breakfastLipids = user.Data.Daily_Fats * 0.3; double lunchCalories = user.Data.Daily_Calories * 0.4; double lunchCarbohydrates = user.Data.Daily_Carbohydrates * 0.4; double lunchProteins = user.Data.Daily_Protein * 0.4; double lunchLipids = user.Data.Daily_Fats * 0.4; double dinnerCalories = user.Data.Daily_Calories * 0.3; double dinnerCarbohydrates = user.Data.Daily_Carbohydrates * 0.3; double dinnerProteins = user.Data.Daily_Protein * 0.3; double dinnerLipids = user.Data.Daily_Fats * 0.3; QueryResponse <Meal> breakfastMeals = await mealService.GetByCategory(Meal_Category.Café_da_manhã); QueryResponse <Meal> lunchMeals = await mealService.GetByCategory(Meal_Category.Almoço); QueryResponse <Meal> dinnerMeals = await mealService.GetByCategory(Meal_Category.Jantar); QueryResponse <Food> restrictionFoods = await userService.GetFoodsFromRestrictionByUserID(user.Data.ID); Diet diet = new Diet(); List <Meal> meals = new List <Meal>(); if (restrictionFoods.Data != null) { List <Meal> restrictedMeals = new List <Meal>(); foreach (Meal meal in breakfastMeals.Data) { QueryResponse <FoodAmountPerMeal> foods = await mealService.GetMealFoodsById(meal.ID); foreach (Food food in restrictionFoods.Data) { foreach (FoodAmountPerMeal foodAmount in foods.Data) { if (food.ID == foodAmount.FoodID) { restrictedMeals.Add(meal); } } } } foreach (Meal meal in lunchMeals.Data) { QueryResponse <FoodAmountPerMeal> foods = await mealService.GetMealFoodsById(meal.ID); foreach (Food food in restrictionFoods.Data) { foreach (FoodAmountPerMeal foodAmount in foods.Data) { if (food.ID == foodAmount.FoodID) { restrictedMeals.Add(meal); } } } } foreach (Meal meal in dinnerMeals.Data) { QueryResponse <FoodAmountPerMeal> foods = await mealService.GetMealFoodsById(meal.ID); foreach (Food food in restrictionFoods.Data) { foreach (FoodAmountPerMeal foodAmount in foods.Data) { if (food.ID == foodAmount.FoodID) { restrictedMeals.Add(meal); } } } } if (restrictedMeals.Count != 0) { foreach (Meal meal in restrictedMeals) { breakfastMeals.Data.Remove(meal); lunchMeals.Data.Remove(meal); dinnerMeals.Data.Remove(meal); } } } foreach (Meal item in breakfastMeals.Data) { if (item.Total_Calories <= (breakfastCalories + breakfastCalories * 0.30) && item.Total_Calories >= (breakfastCalories - breakfastCalories * 0.30)) { if (item.Total_Carbohydrates <= (breakfastCarbohydrates + breakfastCarbohydrates * 0.70) && item.Total_Carbohydrates >= (breakfastCarbohydrates - breakfastCarbohydrates * 0.70)) { if (item.Total_Proteins <= (breakfastProteins + breakfastProteins * 0.95) && item.Total_Proteins >= (breakfastProteins - breakfastProteins * 0.95)) { if (item.Total_Lipids <= (breakfastLipids + breakfastLipids * 0.95) && item.Total_Lipids >= (breakfastLipids - breakfastLipids * 0.95)) { meals.Add(item); } } } } } foreach (Meal item in lunchMeals.Data) { if (item.Total_Calories <= (lunchCalories + lunchCalories * 0.30) && item.Total_Calories >= lunchCalories - lunchCalories * 0.30) { if (item.Total_Carbohydrates <= (lunchCarbohydrates + lunchCarbohydrates * 0.70) && item.Total_Carbohydrates >= (lunchCarbohydrates - lunchCarbohydrates * 0.70)) { if (item.Total_Proteins <= (lunchProteins + lunchProteins * 0.95) && item.Total_Proteins >= (lunchProteins - lunchProteins * 0.95)) { if (item.Total_Lipids <= (lunchLipids + lunchLipids * 0.95) && item.Total_Lipids >= (lunchLipids - lunchLipids * 0.95)) { meals.Add(item); } } } } } foreach (Meal item in dinnerMeals.Data) { if (item.Total_Calories == (dinnerCalories + dinnerCalories * 0.30) && item.Total_Calories == (dinnerCalories - dinnerCalories * 0.30)) { if (item.Total_Carbohydrates <= (dinnerCarbohydrates + dinnerCarbohydrates * 0.70) && item.Total_Carbohydrates >= (dinnerCarbohydrates - dinnerCarbohydrates * 0.70)) { if (item.Total_Proteins <= (dinnerProteins + dinnerProteins * 0.95) && item.Total_Proteins >= (dinnerProteins - dinnerProteins * 0.95)) { if (item.Total_Lipids <= (dinnerLipids + dinnerLipids * 0.95) && item.Total_Lipids >= (dinnerLipids - dinnerLipids * 0.95)) { meals.Add(item); } } } } } if (meals.Count != 3) { Random rand = new Random(); meals.Add(breakfastMeals.Data.ElementAt(rand.Next(breakfastMeals.Data.Count()))); meals.Add(lunchMeals.Data.ElementAt(rand.Next(lunchMeals.Data.Count()))); meals.Add(dinnerMeals.Data.ElementAt(rand.Next(dinnerMeals.Data.Count()))); } SingleResponse <Diet> dietResponse = new SingleResponse <Diet>(); diet.Date = date; diet.Meals = meals; diet.UserID = id; return(ResponseFactory.SingleResponseSuccessModel <Diet>(diet)); } catch (Exception ex) { return(ResponseFactory.SingleResponseExceptionModel <Diet>(ex)); } }