using AppException; using Model; using System.Reflection; using System.Runtime.CompilerServices; namespace Managers { public class RecipeDefaultManager : IRecipeManager { private IDataManager _dataManager; public RecipeDefaultManager(IDataManager dataManager) { _dataManager = dataManager; } public bool AddRecipeToData(Recipe recipe) { var recipeList = _dataManager.Data[nameof(Recipe)]; if (recipeList.Exists(r => r.Equals(recipe))) return false; _dataManager.Data[nameof(Recipe)].Add(recipe); return true; } public RecipeCollection GetAllRecipes() { return new RecipeCollection( "All recipes", _dataManager.GetFromData().ToArray()); } public RecipeCollection GetRecipeByAuthor(string authorMail) { User? author = _dataManager.GetFromData() .ToList() .Find(u => u.Mail == authorMail); if (author is null) throw new UserNotFoundException(authorMail); return new RecipeCollection( $"{author.Name} {author.Surname}'s recipes", _dataManager.GetFromData().ToArray()); } public RecipeCollection GetRecipeByTitle(string title) { IEnumerable recipes = from Recipe recipe in _dataManager.GetFromData() where recipe.Title.Contains(title) select recipe; return new RecipeCollection( $"Search for '{title}'", recipes.ToArray()); } public Recipe GetRecipeFromId(int id) { Recipe? recipe = _dataManager.GetFromData() .ToList() .Find(r => r.Id == id); if (recipe is null) throw new RecipeNotFoundException(); return recipe; } public RecipeCollection GetRecipesByPriorityOrder(IEnumerable priorities) { List recipes = new List(); IEnumerable recipesWithCurrentPriority; foreach (Priority priority in priorities) { recipesWithCurrentPriority = from Recipe recipe in _dataManager.GetFromData() where recipe.Priority == priority select recipe; recipes.AddRange(recipesWithCurrentPriority); } return new RecipeCollection( $"Suggestions", recipes.ToArray()); } public bool ModifyRecipeInData(Recipe oldRecipe, Recipe newRecipe) { if (oldRecipe.Equals(newRecipe)) return false; Recipe? recipe = _dataManager.GetFromData() .ToList() .Find(r => r.Equals(oldRecipe)); if (recipe is null) throw new RecipeNotFoundException(); foreach (var property in typeof(Recipe).GetProperties() .Where(prop => prop.CanWrite)) { property.SetValue(oldRecipe, recipe); } return true; } } }