Index: NutriMatch/Controllers/AdminController.cs
===================================================================
--- NutriMatch/Controllers/AdminController.cs	(revision 4a68273d2173d196bea803f19c4d87863b81f215)
+++ NutriMatch/Controllers/AdminController.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -9,12 +9,14 @@
 {
     private readonly AppDbContext _context;
-    public AdminController(AppDbContext context)
+    private readonly ILogger<AdminController> _logger;
+    public AdminController(AppDbContext context, ILogger<AdminController> logger)
     {
         _context = context;
+        _logger = logger;
     }
     public async Task<IActionResult> Index()
     {
         var pendingRecipes = await _context.Recipes
-            .Where(r => r.IsApproved == false)
+            .Where(r => r.RecipeStatus == "Pending")
             .Include(r => r.User)
             .ToListAsync();
@@ -23,54 +25,172 @@
     [HttpPost]
     [ValidateAntiForgeryToken]
-    public async Task<IActionResult> ApproveRecipe([FromBody] int recipeId)
+    public async Task<IActionResult> ApproveRecipe([FromBody] JsonElement request)
     {
-        var recipe = await _context.Recipes.FindAsync(recipeId);
-        if (recipe == null)
-            return NotFound("Recipe not found.");
-        recipe.IsApproved = true;
-        await _context.SaveChangesAsync();
-        return Ok("Recipe approved successfully.");
+        try
+        {
+            if (!request.TryGetProperty("recipeId", out var recipeIdProp))
+            {
+                return Json(new { success = false, message = "Recipe ID is required." });
+            }
+            int recipeId = recipeIdProp.GetInt32();
+            var recipe = await _context.Recipes
+                .Include(r => r.RecipeIngredients)
+                .ThenInclude(ri => ri.Ingredient)
+                .FirstOrDefaultAsync(r => r.Id == recipeId);
+            if (recipe == null)
+            {
+                return Json(new { success = false, message = "Recipe not found." });
+            }
+            recipe.RecipeStatus = "Accepted";
+            if (recipe.HasPendingIngredients == true)
+            {
+                var pendingIngredients = recipe.RecipeIngredients
+                    .Where(ri => ri.Ingredient.Status == "Pending")
+                    .Select(ri => ri.Ingredient);
+                foreach (var ingredient in pendingIngredients)
+                {
+                    ingredient.Status = null; 
+                }
+                recipe.HasPendingIngredients = false; 
+            }
+            await _context.SaveChangesAsync();
+            return Json(new { message = "Recipe approved successfully.", success = true });
+        }
+        catch (Exception ex)
+        {
+            _logger.LogError(ex, "Error approving recipe");
+            return Json(new { success = false, message = "An error occurred while approving the recipe." });
+        }
     }
     [HttpPost]
     [ValidateAntiForgeryToken]
-    public async Task<IActionResult> DeclineRecipe([FromBody] int recipeId)
+    public async Task<IActionResult> DeclineRecipe([FromBody] JsonElement request)
     {
-        var recipe = await _context.Recipes.FindAsync(recipeId);
-        if (recipe == null)
-            return NotFound("Recipe not found.");
-        _context.Recipes.Remove(recipe);
-        await _context.SaveChangesAsync();
-        return Ok("Recipe declined successfully.");
-    }
-    [HttpPost]
-    public async Task<IActionResult> BulkApproveRecipes([FromBody] JsonElement request)
-    {
-        List<int> recipeIds = request.GetProperty("recipeIds").EnumerateArray()
-            .Select(x => x.GetInt32())
-            .ToList();
-        var recipes = await _context.Recipes
-            .Where(r => recipeIds.Contains(r.Id))
-            .ToListAsync();
-        foreach (var recipe in recipes)
+        try
         {
-            recipe.IsApproved = true;
-            Console.WriteLine(recipe.Title + " approved");
+            if (!request.TryGetProperty("recipeId", out var recipeIdProp))
+            {
+                return Json(new { success = false, message = "Recipe ID is required." });
+            }
+            int recipeId = recipeIdProp.GetInt32();
+            string reason = request.TryGetProperty("reason", out var reasonProp) ? reasonProp.GetString() : "No reason provided.";
+            string notes = request.TryGetProperty("notes", out var notesProp) ? notesProp.GetString() : "No notes provided.";
+            var recipe = await _context.Recipes.FindAsync(recipeId);
+            if (recipe == null)
+            {
+                return Json(new { success = false, message = "Recipe not found." });
+            }
+            recipe.RecipeStatus = "Declined";
+            recipe.DeclineReason = reason ?? string.Empty;
+            recipe.AdminComment = notes ?? string.Empty;
+            await _context.SaveChangesAsync();
+            return Json(new { message = "Recipe declined successfully.", success = true });
         }
-        await _context.SaveChangesAsync();
-        return Json(new { message = "Selected recipes approved.", success = true }); ;
+        catch (Exception ex)
+        {
+            _logger.LogError(ex, "Error declining recipe");
+            return Json(new { success = false, message = "An error occurred while declining the recipe." });
+        }
     }
     [HttpPost]
     [ValidateAntiForgeryToken]
-    public async Task<IActionResult> BulkDeclineRecipes([FromBody] List<int> recipeIds)
+    public async Task<IActionResult> BulkApproveRecipes([FromBody] JsonElement request)
     {
-        var recipes = await _context.Recipes
-            .Where(r => recipeIds.Contains(r.Id))
-            .ToListAsync();
-        foreach (var recipe in recipes)
+        try
         {
-            _context.Recipes.Remove(recipe);
+            if (!request.TryGetProperty("recipeIds", out var recipeIdsProp))
+            {
+                return Json(new { success = false, message = "Recipe IDs are required." });
+            }
+            List<int> recipeIds = recipeIdsProp.EnumerateArray()
+                .Select(x => x.GetInt32())
+                .ToList();
+            if (!recipeIds.Any())
+            {
+                return Json(new { success = false, message = "No recipe IDs provided." });
+            }
+            var recipes = await _context.Recipes
+                .Include(r => r.RecipeIngredients)
+                .ThenInclude(ri => ri.Ingredient)
+                .Where(r => recipeIds.Contains(r.Id))
+                .ToListAsync();
+            if (!recipes.Any())
+            {
+                return Json(new { success = false, message = "No recipes found." });
+            }
+            int approvedCount = 0;
+            foreach (var recipe in recipes)
+            {
+                recipe.RecipeStatus = "Accepted";
+                if (recipe.HasPendingIngredients == true)
+                {
+                    var pendingIngredients = recipe.RecipeIngredients
+                        .Where(ri => ri.Ingredient.Status == "Pending")
+                        .Select(ri => ri.Ingredient);
+                    foreach (var ingredient in pendingIngredients)
+                    {
+                        ingredient.Status = null; 
+                    }
+                    recipe.HasPendingIngredients = false; 
+                }
+                approvedCount++;
+            }
+            await _context.SaveChangesAsync();
+            return Json(new { 
+                message = $"{approvedCount} recipe(s) approved successfully.", 
+                success = true, 
+                approvedCount = approvedCount 
+            });
         }
-        await _context.SaveChangesAsync();
-        return Ok("Selected recipes declined.");
+        catch (Exception ex)
+        {
+            _logger.LogError(ex, "Error bulk approving recipes");
+            return Json(new { success = false, message = "An error occurred while approving recipes." });
+        }
+    }
+    public async Task<IActionResult> DeclineReasonModel(int? id)
+    {
+        try
+        {
+            if (id == null)
+            {
+                return NotFound();
+            }
+            var recipe = await _context.Recipes
+                .Include(r => r.User)
+                .Include(r => r.RecipeIngredients)
+                .ThenInclude(ri => ri.Ingredient)
+                .FirstOrDefaultAsync(m => m.Id == id);
+            if (recipe == null)
+            {
+                return NotFound();
+            }
+            return PartialView("_RecipeDeclineAdminPartial", recipe);
+        }
+        catch (Exception ex)
+        {
+            _logger.LogError(ex, "Error loading decline reason model");
+            return StatusCode(500, "An error occurred while loading the decline form.");
+        }
+    }
+    [HttpGet]
+    public async Task<IActionResult> GetIngredientReview(int id)
+    {
+        try
+        {
+            var ingredient = await _context.Ingredients
+                .Where(i => i.Id == id && i.Status == "Pending")
+                .FirstOrDefaultAsync();
+            if (ingredient == null)
+            {
+                return NotFound("Ingredient not found or not pending review.");
+            }
+            return PartialView("_IngredientReviewPartial", ingredient);
+        }
+        catch (Exception ex)
+        {
+            _logger.LogError(ex, "Error loading ingredient review for ID: {IngredientId}", id);
+            return StatusCode(500, "An error occurred while loading ingredient details.");
+        }
     }
 }
Index: NutriMatch/Controllers/HomeController.cs
===================================================================
--- NutriMatch/Controllers/HomeController.cs	(revision 4a68273d2173d196bea803f19c4d87863b81f215)
+++ NutriMatch/Controllers/HomeController.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -1,6 +1,8 @@
+using System.Security.Claims;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.EntityFrameworkCore;
 using NutriMatch.Data;
 using NutriMatch.Models;
+using Microsoft.AspNetCore.Identity;
 
 namespace MyApp.Namespace
@@ -10,26 +12,61 @@
 
         private readonly AppDbContext _context;
-        public Home(AppDbContext context)
+        private readonly UserManager<User> _userManager;
+        public Home(AppDbContext context,UserManager<User> userManager)
         {
             _context = context;
+            _userManager = userManager;
         }
 
         public async Task<IActionResult> Index()
-        {   
-            var recipes = await _context.Recipes.Include(r => r.User).Include(r => r.Ratings).Take(6).ToListAsync();
-            foreach (var recipe in recipes)
-            {
-                recipe.Rating = recipe.Ratings.Any() ? recipe.Ratings.Average(r => r.Rating) : 0;
-            }
-            var model = new HomeViewModel
-            {
+{   
+    var recipes = await _context.Recipes.Where(r => r.RecipeStatus == "Accepted").Include(r => r.User).Include(r => r.Ratings).Take(6).ToListAsync();
+    foreach (var recipe in recipes)
+    {
+        recipe.Rating = recipe.Ratings.Any() ? recipe.Ratings.Average(r => r.Rating) : 0;
+    }
+    var model = new HomeViewModel
+    {
+        Recipes = recipes,
+        Restaurants = await _context.Restaurants.ToListAsync()                
+    };
 
-               
+    var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); 
+    var userRecipes = _context.Recipes.Where(r => r.UserId == userId).Include(r => r.User).Include(r => r.Ratings).ToList();
+    var recipeIds = userRecipes.Select(r => r.Id).ToList();
+    var ratings = _context.RecipeRatings.Where(r => recipeIds.Contains(r.RecipeId)).GroupBy(r => r.RecipeId);
 
-                Recipes = recipes,
-                Restaurants = await _context.Restaurants.ToListAsync()                
-            };
-            return View(model);
-        }
+    foreach (var recipe in userRecipes)
+    {
+        recipe.Rating = recipe.Ratings.Any() ? recipe.Ratings.Average(r => r.Rating) : 0;
+    }
+
+    double averageRating = 0;
+    foreach (var groop in ratings)
+    {
+        averageRating += groop.Average(r => r.Rating);
+    }    
+
+    if (ratings.Count() > 0)
+    {
+        ViewBag.AverageRating = Math.Round(averageRating / ratings.Count(), 1);
+    }
+    else
+    {
+        ViewBag.AverageRating = 0; 
+    }
+
+    ViewBag.UserRecipesCount = userRecipes.Count;
+
+
+    if (User.Identity.IsAuthenticated && !string.IsNullOrEmpty(userId))
+    {
+ 
+        var currentUser = await _userManager.GetUserAsync(User);
+        ViewBag.UserPicture = currentUser?.ProfilePictureUrl; 
+    }
+
+    return View(model);
+}
 
 
Index: NutriMatch/Controllers/MealPlanController.cs
===================================================================
--- NutriMatch/Controllers/MealPlanController.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Controllers/MealPlanController.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,158 @@
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Identity;
+using Microsoft.AspNetCore.Mvc;
+using NutriMatch.Models;
+using NutriMatch.Services;
+using System.ComponentModel.DataAnnotations;
+namespace NutriMatch.Controllers
+{
+    [Authorize]
+    public class MealPlanController : Controller
+    {
+        private readonly IMealPlanService _mealPlanService;
+        private readonly UserManager<User> _userManager;
+        public MealPlanController(IMealPlanService mealPlanService, UserManager<User> userManager)
+        {
+            _mealPlanService = mealPlanService;
+            _userManager = userManager;
+        }
+        public IActionResult Create()
+        {
+            return View();
+        }
+        [HttpPost]
+        [ValidateAntiForgeryToken]
+        public async Task<IActionResult> Create(MealPlanRequest model)
+        {
+            if (!ModelState.IsValid)
+            {
+                return View(model);
+            }
+            var user = await _userManager.GetUserAsync(User);
+            if (user == null)
+            {
+                return RedirectToAction("Login", "Account");
+            }
+            var result = await _mealPlanService.GenerateWeeklyMealPlanAsync(user.Id, model);
+            if (result.Success)
+            {
+                TempData["Success"] = "Weekly meal plan generated successfully!";
+                return RedirectToAction("Details", new { id = result.WeeklyMealPlan.Id });
+            }
+            else
+            {
+                ModelState.AddModelError("", result.ErrorMessage ?? "Failed to generate meal plan. Please try again.");
+                return View(model);
+            }
+        }
+        [HttpGet]
+        public async Task<IActionResult> Details(int id)
+        {
+            var user = await _userManager.GetUserAsync(User);
+            if (user == null)
+            {
+                return RedirectToAction("Login", "Account");
+            }
+            var mealPlan = await _mealPlanService.GetMealPlanByIdAsync(id, user.Id);
+            if (mealPlan == null)
+            {
+                TempData["Error"] = "Meal plan not found or you don't have access to it.";
+                return RedirectToAction("Index");
+            }
+            return View(mealPlan);
+        }
+        [HttpGet]
+        public async Task<IActionResult> Index()
+        {
+            var user = await _userManager.GetUserAsync(User);
+            if (user == null)
+            {
+                return RedirectToAction("Login", "Account");
+            }
+            var mealPlans = await _mealPlanService.GetUserMealPlansAsync(user.Id);
+            return View(mealPlans);
+        }
+        [HttpPost]
+        [ValidateAntiForgeryToken]
+        public async Task<IActionResult> Delete(int id)
+        {
+            var user = await _userManager.GetUserAsync(User);
+            if (user == null)
+            {
+                return RedirectToAction("Login", "Account");
+            }
+            var result = await _mealPlanService.DeleteMealPlanAsync(id, user.Id);
+            if (result)
+            {
+                TempData["Success"] = "Meal plan deleted successfully!";
+            }
+            else
+            {
+                TempData["Error"] = "Failed to delete meal plan. It may not exist or you don't have permission to delete it.";
+            }
+            return RedirectToAction("Index");
+        }
+        [HttpPost]
+        [ValidateAntiForgeryToken]
+        public async Task<IActionResult> Regenerate([FromBody] MealPlanRequest request)
+        {
+            if (!ModelState.IsValid)
+            {
+                return BadRequest(ModelState);
+            }
+            var user = await _userManager.GetUserAsync(User);
+            if (user == null)
+            {
+                return Unauthorized();
+            }
+            var result = await _mealPlanService.GenerateWeeklyMealPlanAsync(user.Id, request);
+            if (result.Success)
+            {
+                return Json(new { success = true, message = "Meal plan regenerated successfully!", mealPlanId = result.WeeklyMealPlan.Id });
+            }
+            else
+            {
+                return Json(new { success = false, message = result.ErrorMessage });
+            }
+        }
+        [HttpGet]
+        public async Task<IActionResult> GetMealPlanJson(int id)
+        {
+            var user = await _userManager.GetUserAsync(User);
+            if (user == null)
+            {
+                return Unauthorized();
+            }
+            var mealPlan = await _mealPlanService.GetMealPlanByIdAsync(id, user.Id);
+            if (mealPlan == null)
+            {
+                return NotFound("Meal plan not found");
+            }
+            return Json(mealPlan);
+        }
+        [HttpPost]
+        public async Task<IActionResult> GenerateFromApi([FromBody] MealPlanRequest request)
+        {
+            var user = await _userManager.GetUserAsync(User);
+            if (user == null)
+            {
+                return Unauthorized("User not found");
+            }
+            var result = await _mealPlanService.GenerateWeeklyMealPlanAsync(user.Id, request);
+            if (result.Success)
+            {
+                return Ok(new 
+                { 
+                    success = true,
+                    message = "Weekly meal plan generated successfully!",
+                    mealPlan = result.WeeklyMealPlan,
+                    dailyMacroTotals = result.DailyMacroTotals
+                });
+            }
+            else
+            {
+                return BadRequest(new { success = false, message = result.ErrorMessage });
+            }
+        }
+    }
+}
Index: NutriMatch/Controllers/RecipesController.cs
===================================================================
--- NutriMatch/Controllers/RecipesController.cs	(revision 4a68273d2173d196bea803f19c4d87863b81f215)
+++ NutriMatch/Controllers/RecipesController.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -17,6 +17,180 @@
 namespace NutriMatch.Controllers
 {
+    public class MealKeywords
+    {
+        public List<string> Breakfast { get; set; }
+        public List<string> Main { get; set; }
+        public List<string> Snack { get; set; }
+    }
     public class RecipesController : Controller
     {
+        private MealKeywords LoadKeywordsFromJson()
+        {
+            var filePath = "Data/meal_keywords.json";
+            if (!System.IO.File.Exists(filePath))
+            {
+                return new MealKeywords
+                {
+                    Breakfast = new List<string>(),
+                    Main = new List<string>(),
+                    Snack = new List<string>()
+                };
+            }
+            var jsonString = System.IO.File.ReadAllText(filePath);
+            var options = new JsonSerializerOptions
+            {
+                PropertyNameCaseInsensitive = true
+            };
+            return JsonSerializer.Deserialize<MealKeywords>(jsonString, options) ?? new MealKeywords
+            {
+                Breakfast = new List<string>(),
+                Main = new List<string>(),
+                Snack = new List<string>()
+            };
+        }
+        public List<string> GenerateRecipeTags(Recipe recipe, List<SelectedIngredient> ingredients)
+        {
+            var keywords = LoadKeywordsFromJson();
+            var tags = new HashSet<string>();
+            string NormalizeWord(string word)
+            {
+                word = word.ToLower().Trim();
+                if (word.EndsWith("ies") && word.Length > 4)
+                    return word.Substring(0, word.Length - 3) + "y";
+                if (word.EndsWith("es") && word.Length > 3)
+                    return word.Substring(0, word.Length - 2);
+                if (word.EndsWith("s") && word.Length > 3 && !word.EndsWith("ss"))
+                    return word.Substring(0, word.Length - 1);
+                return word;
+            }
+            int CountKeywordMatches(IEnumerable<string> words, HashSet<string> keywords, bool isTitle = false)
+            {
+                int count = 0;
+                foreach (var word in words)
+                {
+                    bool matches = keywords.Contains(word) || keywords.Contains(NormalizeWord(word));
+                    if (matches)
+                        count += isTitle ? 3 : 1;
+                }
+                return count;
+            }
+            bool ContainsKeyword(IEnumerable<string> words, HashSet<string> keywords)
+            {
+                return words.Any(word =>
+                    keywords.Contains(word) ||
+                    keywords.Contains(NormalizeWord(word)) ||
+                    keywords.Any(k => NormalizeWord(k) == NormalizeWord(word))
+                );
+            }
+            var breakfastKeywords = new HashSet<string>(keywords.Breakfast ?? new List<string>(), StringComparer.OrdinalIgnoreCase);
+            var mainKeywords = new HashSet<string>(keywords.Main ?? new List<string>(), StringComparer.OrdinalIgnoreCase);
+            var snackKeywords = new HashSet<string>(keywords.Snack ?? new List<string>(), StringComparer.OrdinalIgnoreCase);
+            var titleWords = recipe.Title.ToLower()
+                .Split(new char[] { ' ', '-', '_', ',', '.', '(', ')' }, StringSplitOptions.RemoveEmptyEntries);
+            var ingredientWords = new HashSet<string>();
+            foreach (var ing in ingredients)
+            {
+                var words = ing.Name.ToLower()
+                    .Split(new char[] { ' ', '-', '_', ',', '.', '(', ')' }, StringSplitOptions.RemoveEmptyEntries);
+                foreach (var w in words) ingredientWords.Add(w);
+            }
+            var allWords = titleWords.Concat(ingredientWords).ToList();
+            int breakfastScore = CountKeywordMatches(titleWords, breakfastKeywords, true) +
+                                 CountKeywordMatches(ingredientWords, breakfastKeywords, false);
+            int mainScore = CountKeywordMatches(titleWords, mainKeywords, true) +
+                            CountKeywordMatches(ingredientWords, mainKeywords, false);
+            int snackScore = CountKeywordMatches(titleWords, snackKeywords, true) +
+                             CountKeywordMatches(ingredientWords, snackKeywords, false);
+            int lunchScore = mainScore;
+            int dinnerScore = mainScore;
+            float calories = Math.Max(recipe.Calories, 1);
+            float proteinRatio = (recipe.Protein * 4) / calories * 100;
+            float carbRatio = (recipe.Carbs * 4) / calories * 100;
+            float fatRatio = (recipe.Fat * 9) / calories * 100;
+            if (calories < 150)
+            {
+                snackScore += 5;
+                breakfastScore -= 2;
+                lunchScore -= 3;
+                dinnerScore -= 4;
+            }
+            else if (calories < 300)
+            {
+                snackScore += 3;
+                breakfastScore += 2;
+                lunchScore -= 1;
+                dinnerScore -= 2;
+            }
+            else if (calories < 450)
+            {
+                breakfastScore += 3;
+                lunchScore += 2;
+                snackScore -= 1;
+                dinnerScore -= 1;
+            }
+            else if (calories < 650)
+            {
+                lunchScore += 3;
+                dinnerScore += 2;
+                breakfastScore -= 1;
+                snackScore -= 3;
+            }
+            else
+            {
+                dinnerScore += 4;
+                lunchScore += 1;
+                breakfastScore -= 3;
+                snackScore -= 4;
+            }
+            if (proteinRatio > 30)
+            {
+                dinnerScore += 3;
+                lunchScore += 2;
+                breakfastScore += 1;
+                snackScore -= 1;
+            }
+            else if (proteinRatio > 20)
+            {
+                dinnerScore += 2;
+                lunchScore += 1;
+            }
+            else if (proteinRatio < 10)
+            {
+                snackScore += 2;
+                dinnerScore -= 1;
+                lunchScore -= 1;
+            }
+            if (carbRatio > 60)
+            {
+                breakfastScore += 2;
+                snackScore += 2;
+                dinnerScore -= 1;
+            }
+            else if (carbRatio < 20)
+            {
+                dinnerScore += 1;
+                lunchScore += 1;
+            }
+            if (fatRatio > 40)
+            {
+                dinnerScore += 2;
+                snackScore += 1;
+                breakfastScore -= 1;
+            }
+            var results = new List<(string tag, int score)>
+        {
+            ("breakfast", breakfastScore),
+            ("lunch", lunchScore),
+            ("dinner", dinnerScore),
+            ("snack", snackScore)
+        }.OrderByDescending(x => x.score).ToList();
+            tags.Add(results[0].tag);
+            for (int i = 1; i < results.Count; i++)
+            {
+                if (results[i].score > 0 && results[i].score >= results[0].score * 0.6)
+                    tags.Add(results[i].tag);
+            }
+            return tags.ToList();
+        }
         float ConvertType(float number, string unit)
         {
@@ -56,4 +230,5 @@
             var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
             var recipes = await _context.Recipes
+                .Where(r => r.RecipeStatus == "Accepted")
                 .Include(r => r.User)
                 .Include(r => r.Ratings)
@@ -75,6 +250,6 @@
             return View(recipes);
         }
-        [Route("Recipes/Details/{id}/{isOwner?}")]
-        public async Task<IActionResult> Details(int? id, bool isOwner = false)
+        [Route("Recipes/Details/{id}")]
+        public async Task<IActionResult> Details(int? id, bool isOwner = false, String recipeDetailsDisplayContorol = "")
         {
             if (id == null)
@@ -85,26 +260,41 @@
             .Include(r => r.RecipeIngredients)
             .ThenInclude(ri => ri.Ingredient)
-            .FirstOrDefaultAsync(m => m.Id == id);      
+            .FirstOrDefaultAsync(m => m.Id == id);
             if (recipe == null)
             {
                 return NotFound();
             }
-            var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
-            bool actualIsOwner = !string.IsNullOrEmpty(userId) && recipe.UserId == userId;
-            var (averageRating, totalRatings, userRating, hasUserRated) = 
-                await GetRatingDataAsync(id.Value, userId);
-            bool isFavorited = false;
-            if (!string.IsNullOrEmpty(userId))
-            {
-                isFavorited = await _context.FavoriteRecipes
-                    .AnyAsync(fr => fr.UserId == userId && fr.RecipeId == id.Value);
-            }
-            ViewBag.IsOwner = actualIsOwner;
-            ViewBag.AverageRating = averageRating;
-            ViewBag.TotalRatings = totalRatings;
-            ViewBag.UserRating = userRating;
-            ViewBag.HasUserRated = hasUserRated;
-            ViewBag.IsFavorited = isFavorited;
-            return PartialView("_RecipeDetailsPartial", recipe);
+            if (recipeDetailsDisplayContorol == "Declined")
+            {
+                return PartialView("_RecipeDeclinePartial", recipe);
+            }
+            else
+            {
+                var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
+                bool actualIsOwner = !string.IsNullOrEmpty(userId) && recipe.UserId == userId;
+                var (averageRating, totalRatings, userRating, hasUserRated) =
+                    await GetRatingDataAsync(id.Value, userId);
+                bool isFavorited = false;
+                if (!string.IsNullOrEmpty(userId))
+                {
+                    isFavorited = await _context.FavoriteRecipes
+                        .AnyAsync(fr => fr.UserId == userId && fr.RecipeId == id.Value);
+                }
+                if (recipeDetailsDisplayContorol == "Buttons")
+                {
+                    ViewBag.AddAdminButtons = true;
+                }
+                else if (recipeDetailsDisplayContorol == "Index")
+                {
+                    ViewBag.InIndex = true;
+                }
+                    ViewBag.IsOwner = actualIsOwner;
+                ViewBag.AverageRating = averageRating;
+                ViewBag.TotalRatings = totalRatings;
+                ViewBag.UserRating = userRating;
+                ViewBag.HasUserRated = hasUserRated;
+                ViewBag.IsFavorited = isFavorited;
+                return PartialView("_RecipeDetailsPartial", recipe);
+            }
         }
         [Authorize]
@@ -136,4 +326,5 @@
                 }
                 recipe.UserId = User.FindFirstValue(ClaimTypes.NameIdentifier);
+                recipe.Type = new List<string> { " " };
                 _context.Add(recipe);
                 await _context.SaveChangesAsync();
@@ -144,4 +335,5 @@
                 float totalCarbs = 0;
                 float totalFat = 0;
+                bool hasPendingIngredients = false;
                 foreach (var i in ingredients)
                 {
@@ -158,4 +350,8 @@
                     totalCarbs += ConvertType(tempIngredient.Carbs, i.Unit) * i.Quantity;
                     totalFat += ConvertType(tempIngredient.Fat, i.Unit) * i.Quantity;
+                    if (tempIngredient.Status == "Pending")
+                    {
+                        hasPendingIngredients = true;
+                    }
                 }
                 recipe.Calories = MathF.Round(totalCalories, MidpointRounding.AwayFromZero);
@@ -163,4 +359,8 @@
                 recipe.Carbs = MathF.Round(totalCarbs, MidpointRounding.AwayFromZero);
                 recipe.Fat = MathF.Round(totalFat, MidpointRounding.AwayFromZero);
+                if (hasPendingIngredients){
+                    recipe.HasPendingIngredients = true;
+                }
+                recipe.Type = GenerateRecipeTags(recipe, ingredients);
                 _context.Update(recipe);
                 await _context.SaveChangesAsync();
@@ -181,6 +381,15 @@
             return View(recipe);
         }
-        public async Task<IActionResult> Edit(int? id)
-        {
+        [HttpGet]
+        public async Task<IActionResult> Edit(int? id, bool requiresChange = false)
+        {
+            if (requiresChange)
+            {
+                ViewBag.RequireChange = true;
+            }
+            else
+            {
+                ViewBag.RequireChange = false;
+            }
             if (id == null)
             {
@@ -254,4 +463,5 @@
                 recipe.Fat = MathF.Round(totalFat, MidpointRounding.AwayFromZero);
                 recipe.UserId = User.FindFirstValue(ClaimTypes.NameIdentifier);
+                recipe.Type = GenerateRecipeTags(recipe, ingredients);
                 _context.Update(recipe);
                 await _context.SaveChangesAsync();
@@ -305,5 +515,5 @@
         {
             List<Ingredient> suggestions = await _context.Ingredients
-            .Where(i => EF.Functions.ILike(i.Name, $"%{query}%"))
+            .Where(i => EF.Functions.ILike(i.Name, $"%{query}%") && i.Status == null)
             .OrderBy(i => i.Name)
             .Take(5)
@@ -313,9 +523,9 @@
         public ActionResult MyRecipes()
         {
-            var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); 
+            var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
             var userRecipes = _context.Recipes.Where(r => r.UserId == userId).Include(r => r.User).Include(r => r.Ratings).ToList();
             var recipeIds = userRecipes.Select(r => r.Id).ToList();
             var ratings = _context.RecipeRatings.Where(r => recipeIds.Contains(r.RecipeId)).GroupBy(r => r.RecipeId);
-             foreach (var recipe in userRecipes)
+            foreach (var recipe in userRecipes)
             {
                 recipe.Rating = recipe.Ratings.Any() ? recipe.Ratings.Average(r => r.Rating) : 0;
@@ -325,6 +535,13 @@
             {
                 averageRating += groop.Average(r => r.Rating);
-            }    
-            ViewBag.AverageRating = Math.Round(averageRating / ratings.Count(), 1);
+            }
+            if (ratings.Count() > 0)
+            {
+                ViewBag.AverageRating = Math.Round(averageRating / ratings.Count(), 1);
+            }
+            else
+            {
+                ViewBag.AverageRating = 0;
+            }
             return View(userRecipes);
         }
@@ -377,7 +594,7 @@
                 var averageRating = ratings.Any() ? Math.Round(ratings.Average(), 1) : 0;
                 var totalRatings = ratings.Count;
-                return Json(new 
-                { 
-                    success = true, 
+                return Json(new
+                {
+                    success = true,
                     averageRating = averageRating,
                     totalRatings = totalRatings,
@@ -430,5 +647,5 @@
             }
         }
-        private async Task<(double averageRating, int totalRatings, double userRating, bool hasUserRated)> 
+        private async Task<(double averageRating, int totalRatings, double userRating, bool hasUserRated)>
             GetRatingDataAsync(int recipeId, string userId = null)
         {
@@ -488,17 +705,74 @@
                 }
                 await _context.SaveChangesAsync();
-                return Json(new { 
-                    success = true, 
+                return Json(new
+                {
+                    success = true,
                     isFavorited = isFavorited,
                     message = isFavorited ? "Added to favorites" : "Removed from favorites"
                 });
             }
+            catch (Exception _)
+            {
+                return Json(new
+                {
+                    success = false,
+                    message = "An error occurred while updating favorites"
+                });
+            }
+        }
+        [HttpPost]
+        public async Task<IActionResult> AddIngredient([FromBody] JsonElement request)
+        {
+            String Name = request.GetProperty("Name").GetString();
+            float Calories = request.GetProperty("Calories").GetSingle();
+            float Protein = request.GetProperty("Protein").GetSingle();
+            float Carbs = request.GetProperty("Carbs").GetSingle();
+            float Fat = request.GetProperty("Fat").GetSingle();
+            var token = Request.Headers["RequestVerificationToken"].FirstOrDefault();
+            if (string.IsNullOrEmpty(token))
+            {
+                return BadRequest("Anti-forgery token missing.");
+            }
+            if (!ModelState.IsValid)
+            {
+                return BadRequest(ModelState);
+            }
+            if (string.IsNullOrWhiteSpace(Name))
+            {
+                return BadRequest("Ingredient name is required.");
+            }
+            try
+            {
+                var existingIngredient = await _context.Ingredients
+                    .FirstOrDefaultAsync(i => i.Name.ToLower() == Name.ToLower());
+                if (existingIngredient != null)
+                {
+                    return BadRequest("An ingredient with this name already exists.");
+                }
+                var ingredient = new Ingredient
+                {
+                    Name = Name.Trim(),
+                    Calories = Calories,
+                    Protein = Protein,
+                    Carbs = Carbs,
+                    Fat = Fat,
+                    Status = "Pending"
+                };
+                _context.Ingredients.Add(ingredient);
+                await _context.SaveChangesAsync();
+                return Json(new
+                {
+                    id = ingredient.Id,
+                    name = ingredient.Name,
+                    calories = ingredient.Calories,
+                    protein = ingredient.Protein,
+                    carbs = ingredient.Carbs,
+                    fat = ingredient.Fat,
+                    sucess = true
+                });
+            }
             catch (Exception ex)
             {
-                _logger?.LogError(ex, "Error toggling favorite for recipe", ex);
-                return Json(new { 
-                    success = false, 
-                    message = "An error occurred while updating favorites" 
-                });
+                return StatusCode(500, "An error occurred while adding the ingredient.");
             }
         }
Index: NutriMatch/Controllers/RestaurantsController.cs
===================================================================
--- NutriMatch/Controllers/RestaurantsController.cs	(revision 4a68273d2173d196bea803f19c4d87863b81f215)
+++ NutriMatch/Controllers/RestaurantsController.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -8,20 +8,15 @@
 using Microsoft.EntityFrameworkCore;
 using NutriMatch.Data;
-
+using System.Text.Json;
+using NutriMatch.Models;
 namespace NutriMatch.Controllers
 {
-
     public class RestaurantsController : Controller
     {
         private readonly AppDbContext _context;
-
-
         public RestaurantsController(AppDbContext context)
         {
-
             _context = context;
         }
-
-
         public async Task<IActionResult> Index()
         {
@@ -29,6 +24,4 @@
             return View(restaurants);
         }
-        
-
         public async Task<IActionResult> GetRestaurantMeals(int? id,int? minCalories, int? maxCalories, int? minProtein, int? maxProtein, int? minCarbs, int? maxCarbs, int? minFat, int? maxFat)
         {
@@ -37,5 +30,4 @@
                 return NotFound();
             }
-
             var restaurant = await _context.Restaurants.Include(r => r.RestaurantMeals)
                 .FirstOrDefaultAsync(m => m.Id == id);
@@ -44,7 +36,4 @@
                 return NotFound();
             }
-
-
-
             var filteredMeals = restaurant.RestaurantMeals
         .Where(r =>
@@ -52,5 +41,4 @@
             (maxCalories == null || r.Calories <= maxCalories) &&
             (minProtein == null || r.Protein >= minProtein) &&
-            
             (maxProtein == null || r.Protein <= maxProtein) &&
             (minFat == null || r.Fat >= minFat) &&
@@ -60,13 +48,161 @@
         )
         .ToList();
-
             Console.WriteLine($"Total meals for restaurant {id}: {filteredMeals.Count}");
-
-
             return PartialView("_RestaurantMealsPartial", filteredMeals);
         }
-
-        
-        
+        public async Task ClassifyAllRestaurantMeals()
+        {
+            var meals = await GetUnclassifiedMealsFromDatabase();
+            foreach (var meal in meals)
+            {
+                var mealTypes = GenerateMealTypes(meal);
+                await UpdateMealTypesInDatabase(meal.Id, mealTypes);
+            }
+        }
+        private MealKeywords LoadKeywordsFromJson()
+        {
+            var filePath = "Data/meal_keywords.json";
+            if (!System.IO.File.Exists(filePath))
+            {
+                return new MealKeywords 
+                { 
+                    Breakfast = new List<string>(), 
+                    Main = new List<string>(), 
+                    Snack = new List<string>() 
+                };
+            }
+            var jsonString = System.IO.File.ReadAllText(filePath);
+            var options = new JsonSerializerOptions
+            {
+                PropertyNameCaseInsensitive = true
+            };
+            return JsonSerializer.Deserialize<MealKeywords>(jsonString, options) ?? new MealKeywords 
+            { 
+                Breakfast = new List<string>(), 
+                Main = new List<string>(), 
+                Snack = new List<string>() 
+            };
+        }
+    public List<string> GenerateMealTypes(RestaurantMeal meal)
+    {
+        if (meal.Calories == 0 || 
+            (!string.IsNullOrEmpty(meal.ItemDescription) && 
+             (meal.ItemDescription.ToLower().Contains("wine") || 
+              meal.ItemDescription.ToLower().Contains("beer") || 
+              meal.ItemDescription.ToLower().Contains("spirits") ||   
+              meal.ItemDescription.ToLower().Contains("beverages")
+              )))
+        {
+            return new List<string> { "drink" };
+        }
+        var keywords = LoadKeywordsFromJson();
+        var tags = new HashSet<string>();
+        string NormalizeWord(string word)
+        {
+            word = word.ToLower().Trim();
+            if (word.EndsWith("ies") && word.Length > 4)
+                return word.Substring(0, word.Length - 3) + "y";
+            if (word.EndsWith("es") && word.Length > 3)
+                return word.Substring(0, word.Length - 2);
+            if (word.EndsWith("s") && word.Length > 3 && !word.EndsWith("ss"))
+                return word.Substring(0, word.Length - 1);
+            return word;
+        }
+        int CountKeywordMatches(IEnumerable<string> words, HashSet<string> keywords, bool isTitle = false)
+        {
+            int count = 0;
+            foreach (var word in words)
+            {
+                bool matches = keywords.Contains(word) || keywords.Contains(NormalizeWord(word));
+                if (matches)
+                    count += isTitle ? 3 : 1;
+            }
+            return count;
+        }
+        var breakfastKeywords = new HashSet<string>(keywords.Breakfast ?? new List<string>(), StringComparer.OrdinalIgnoreCase);
+        var mainKeywords = new HashSet<string>(keywords.Main ?? new List<string>(), StringComparer.OrdinalIgnoreCase);
+        var snackKeywords = new HashSet<string>(keywords.Snack ?? new List<string>(), StringComparer.OrdinalIgnoreCase);
+        var titleWords = meal.ItemName.ToLower()
+            .Split(new char[] { ' ', '-', '_', ',', '.', '(', ')' }, StringSplitOptions.RemoveEmptyEntries);
+        var descriptionWords = new HashSet<string>();
+        if (!string.IsNullOrEmpty(meal.ItemDescription))
+        {
+            var words = meal.ItemDescription.ToLower()
+                .Split(new char[] { ' ', '-', '_', ',', '.', '(', ')', ';', ':' }, StringSplitOptions.RemoveEmptyEntries);
+            foreach (var w in words) descriptionWords.Add(w);
+        }
+        var allWords = titleWords.Concat(descriptionWords).ToList();
+        int breakfastScore = CountKeywordMatches(titleWords, breakfastKeywords, true) +
+                            CountKeywordMatches(descriptionWords, breakfastKeywords, false);
+        int mainScore = CountKeywordMatches(titleWords, mainKeywords, true) +
+                        CountKeywordMatches(descriptionWords, mainKeywords, false);
+        int snackScore = CountKeywordMatches(titleWords, snackKeywords, true) +
+                        CountKeywordMatches(descriptionWords, snackKeywords, false);
+        int lunchScore = mainScore;
+        int dinnerScore = mainScore;
+            float calories = meal.Calories;
+            float proteinRatio = (meal.Protein * 4) / calories * 100;
+            float carbRatio = (meal.Carbs * 4) / calories * 100;
+            float fatRatio = (meal.Fat * 9) / calories * 100;
+            if (calories < 250)
+            {
+                snackScore += 2;
+                breakfastScore += 1;
+                dinnerScore -= 2;
+                lunchScore -= 2;
+            }
+            else if (calories <= 500)
+            {
+                lunchScore += 1;
+                dinnerScore += 1;
+                breakfastScore += 2;
+            }
+            else
+            {
+                dinnerScore += 2;
+                lunchScore += 2;
+                breakfastScore -= 1;
+                snackScore -= 2;
+            }
+            if (proteinRatio >= 25)
+            {
+                dinnerScore += 2;
+                lunchScore += 2;
+            }
+            else if (carbRatio >= 50)
+            {
+                breakfastScore += 1;
+                snackScore += 1;
+            }
+            if (fatRatio > 30)
+            {
+                dinnerScore += 1;
+                snackScore += 1;
+            }
+        var results = new List<(string tag, int score)>
+        {
+            ("breakfast", breakfastScore),
+            ("lunch", lunchScore),
+            ("dinner", dinnerScore),
+            ("snack", snackScore)
+        }.OrderByDescending(x => x.score).ToList();
+        tags.Add(results[0].tag);
+        for (int i = 1; i < results.Count; i++)
+        {
+            if (results[i].score > 0 && results[i].score >= results[0].score * 0.6)
+                tags.Add(results[i].tag);
+        }
+        return tags.ToList();
+    }
+    private async Task<List<RestaurantMeal>> GetUnclassifiedMealsFromDatabase()
+    {
+        return await _context.RestaurantMeals.ToListAsync();
+    }
+    private async Task UpdateMealTypesInDatabase(int mealId, List<string> mealTypes)
+    {
+        var meal = await _context.RestaurantMeals.FindAsync(mealId);
+        meal.Type = mealTypes;
+        await _context.SaveChangesAsync();
+    }
     }
 }
Index: NutriMatch/Data/AppDbContext.cs
===================================================================
--- NutriMatch/Data/AppDbContext.cs	(revision 4a68273d2173d196bea803f19c4d87863b81f215)
+++ NutriMatch/Data/AppDbContext.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -23,4 +23,6 @@
 
         public DbSet<RecipeRating> RecipeRatings { get; set; }
+        public DbSet<WeeklyMealPlan> WeeklyMealPlans { get; set; }
+        public DbSet<MealSlot> MealSlots { get; set; }
 
         protected override void OnModelCreating(ModelBuilder modelBuilder)
Index: NutriMatch/Data/meal_keywords.json
===================================================================
--- NutriMatch/Data/meal_keywords.json	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Data/meal_keywords.json	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,67 @@
+{
+  "breakfast": [
+    "oatmeal", "pancake", "scramble", "smoothie", "toast",
+    "cereal", "granola", "yogurt", "bagel", "croissant", "waffle", "french toast",
+    "eggs", "omelet", "omelette", "frittata", "hash brown", "bacon", "sausage", "ham",
+    "breakfast", "sandwich", "muffin", "biscuit", "scone",
+    "porridge", "grits", "bowl", "acai", "chia", "oats",
+    "danish", "donut", "pastry", "fruit" , "salad", "melon", "berries",
+    "banana", "apple", "granola bar", "protein shake", "quinoa", "avocado", "toast", 
+    "crepes",  "quiche", "wrap",
+    "oats", "breakfast cereal", "corn flakes", "cheerios",
+    "smoothie", "pancakes"
+  ],
+"main": [
+    "sandwich", "burger", "wrap", "salad", "soup",
+    "grilled", "panini", "sub", "hoagie",
+    "blt", "turkey", "ham", "tuna", "chicken",
+    "cheeseburger", "hamburger", "slider",
+    "tortilla", "pasta", "potato", "coleslaw", "spinach",
+    "tomato", "vegetable", "minestrone", "clam",
+    "broth", "ramen", "noodle",
+    "quesadilla", "taco", "burrito", "bowl", "enchilada",
+    "sushi", "sashimi", "rice", "stir fry",
+    "mac and cheese", "lasagna", "spaghetti", "fettuccine", "ravioli",
+    "pizza slice", "calzone", "flatbread", "focaccia", "breadstick",
+    "fish", "chips", "nuggets", "tenders", "wings", "drumsticks",
+    "meat", "antipasto", "charcuterie", "plate",
+    "casserole", "shepherd's", "pie", "meatloaf", "leftovers", "curry",
+    "steak", "roast", "ribeye", "sirloin", "filet", "mignon", "t-bone",
+    "porterhouse", "strip", "beef", "rib", "brisket", "stew",
+    "linguine", "penne", "rigatoni", "alfredo", "carbonara",
+    "bolognese", "marinara", "pesto", "manicotti", "shells",
+    "margherita", "pepperoni", "bbq",
+    "tikka masala", "vindaloo", "korma", "pad thai",
+    "pork", "lamb", "duck", "fried",
+    "salmon", "cod", "halibut", "mahi", "bass", "sea", "seafood",
+    "shrimp", "lobster", "crab", "scallops", "mussels", "clams", "oyster",
+    "chop", "tenderloin", "bacon", "pulled", "ribs",
+    "leg", "gyros", "kebab",
+    "meatballs", "fajitas", "mein",
+    "risotto", "paella", "jambalaya", "gumbo", "chili", "stuffed peppers",
+    "eggplant", "ratatouille", "roasted",
+    "mashed", "baked", "quinoa", "couscous",
+    "shawarma", "falafel", "poutine", "pho", "dumpling", "spring roll",
+    "gnocchi", "beef stew", "teriyaki", "shish", "biryani",
+    "goulash", "cevapi", "moussaka"
+],
+  "snack": [
+    "chips", "crackers", "pretzels", "popcorn", "nuts", "trail mix", "granola bar",
+    "fruit", "apple", "banana", "bites",
+    "hummus", "guacamole", "salsa","dip",
+    "slices","grapes", "berries", "strawberries", "blueberries",
+    "raspberries", "blackberries", "melon", "watermelon", "cantaloupe", "pineapple",
+    "dried", "raisins", "apricots", "dates", "snacks",
+    "cookies", "biscotti", "shortbread","cookies", 
+    "truffles",
+    "chocolate","fudge",
+    "ice cream", "popsicle", "sorbet", "gelato", "milkshake",
+    "yogurt", "yoghurt", "pudding", "jello", "custard", "mousse",
+    "platter", "string cheese", "cubes", "cream", "spread",
+    "pickles", "olives", "jerky",
+    "smoothie", "protein shake", "juice", "vegetable",
+    "muesli", "overnight", "oats",
+    "sticks", "carrots", "celery", "cucumber", "cherry", "tomatoes", "peppers",
+    "peas", "broccoli", "florets", "cauliflower", "radish"
+]
+}   
Index: NutriMatch/Migrations/20250808152305_RecipeStatusAdminMessage.Designer.cs
===================================================================
--- NutriMatch/Migrations/20250808152305_RecipeStatusAdminMessage.Designer.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Migrations/20250808152305_RecipeStatusAdminMessage.Designer.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,443 @@
+﻿// <auto-generated />
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using NutriMatch.Data;
+#nullable disable
+namespace NutriMatch.Migrations
+{
+    [DbContext(typeof(AppDbContext))]
+    [Migration("20250808152305_RecipeStatusAdminMessage")]
+    partial class RecipeStatusAdminMessage
+    {
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "9.0.7")
+                .HasAnnotation("Relational:MaxIdentifierLength", 63);
+            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
+                {
+                    b.Property<string>("Id")
+                        .HasColumnType("text");
+                    b.Property<string>("ConcurrencyStamp")
+                        .IsConcurrencyToken()
+                        .HasColumnType("text");
+                    b.Property<string>("Name")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<string>("NormalizedName")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.HasKey("Id");
+                    b.HasIndex("NormalizedName")
+                        .IsUnique()
+                        .HasDatabaseName("RoleNameIndex");
+                    b.ToTable("AspNetRoles", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("ClaimType")
+                        .HasColumnType("text");
+                    b.Property<string>("ClaimValue")
+                        .HasColumnType("text");
+                    b.Property<string>("RoleId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("RoleId");
+                    b.ToTable("AspNetRoleClaims", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("ClaimType")
+                        .HasColumnType("text");
+                    b.Property<string>("ClaimValue")
+                        .HasColumnType("text");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("UserId");
+                    b.ToTable("AspNetUserClaims", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
+                {
+                    b.Property<string>("LoginProvider")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("ProviderKey")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("ProviderDisplayName")
+                        .HasColumnType("text");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("LoginProvider", "ProviderKey");
+                    b.HasIndex("UserId");
+                    b.ToTable("AspNetUserLogins", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
+                {
+                    b.Property<string>("UserId")
+                        .HasColumnType("text");
+                    b.Property<string>("RoleId")
+                        .HasColumnType("text");
+                    b.HasKey("UserId", "RoleId");
+                    b.HasIndex("RoleId");
+                    b.ToTable("AspNetUserRoles", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
+                {
+                    b.Property<string>("UserId")
+                        .HasColumnType("text");
+                    b.Property<string>("LoginProvider")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("Name")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("Value")
+                        .HasColumnType("text");
+                    b.HasKey("UserId", "LoginProvider", "Name");
+                    b.ToTable("AspNetUserTokens", (string)null);
+                });
+            modelBuilder.Entity("NutriMatch.Models.FavoriteRecipe", b =>
+                {
+                    b.Property<string>("UserId")
+                        .HasColumnType("text");
+                    b.Property<int>("RecipeId")
+                        .HasColumnType("integer");
+                    b.HasKey("UserId", "RecipeId");
+                    b.HasIndex("RecipeId");
+                    b.ToTable("FavoriteRecipes");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Ingredient", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<float>("Calories")
+                        .HasColumnType("real");
+                    b.Property<float>("Carbs")
+                        .HasColumnType("real");
+                    b.Property<float>("Fat")
+                        .HasColumnType("real");
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Protein")
+                        .HasColumnType("real");
+                    b.HasKey("Id");
+                    b.ToTable("Ingredients");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("AdminComment")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Calories")
+                        .HasColumnType("real");
+                    b.Property<float>("Carbs")
+                        .HasColumnType("real");
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("timestamp with time zone");
+                    b.Property<float>("Fat")
+                        .HasColumnType("real");
+                    b.Property<string>("ImageUrl")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.PrimitiveCollection<string[]>("Instructions")
+                        .HasColumnType("text[]");
+                    b.Property<float>("Protein")
+                        .HasColumnType("real");
+                    b.Property<string>("RecipeStatus")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("UserId");
+                    b.ToTable("Recipes");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeIngredient", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<int>("IngredientId")
+                        .HasColumnType("integer");
+                    b.Property<float>("Quantity")
+                        .HasColumnType("real");
+                    b.Property<int>("RecipeId")
+                        .HasColumnType("integer");
+                    b.Property<string>("Unit")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("IngredientId");
+                    b.HasIndex("RecipeId");
+                    b.ToTable("RecipeIngredients");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeRating", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<double>("Rating")
+                        .HasColumnType("double precision");
+                    b.Property<int>("RecipeId")
+                        .HasColumnType("integer");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("RecipeId");
+                    b.HasIndex("UserId", "RecipeId")
+                        .IsUnique();
+                    b.ToTable("RecipeRatings");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Restaurant", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("Description")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("ImageUrl")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.ToTable("Restaurants");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RestaurantMeal", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<float>("Calories")
+                        .HasColumnType("real");
+                    b.Property<float>("Carbs")
+                        .HasColumnType("real");
+                    b.Property<float>("Fat")
+                        .HasColumnType("real");
+                    b.Property<string>("ItemDescription")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("ItemName")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Protein")
+                        .HasColumnType("real");
+                    b.Property<int?>("RestaurantId")
+                        .HasColumnType("integer");
+                    b.Property<string>("RestaurantName")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("RestaurantId");
+                    b.ToTable("RestaurantMeals");
+                });
+            modelBuilder.Entity("NutriMatch.Models.User", b =>
+                {
+                    b.Property<string>("Id")
+                        .HasColumnType("text");
+                    b.Property<int>("AccessFailedCount")
+                        .HasColumnType("integer");
+                    b.Property<string>("ConcurrencyStamp")
+                        .IsConcurrencyToken()
+                        .HasColumnType("text");
+                    b.Property<string>("Email")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<bool>("EmailConfirmed")
+                        .HasColumnType("boolean");
+                    b.Property<bool>("LockoutEnabled")
+                        .HasColumnType("boolean");
+                    b.Property<DateTimeOffset?>("LockoutEnd")
+                        .HasColumnType("timestamp with time zone");
+                    b.Property<string>("NormalizedEmail")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<string>("NormalizedUserName")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<string>("PasswordHash")
+                        .HasColumnType("text");
+                    b.Property<string>("PhoneNumber")
+                        .HasColumnType("text");
+                    b.Property<bool>("PhoneNumberConfirmed")
+                        .HasColumnType("boolean");
+                    b.Property<string>("ProfilePictureUrl")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("SecurityStamp")
+                        .HasColumnType("text");
+                    b.Property<bool>("TwoFactorEnabled")
+                        .HasColumnType("boolean");
+                    b.Property<string>("UserName")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.HasKey("Id");
+                    b.HasIndex("NormalizedEmail")
+                        .HasDatabaseName("EmailIndex");
+                    b.HasIndex("NormalizedUserName")
+                        .IsUnique()
+                        .HasDatabaseName("UserNameIndex");
+                    b.ToTable("AspNetUsers", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
+                {
+                    b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
+                        .WithMany()
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
+                {
+                    b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
+                        .WithMany()
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("NutriMatch.Models.FavoriteRecipe", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Recipe", "Recipe")
+                        .WithMany("FavoritedBy")
+                        .HasForeignKey("RecipeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.User", "User")
+                        .WithMany("FavoriteRecipes")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("Recipe");
+                    b.Navigation("User");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", "User")
+                        .WithMany("Recipes")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("User");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeIngredient", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Ingredient", "Ingredient")
+                        .WithMany()
+                        .HasForeignKey("IngredientId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.Recipe", null)
+                        .WithMany("RecipeIngredients")
+                        .HasForeignKey("RecipeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("Ingredient");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeRating", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Recipe", "Recipe")
+                        .WithMany("Ratings")
+                        .HasForeignKey("RecipeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.User", "User")
+                        .WithMany("Ratings")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("Recipe");
+                    b.Navigation("User");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RestaurantMeal", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Restaurant", "Restaurant")
+                        .WithMany("RestaurantMeals")
+                        .HasForeignKey("RestaurantId");
+                    b.Navigation("Restaurant");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
+                {
+                    b.Navigation("FavoritedBy");
+                    b.Navigation("Ratings");
+                    b.Navigation("RecipeIngredients");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Restaurant", b =>
+                {
+                    b.Navigation("RestaurantMeals");
+                });
+            modelBuilder.Entity("NutriMatch.Models.User", b =>
+                {
+                    b.Navigation("FavoriteRecipes");
+                    b.Navigation("Ratings");
+                    b.Navigation("Recipes");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
Index: NutriMatch/Migrations/20250808152305_RecipeStatusAdminMessage.cs
===================================================================
--- NutriMatch/Migrations/20250808152305_RecipeStatusAdminMessage.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Migrations/20250808152305_RecipeStatusAdminMessage.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,41 @@
+﻿using Microsoft.EntityFrameworkCore.Migrations;
+#nullable disable
+namespace NutriMatch.Migrations
+{
+    public partial class RecipeStatusAdminMessage : Migration
+    {
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropColumn(
+                name: "IsApproved",
+                table: "Recipes");
+            migrationBuilder.AddColumn<string>(
+                name: "AdminComment",
+                table: "Recipes",
+                type: "text",
+                nullable: false,
+                defaultValue: "");
+            migrationBuilder.AddColumn<string>(
+                name: "RecipeStatus",
+                table: "Recipes",
+                type: "text",
+                nullable: false,
+                defaultValue: "");
+        }
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropColumn(
+                name: "AdminComment",
+                table: "Recipes");
+            migrationBuilder.DropColumn(
+                name: "RecipeStatus",
+                table: "Recipes");
+            migrationBuilder.AddColumn<bool>(
+                name: "IsApproved",
+                table: "Recipes",
+                type: "boolean",
+                nullable: false,
+                defaultValue: false);
+        }
+    }
+}
Index: NutriMatch/Migrations/20250810011611_RecipeDeclineNoteAdded.Designer.cs
===================================================================
--- NutriMatch/Migrations/20250810011611_RecipeDeclineNoteAdded.Designer.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Migrations/20250810011611_RecipeDeclineNoteAdded.Designer.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,446 @@
+﻿// <auto-generated />
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using NutriMatch.Data;
+#nullable disable
+namespace NutriMatch.Migrations
+{
+    [DbContext(typeof(AppDbContext))]
+    [Migration("20250810011611_RecipeDeclineNoteAdded")]
+    partial class RecipeDeclineNoteAdded
+    {
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "9.0.7")
+                .HasAnnotation("Relational:MaxIdentifierLength", 63);
+            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
+                {
+                    b.Property<string>("Id")
+                        .HasColumnType("text");
+                    b.Property<string>("ConcurrencyStamp")
+                        .IsConcurrencyToken()
+                        .HasColumnType("text");
+                    b.Property<string>("Name")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<string>("NormalizedName")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.HasKey("Id");
+                    b.HasIndex("NormalizedName")
+                        .IsUnique()
+                        .HasDatabaseName("RoleNameIndex");
+                    b.ToTable("AspNetRoles", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("ClaimType")
+                        .HasColumnType("text");
+                    b.Property<string>("ClaimValue")
+                        .HasColumnType("text");
+                    b.Property<string>("RoleId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("RoleId");
+                    b.ToTable("AspNetRoleClaims", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("ClaimType")
+                        .HasColumnType("text");
+                    b.Property<string>("ClaimValue")
+                        .HasColumnType("text");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("UserId");
+                    b.ToTable("AspNetUserClaims", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
+                {
+                    b.Property<string>("LoginProvider")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("ProviderKey")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("ProviderDisplayName")
+                        .HasColumnType("text");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("LoginProvider", "ProviderKey");
+                    b.HasIndex("UserId");
+                    b.ToTable("AspNetUserLogins", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
+                {
+                    b.Property<string>("UserId")
+                        .HasColumnType("text");
+                    b.Property<string>("RoleId")
+                        .HasColumnType("text");
+                    b.HasKey("UserId", "RoleId");
+                    b.HasIndex("RoleId");
+                    b.ToTable("AspNetUserRoles", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
+                {
+                    b.Property<string>("UserId")
+                        .HasColumnType("text");
+                    b.Property<string>("LoginProvider")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("Name")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("Value")
+                        .HasColumnType("text");
+                    b.HasKey("UserId", "LoginProvider", "Name");
+                    b.ToTable("AspNetUserTokens", (string)null);
+                });
+            modelBuilder.Entity("NutriMatch.Models.FavoriteRecipe", b =>
+                {
+                    b.Property<string>("UserId")
+                        .HasColumnType("text");
+                    b.Property<int>("RecipeId")
+                        .HasColumnType("integer");
+                    b.HasKey("UserId", "RecipeId");
+                    b.HasIndex("RecipeId");
+                    b.ToTable("FavoriteRecipes");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Ingredient", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<float>("Calories")
+                        .HasColumnType("real");
+                    b.Property<float>("Carbs")
+                        .HasColumnType("real");
+                    b.Property<float>("Fat")
+                        .HasColumnType("real");
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Protein")
+                        .HasColumnType("real");
+                    b.HasKey("Id");
+                    b.ToTable("Ingredients");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("AdminComment")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Calories")
+                        .HasColumnType("real");
+                    b.Property<float>("Carbs")
+                        .HasColumnType("real");
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("timestamp with time zone");
+                    b.Property<string>("DeclineReason")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Fat")
+                        .HasColumnType("real");
+                    b.Property<string>("ImageUrl")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.PrimitiveCollection<string[]>("Instructions")
+                        .HasColumnType("text[]");
+                    b.Property<float>("Protein")
+                        .HasColumnType("real");
+                    b.Property<string>("RecipeStatus")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("UserId");
+                    b.ToTable("Recipes");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeIngredient", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<int>("IngredientId")
+                        .HasColumnType("integer");
+                    b.Property<float>("Quantity")
+                        .HasColumnType("real");
+                    b.Property<int>("RecipeId")
+                        .HasColumnType("integer");
+                    b.Property<string>("Unit")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("IngredientId");
+                    b.HasIndex("RecipeId");
+                    b.ToTable("RecipeIngredients");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeRating", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<double>("Rating")
+                        .HasColumnType("double precision");
+                    b.Property<int>("RecipeId")
+                        .HasColumnType("integer");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("RecipeId");
+                    b.HasIndex("UserId", "RecipeId")
+                        .IsUnique();
+                    b.ToTable("RecipeRatings");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Restaurant", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("Description")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("ImageUrl")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.ToTable("Restaurants");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RestaurantMeal", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<float>("Calories")
+                        .HasColumnType("real");
+                    b.Property<float>("Carbs")
+                        .HasColumnType("real");
+                    b.Property<float>("Fat")
+                        .HasColumnType("real");
+                    b.Property<string>("ItemDescription")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("ItemName")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Protein")
+                        .HasColumnType("real");
+                    b.Property<int?>("RestaurantId")
+                        .HasColumnType("integer");
+                    b.Property<string>("RestaurantName")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("RestaurantId");
+                    b.ToTable("RestaurantMeals");
+                });
+            modelBuilder.Entity("NutriMatch.Models.User", b =>
+                {
+                    b.Property<string>("Id")
+                        .HasColumnType("text");
+                    b.Property<int>("AccessFailedCount")
+                        .HasColumnType("integer");
+                    b.Property<string>("ConcurrencyStamp")
+                        .IsConcurrencyToken()
+                        .HasColumnType("text");
+                    b.Property<string>("Email")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<bool>("EmailConfirmed")
+                        .HasColumnType("boolean");
+                    b.Property<bool>("LockoutEnabled")
+                        .HasColumnType("boolean");
+                    b.Property<DateTimeOffset?>("LockoutEnd")
+                        .HasColumnType("timestamp with time zone");
+                    b.Property<string>("NormalizedEmail")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<string>("NormalizedUserName")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<string>("PasswordHash")
+                        .HasColumnType("text");
+                    b.Property<string>("PhoneNumber")
+                        .HasColumnType("text");
+                    b.Property<bool>("PhoneNumberConfirmed")
+                        .HasColumnType("boolean");
+                    b.Property<string>("ProfilePictureUrl")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("SecurityStamp")
+                        .HasColumnType("text");
+                    b.Property<bool>("TwoFactorEnabled")
+                        .HasColumnType("boolean");
+                    b.Property<string>("UserName")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.HasKey("Id");
+                    b.HasIndex("NormalizedEmail")
+                        .HasDatabaseName("EmailIndex");
+                    b.HasIndex("NormalizedUserName")
+                        .IsUnique()
+                        .HasDatabaseName("UserNameIndex");
+                    b.ToTable("AspNetUsers", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
+                {
+                    b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
+                        .WithMany()
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
+                {
+                    b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
+                        .WithMany()
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("NutriMatch.Models.FavoriteRecipe", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Recipe", "Recipe")
+                        .WithMany("FavoritedBy")
+                        .HasForeignKey("RecipeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.User", "User")
+                        .WithMany("FavoriteRecipes")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("Recipe");
+                    b.Navigation("User");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", "User")
+                        .WithMany("Recipes")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("User");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeIngredient", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Ingredient", "Ingredient")
+                        .WithMany()
+                        .HasForeignKey("IngredientId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.Recipe", null)
+                        .WithMany("RecipeIngredients")
+                        .HasForeignKey("RecipeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("Ingredient");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeRating", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Recipe", "Recipe")
+                        .WithMany("Ratings")
+                        .HasForeignKey("RecipeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.User", "User")
+                        .WithMany("Ratings")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("Recipe");
+                    b.Navigation("User");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RestaurantMeal", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Restaurant", "Restaurant")
+                        .WithMany("RestaurantMeals")
+                        .HasForeignKey("RestaurantId");
+                    b.Navigation("Restaurant");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
+                {
+                    b.Navigation("FavoritedBy");
+                    b.Navigation("Ratings");
+                    b.Navigation("RecipeIngredients");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Restaurant", b =>
+                {
+                    b.Navigation("RestaurantMeals");
+                });
+            modelBuilder.Entity("NutriMatch.Models.User", b =>
+                {
+                    b.Navigation("FavoriteRecipes");
+                    b.Navigation("Ratings");
+                    b.Navigation("Recipes");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
Index: NutriMatch/Migrations/20250810011611_RecipeDeclineNoteAdded.cs
===================================================================
--- NutriMatch/Migrations/20250810011611_RecipeDeclineNoteAdded.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Migrations/20250810011611_RecipeDeclineNoteAdded.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,23 @@
+﻿using Microsoft.EntityFrameworkCore.Migrations;
+#nullable disable
+namespace NutriMatch.Migrations
+{
+    public partial class RecipeDeclineNoteAdded : Migration
+    {
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.AddColumn<string>(
+                name: "DeclineReason",
+                table: "Recipes",
+                type: "text",
+                nullable: false,
+                defaultValue: "");
+        }
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropColumn(
+                name: "DeclineReason",
+                table: "Recipes");
+        }
+    }
+}
Index: NutriMatch/Migrations/20250812123601_AddFoodType.Designer.cs
===================================================================
--- NutriMatch/Migrations/20250812123601_AddFoodType.Designer.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Migrations/20250812123601_AddFoodType.Designer.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,450 @@
+﻿// <auto-generated />
+using System;
+using System.Collections.Generic;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using NutriMatch.Data;
+#nullable disable
+namespace NutriMatch.Migrations
+{
+    [DbContext(typeof(AppDbContext))]
+    [Migration("20250812123601_AddFoodType")]
+    partial class AddFoodType
+    {
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "9.0.7")
+                .HasAnnotation("Relational:MaxIdentifierLength", 63);
+            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
+                {
+                    b.Property<string>("Id")
+                        .HasColumnType("text");
+                    b.Property<string>("ConcurrencyStamp")
+                        .IsConcurrencyToken()
+                        .HasColumnType("text");
+                    b.Property<string>("Name")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<string>("NormalizedName")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.HasKey("Id");
+                    b.HasIndex("NormalizedName")
+                        .IsUnique()
+                        .HasDatabaseName("RoleNameIndex");
+                    b.ToTable("AspNetRoles", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("ClaimType")
+                        .HasColumnType("text");
+                    b.Property<string>("ClaimValue")
+                        .HasColumnType("text");
+                    b.Property<string>("RoleId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("RoleId");
+                    b.ToTable("AspNetRoleClaims", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("ClaimType")
+                        .HasColumnType("text");
+                    b.Property<string>("ClaimValue")
+                        .HasColumnType("text");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("UserId");
+                    b.ToTable("AspNetUserClaims", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
+                {
+                    b.Property<string>("LoginProvider")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("ProviderKey")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("ProviderDisplayName")
+                        .HasColumnType("text");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("LoginProvider", "ProviderKey");
+                    b.HasIndex("UserId");
+                    b.ToTable("AspNetUserLogins", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
+                {
+                    b.Property<string>("UserId")
+                        .HasColumnType("text");
+                    b.Property<string>("RoleId")
+                        .HasColumnType("text");
+                    b.HasKey("UserId", "RoleId");
+                    b.HasIndex("RoleId");
+                    b.ToTable("AspNetUserRoles", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
+                {
+                    b.Property<string>("UserId")
+                        .HasColumnType("text");
+                    b.Property<string>("LoginProvider")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("Name")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("Value")
+                        .HasColumnType("text");
+                    b.HasKey("UserId", "LoginProvider", "Name");
+                    b.ToTable("AspNetUserTokens", (string)null);
+                });
+            modelBuilder.Entity("NutriMatch.Models.FavoriteRecipe", b =>
+                {
+                    b.Property<string>("UserId")
+                        .HasColumnType("text");
+                    b.Property<int>("RecipeId")
+                        .HasColumnType("integer");
+                    b.HasKey("UserId", "RecipeId");
+                    b.HasIndex("RecipeId");
+                    b.ToTable("FavoriteRecipes");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Ingredient", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<float>("Calories")
+                        .HasColumnType("real");
+                    b.Property<float>("Carbs")
+                        .HasColumnType("real");
+                    b.Property<float>("Fat")
+                        .HasColumnType("real");
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Protein")
+                        .HasColumnType("real");
+                    b.HasKey("Id");
+                    b.ToTable("Ingredients");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("AdminComment")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Calories")
+                        .HasColumnType("real");
+                    b.Property<float>("Carbs")
+                        .HasColumnType("real");
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("timestamp with time zone");
+                    b.Property<string>("DeclineReason")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Fat")
+                        .HasColumnType("real");
+                    b.Property<string>("ImageUrl")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.PrimitiveCollection<string[]>("Instructions")
+                        .HasColumnType("text[]");
+                    b.Property<float>("Protein")
+                        .HasColumnType("real");
+                    b.Property<string>("RecipeStatus")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.PrimitiveCollection<List<string>>("Type")
+                        .IsRequired()
+                        .HasColumnType("text[]");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("UserId");
+                    b.ToTable("Recipes");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeIngredient", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<int>("IngredientId")
+                        .HasColumnType("integer");
+                    b.Property<float>("Quantity")
+                        .HasColumnType("real");
+                    b.Property<int>("RecipeId")
+                        .HasColumnType("integer");
+                    b.Property<string>("Unit")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("IngredientId");
+                    b.HasIndex("RecipeId");
+                    b.ToTable("RecipeIngredients");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeRating", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<double>("Rating")
+                        .HasColumnType("double precision");
+                    b.Property<int>("RecipeId")
+                        .HasColumnType("integer");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("RecipeId");
+                    b.HasIndex("UserId", "RecipeId")
+                        .IsUnique();
+                    b.ToTable("RecipeRatings");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Restaurant", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("Description")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("ImageUrl")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.ToTable("Restaurants");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RestaurantMeal", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<float>("Calories")
+                        .HasColumnType("real");
+                    b.Property<float>("Carbs")
+                        .HasColumnType("real");
+                    b.Property<float>("Fat")
+                        .HasColumnType("real");
+                    b.Property<string>("ItemDescription")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("ItemName")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Protein")
+                        .HasColumnType("real");
+                    b.Property<int?>("RestaurantId")
+                        .HasColumnType("integer");
+                    b.Property<string>("RestaurantName")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("RestaurantId");
+                    b.ToTable("RestaurantMeals");
+                });
+            modelBuilder.Entity("NutriMatch.Models.User", b =>
+                {
+                    b.Property<string>("Id")
+                        .HasColumnType("text");
+                    b.Property<int>("AccessFailedCount")
+                        .HasColumnType("integer");
+                    b.Property<string>("ConcurrencyStamp")
+                        .IsConcurrencyToken()
+                        .HasColumnType("text");
+                    b.Property<string>("Email")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<bool>("EmailConfirmed")
+                        .HasColumnType("boolean");
+                    b.Property<bool>("LockoutEnabled")
+                        .HasColumnType("boolean");
+                    b.Property<DateTimeOffset?>("LockoutEnd")
+                        .HasColumnType("timestamp with time zone");
+                    b.Property<string>("NormalizedEmail")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<string>("NormalizedUserName")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<string>("PasswordHash")
+                        .HasColumnType("text");
+                    b.Property<string>("PhoneNumber")
+                        .HasColumnType("text");
+                    b.Property<bool>("PhoneNumberConfirmed")
+                        .HasColumnType("boolean");
+                    b.Property<string>("ProfilePictureUrl")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("SecurityStamp")
+                        .HasColumnType("text");
+                    b.Property<bool>("TwoFactorEnabled")
+                        .HasColumnType("boolean");
+                    b.Property<string>("UserName")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.HasKey("Id");
+                    b.HasIndex("NormalizedEmail")
+                        .HasDatabaseName("EmailIndex");
+                    b.HasIndex("NormalizedUserName")
+                        .IsUnique()
+                        .HasDatabaseName("UserNameIndex");
+                    b.ToTable("AspNetUsers", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
+                {
+                    b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
+                        .WithMany()
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
+                {
+                    b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
+                        .WithMany()
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("NutriMatch.Models.FavoriteRecipe", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Recipe", "Recipe")
+                        .WithMany("FavoritedBy")
+                        .HasForeignKey("RecipeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.User", "User")
+                        .WithMany("FavoriteRecipes")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("Recipe");
+                    b.Navigation("User");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", "User")
+                        .WithMany("Recipes")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("User");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeIngredient", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Ingredient", "Ingredient")
+                        .WithMany()
+                        .HasForeignKey("IngredientId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.Recipe", null)
+                        .WithMany("RecipeIngredients")
+                        .HasForeignKey("RecipeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("Ingredient");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeRating", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Recipe", "Recipe")
+                        .WithMany("Ratings")
+                        .HasForeignKey("RecipeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.User", "User")
+                        .WithMany("Ratings")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("Recipe");
+                    b.Navigation("User");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RestaurantMeal", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Restaurant", "Restaurant")
+                        .WithMany("RestaurantMeals")
+                        .HasForeignKey("RestaurantId");
+                    b.Navigation("Restaurant");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
+                {
+                    b.Navigation("FavoritedBy");
+                    b.Navigation("Ratings");
+                    b.Navigation("RecipeIngredients");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Restaurant", b =>
+                {
+                    b.Navigation("RestaurantMeals");
+                });
+            modelBuilder.Entity("NutriMatch.Models.User", b =>
+                {
+                    b.Navigation("FavoriteRecipes");
+                    b.Navigation("Ratings");
+                    b.Navigation("Recipes");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
Index: NutriMatch/Migrations/20250812123601_AddFoodType.cs
===================================================================
--- NutriMatch/Migrations/20250812123601_AddFoodType.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Migrations/20250812123601_AddFoodType.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,23 @@
+﻿using System.Collections.Generic;
+using Microsoft.EntityFrameworkCore.Migrations;
+#nullable disable
+namespace NutriMatch.Migrations
+{
+    public partial class AddFoodType : Migration
+    {
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.AddColumn<List<string>>(
+                name: "Type",
+                table: "Recipes",
+                type: "text[]",
+                nullable: false);
+        }
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropColumn(
+                name: "Type",
+                table: "Recipes");
+        }
+    }
+}
Index: NutriMatch/Migrations/20250814155629_AddRestaurantMealType.Designer.cs
===================================================================
--- NutriMatch/Migrations/20250814155629_AddRestaurantMealType.Designer.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Migrations/20250814155629_AddRestaurantMealType.Designer.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,453 @@
+﻿// <auto-generated />
+using System;
+using System.Collections.Generic;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using NutriMatch.Data;
+#nullable disable
+namespace NutriMatch.Migrations
+{
+    [DbContext(typeof(AppDbContext))]
+    [Migration("20250814155629_AddRestaurantMealType")]
+    partial class AddRestaurantMealType
+    {
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "9.0.7")
+                .HasAnnotation("Relational:MaxIdentifierLength", 63);
+            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
+                {
+                    b.Property<string>("Id")
+                        .HasColumnType("text");
+                    b.Property<string>("ConcurrencyStamp")
+                        .IsConcurrencyToken()
+                        .HasColumnType("text");
+                    b.Property<string>("Name")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<string>("NormalizedName")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.HasKey("Id");
+                    b.HasIndex("NormalizedName")
+                        .IsUnique()
+                        .HasDatabaseName("RoleNameIndex");
+                    b.ToTable("AspNetRoles", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("ClaimType")
+                        .HasColumnType("text");
+                    b.Property<string>("ClaimValue")
+                        .HasColumnType("text");
+                    b.Property<string>("RoleId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("RoleId");
+                    b.ToTable("AspNetRoleClaims", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("ClaimType")
+                        .HasColumnType("text");
+                    b.Property<string>("ClaimValue")
+                        .HasColumnType("text");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("UserId");
+                    b.ToTable("AspNetUserClaims", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
+                {
+                    b.Property<string>("LoginProvider")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("ProviderKey")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("ProviderDisplayName")
+                        .HasColumnType("text");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("LoginProvider", "ProviderKey");
+                    b.HasIndex("UserId");
+                    b.ToTable("AspNetUserLogins", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
+                {
+                    b.Property<string>("UserId")
+                        .HasColumnType("text");
+                    b.Property<string>("RoleId")
+                        .HasColumnType("text");
+                    b.HasKey("UserId", "RoleId");
+                    b.HasIndex("RoleId");
+                    b.ToTable("AspNetUserRoles", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
+                {
+                    b.Property<string>("UserId")
+                        .HasColumnType("text");
+                    b.Property<string>("LoginProvider")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("Name")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("Value")
+                        .HasColumnType("text");
+                    b.HasKey("UserId", "LoginProvider", "Name");
+                    b.ToTable("AspNetUserTokens", (string)null);
+                });
+            modelBuilder.Entity("NutriMatch.Models.FavoriteRecipe", b =>
+                {
+                    b.Property<string>("UserId")
+                        .HasColumnType("text");
+                    b.Property<int>("RecipeId")
+                        .HasColumnType("integer");
+                    b.HasKey("UserId", "RecipeId");
+                    b.HasIndex("RecipeId");
+                    b.ToTable("FavoriteRecipes");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Ingredient", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<float>("Calories")
+                        .HasColumnType("real");
+                    b.Property<float>("Carbs")
+                        .HasColumnType("real");
+                    b.Property<float>("Fat")
+                        .HasColumnType("real");
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Protein")
+                        .HasColumnType("real");
+                    b.HasKey("Id");
+                    b.ToTable("Ingredients");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("AdminComment")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Calories")
+                        .HasColumnType("real");
+                    b.Property<float>("Carbs")
+                        .HasColumnType("real");
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("timestamp with time zone");
+                    b.Property<string>("DeclineReason")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Fat")
+                        .HasColumnType("real");
+                    b.Property<string>("ImageUrl")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.PrimitiveCollection<string[]>("Instructions")
+                        .HasColumnType("text[]");
+                    b.Property<float>("Protein")
+                        .HasColumnType("real");
+                    b.Property<string>("RecipeStatus")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.PrimitiveCollection<List<string>>("Type")
+                        .IsRequired()
+                        .HasColumnType("text[]");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("UserId");
+                    b.ToTable("Recipes");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeIngredient", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<int>("IngredientId")
+                        .HasColumnType("integer");
+                    b.Property<float>("Quantity")
+                        .HasColumnType("real");
+                    b.Property<int>("RecipeId")
+                        .HasColumnType("integer");
+                    b.Property<string>("Unit")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("IngredientId");
+                    b.HasIndex("RecipeId");
+                    b.ToTable("RecipeIngredients");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeRating", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<double>("Rating")
+                        .HasColumnType("double precision");
+                    b.Property<int>("RecipeId")
+                        .HasColumnType("integer");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("RecipeId");
+                    b.HasIndex("UserId", "RecipeId")
+                        .IsUnique();
+                    b.ToTable("RecipeRatings");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Restaurant", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("Description")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("ImageUrl")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.ToTable("Restaurants");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RestaurantMeal", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<float>("Calories")
+                        .HasColumnType("real");
+                    b.Property<float>("Carbs")
+                        .HasColumnType("real");
+                    b.Property<float>("Fat")
+                        .HasColumnType("real");
+                    b.Property<string>("ItemDescription")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("ItemName")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Protein")
+                        .HasColumnType("real");
+                    b.Property<int?>("RestaurantId")
+                        .HasColumnType("integer");
+                    b.Property<string>("RestaurantName")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.PrimitiveCollection<List<string>>("Type")
+                        .IsRequired()
+                        .HasColumnType("text[]");
+                    b.HasKey("Id");
+                    b.HasIndex("RestaurantId");
+                    b.ToTable("RestaurantMeals");
+                });
+            modelBuilder.Entity("NutriMatch.Models.User", b =>
+                {
+                    b.Property<string>("Id")
+                        .HasColumnType("text");
+                    b.Property<int>("AccessFailedCount")
+                        .HasColumnType("integer");
+                    b.Property<string>("ConcurrencyStamp")
+                        .IsConcurrencyToken()
+                        .HasColumnType("text");
+                    b.Property<string>("Email")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<bool>("EmailConfirmed")
+                        .HasColumnType("boolean");
+                    b.Property<bool>("LockoutEnabled")
+                        .HasColumnType("boolean");
+                    b.Property<DateTimeOffset?>("LockoutEnd")
+                        .HasColumnType("timestamp with time zone");
+                    b.Property<string>("NormalizedEmail")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<string>("NormalizedUserName")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<string>("PasswordHash")
+                        .HasColumnType("text");
+                    b.Property<string>("PhoneNumber")
+                        .HasColumnType("text");
+                    b.Property<bool>("PhoneNumberConfirmed")
+                        .HasColumnType("boolean");
+                    b.Property<string>("ProfilePictureUrl")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("SecurityStamp")
+                        .HasColumnType("text");
+                    b.Property<bool>("TwoFactorEnabled")
+                        .HasColumnType("boolean");
+                    b.Property<string>("UserName")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.HasKey("Id");
+                    b.HasIndex("NormalizedEmail")
+                        .HasDatabaseName("EmailIndex");
+                    b.HasIndex("NormalizedUserName")
+                        .IsUnique()
+                        .HasDatabaseName("UserNameIndex");
+                    b.ToTable("AspNetUsers", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
+                {
+                    b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
+                        .WithMany()
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
+                {
+                    b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
+                        .WithMany()
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("NutriMatch.Models.FavoriteRecipe", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Recipe", "Recipe")
+                        .WithMany("FavoritedBy")
+                        .HasForeignKey("RecipeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.User", "User")
+                        .WithMany("FavoriteRecipes")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("Recipe");
+                    b.Navigation("User");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", "User")
+                        .WithMany("Recipes")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("User");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeIngredient", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Ingredient", "Ingredient")
+                        .WithMany()
+                        .HasForeignKey("IngredientId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.Recipe", null)
+                        .WithMany("RecipeIngredients")
+                        .HasForeignKey("RecipeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("Ingredient");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeRating", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Recipe", "Recipe")
+                        .WithMany("Ratings")
+                        .HasForeignKey("RecipeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.User", "User")
+                        .WithMany("Ratings")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("Recipe");
+                    b.Navigation("User");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RestaurantMeal", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Restaurant", "Restaurant")
+                        .WithMany("RestaurantMeals")
+                        .HasForeignKey("RestaurantId");
+                    b.Navigation("Restaurant");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
+                {
+                    b.Navigation("FavoritedBy");
+                    b.Navigation("Ratings");
+                    b.Navigation("RecipeIngredients");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Restaurant", b =>
+                {
+                    b.Navigation("RestaurantMeals");
+                });
+            modelBuilder.Entity("NutriMatch.Models.User", b =>
+                {
+                    b.Navigation("FavoriteRecipes");
+                    b.Navigation("Ratings");
+                    b.Navigation("Recipes");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
Index: NutriMatch/Migrations/20250814155629_AddRestaurantMealType.cs
===================================================================
--- NutriMatch/Migrations/20250814155629_AddRestaurantMealType.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Migrations/20250814155629_AddRestaurantMealType.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,23 @@
+﻿using System.Collections.Generic;
+using Microsoft.EntityFrameworkCore.Migrations;
+#nullable disable
+namespace NutriMatch.Migrations
+{
+    public partial class AddRestaurantMealType : Migration
+    {
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.AddColumn<List<string>>(
+                name: "Type",
+                table: "RestaurantMeals",
+                type: "text[]",
+                nullable: true);
+        }
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropColumn(
+                name: "Type",
+                table: "RestaurantMeals");
+        }
+    }
+}
Index: NutriMatch/Migrations/20250815115511_AddMealPlan.Designer.cs
===================================================================
--- NutriMatch/Migrations/20250815115511_AddMealPlan.Designer.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Migrations/20250815115511_AddMealPlan.Designer.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,515 @@
+﻿// <auto-generated />
+using System;
+using System.Collections.Generic;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using NutriMatch.Data;
+#nullable disable
+namespace NutriMatch.Migrations
+{
+    [DbContext(typeof(AppDbContext))]
+    [Migration("20250815115511_AddMealPlan")]
+    partial class AddMealPlan
+    {
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "9.0.7")
+                .HasAnnotation("Relational:MaxIdentifierLength", 63);
+            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
+                {
+                    b.Property<string>("Id")
+                        .HasColumnType("text");
+                    b.Property<string>("ConcurrencyStamp")
+                        .IsConcurrencyToken()
+                        .HasColumnType("text");
+                    b.Property<string>("Name")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<string>("NormalizedName")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.HasKey("Id");
+                    b.HasIndex("NormalizedName")
+                        .IsUnique()
+                        .HasDatabaseName("RoleNameIndex");
+                    b.ToTable("AspNetRoles", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("ClaimType")
+                        .HasColumnType("text");
+                    b.Property<string>("ClaimValue")
+                        .HasColumnType("text");
+                    b.Property<string>("RoleId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("RoleId");
+                    b.ToTable("AspNetRoleClaims", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("ClaimType")
+                        .HasColumnType("text");
+                    b.Property<string>("ClaimValue")
+                        .HasColumnType("text");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("UserId");
+                    b.ToTable("AspNetUserClaims", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
+                {
+                    b.Property<string>("LoginProvider")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("ProviderKey")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("ProviderDisplayName")
+                        .HasColumnType("text");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("LoginProvider", "ProviderKey");
+                    b.HasIndex("UserId");
+                    b.ToTable("AspNetUserLogins", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
+                {
+                    b.Property<string>("UserId")
+                        .HasColumnType("text");
+                    b.Property<string>("RoleId")
+                        .HasColumnType("text");
+                    b.HasKey("UserId", "RoleId");
+                    b.HasIndex("RoleId");
+                    b.ToTable("AspNetUserRoles", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
+                {
+                    b.Property<string>("UserId")
+                        .HasColumnType("text");
+                    b.Property<string>("LoginProvider")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("Name")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("Value")
+                        .HasColumnType("text");
+                    b.HasKey("UserId", "LoginProvider", "Name");
+                    b.ToTable("AspNetUserTokens", (string)null);
+                });
+            modelBuilder.Entity("NutriMatch.Models.FavoriteRecipe", b =>
+                {
+                    b.Property<string>("UserId")
+                        .HasColumnType("text");
+                    b.Property<int>("RecipeId")
+                        .HasColumnType("integer");
+                    b.HasKey("UserId", "RecipeId");
+                    b.HasIndex("RecipeId");
+                    b.ToTable("FavoriteRecipes");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Ingredient", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<float>("Calories")
+                        .HasColumnType("real");
+                    b.Property<float>("Carbs")
+                        .HasColumnType("real");
+                    b.Property<float>("Fat")
+                        .HasColumnType("real");
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Protein")
+                        .HasColumnType("real");
+                    b.HasKey("Id");
+                    b.ToTable("Ingredients");
+                });
+            modelBuilder.Entity("NutriMatch.Models.MealSlot", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("Day")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<bool>("IsRestaurantMeal")
+                        .HasColumnType("boolean");
+                    b.Property<string>("MealType")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<int>("RecipeId")
+                        .HasColumnType("integer");
+                    b.Property<int>("RestaurantMealId")
+                        .HasColumnType("integer");
+                    b.Property<int?>("WeeklyMealPlanId")
+                        .HasColumnType("integer");
+                    b.HasKey("Id");
+                    b.HasIndex("RecipeId");
+                    b.HasIndex("RestaurantMealId");
+                    b.HasIndex("WeeklyMealPlanId");
+                    b.ToTable("MealSlots");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("AdminComment")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Calories")
+                        .HasColumnType("real");
+                    b.Property<float>("Carbs")
+                        .HasColumnType("real");
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("timestamp with time zone");
+                    b.Property<string>("DeclineReason")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Fat")
+                        .HasColumnType("real");
+                    b.Property<string>("ImageUrl")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.PrimitiveCollection<string[]>("Instructions")
+                        .HasColumnType("text[]");
+                    b.Property<float>("Protein")
+                        .HasColumnType("real");
+                    b.Property<string>("RecipeStatus")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.PrimitiveCollection<List<string>>("Type")
+                        .IsRequired()
+                        .HasColumnType("text[]");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("UserId");
+                    b.ToTable("Recipes");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeIngredient", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<int>("IngredientId")
+                        .HasColumnType("integer");
+                    b.Property<float>("Quantity")
+                        .HasColumnType("real");
+                    b.Property<int>("RecipeId")
+                        .HasColumnType("integer");
+                    b.Property<string>("Unit")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("IngredientId");
+                    b.HasIndex("RecipeId");
+                    b.ToTable("RecipeIngredients");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeRating", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<double>("Rating")
+                        .HasColumnType("double precision");
+                    b.Property<int>("RecipeId")
+                        .HasColumnType("integer");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("RecipeId");
+                    b.HasIndex("UserId", "RecipeId")
+                        .IsUnique();
+                    b.ToTable("RecipeRatings");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Restaurant", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("Description")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("ImageUrl")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.ToTable("Restaurants");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RestaurantMeal", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<float>("Calories")
+                        .HasColumnType("real");
+                    b.Property<float>("Carbs")
+                        .HasColumnType("real");
+                    b.Property<float>("Fat")
+                        .HasColumnType("real");
+                    b.Property<string>("ItemDescription")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("ItemName")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Protein")
+                        .HasColumnType("real");
+                    b.Property<int?>("RestaurantId")
+                        .HasColumnType("integer");
+                    b.Property<string>("RestaurantName")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.PrimitiveCollection<List<string>>("Type")
+                        .IsRequired()
+                        .HasColumnType("text[]");
+                    b.HasKey("Id");
+                    b.HasIndex("RestaurantId");
+                    b.ToTable("RestaurantMeals");
+                });
+            modelBuilder.Entity("NutriMatch.Models.User", b =>
+                {
+                    b.Property<string>("Id")
+                        .HasColumnType("text");
+                    b.Property<int>("AccessFailedCount")
+                        .HasColumnType("integer");
+                    b.Property<string>("ConcurrencyStamp")
+                        .IsConcurrencyToken()
+                        .HasColumnType("text");
+                    b.Property<string>("Email")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<bool>("EmailConfirmed")
+                        .HasColumnType("boolean");
+                    b.Property<bool>("LockoutEnabled")
+                        .HasColumnType("boolean");
+                    b.Property<DateTimeOffset?>("LockoutEnd")
+                        .HasColumnType("timestamp with time zone");
+                    b.Property<string>("NormalizedEmail")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<string>("NormalizedUserName")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<string>("PasswordHash")
+                        .HasColumnType("text");
+                    b.Property<string>("PhoneNumber")
+                        .HasColumnType("text");
+                    b.Property<bool>("PhoneNumberConfirmed")
+                        .HasColumnType("boolean");
+                    b.Property<string>("ProfilePictureUrl")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("SecurityStamp")
+                        .HasColumnType("text");
+                    b.Property<bool>("TwoFactorEnabled")
+                        .HasColumnType("boolean");
+                    b.Property<string>("UserName")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.HasKey("Id");
+                    b.HasIndex("NormalizedEmail")
+                        .HasDatabaseName("EmailIndex");
+                    b.HasIndex("NormalizedUserName")
+                        .IsUnique()
+                        .HasDatabaseName("UserNameIndex");
+                    b.ToTable("AspNetUsers", (string)null);
+                });
+            modelBuilder.Entity("NutriMatch.Models.WeeklyMealPlan", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<DateTime>("GeneratedAt")
+                        .HasColumnType("timestamp with time zone");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.ToTable("WeeklyMealPlans");
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
+                {
+                    b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
+                        .WithMany()
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
+                {
+                    b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
+                        .WithMany()
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("NutriMatch.Models.FavoriteRecipe", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Recipe", "Recipe")
+                        .WithMany("FavoritedBy")
+                        .HasForeignKey("RecipeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.User", "User")
+                        .WithMany("FavoriteRecipes")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("Recipe");
+                    b.Navigation("User");
+                });
+            modelBuilder.Entity("NutriMatch.Models.MealSlot", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Recipe", "Recipe")
+                        .WithMany()
+                        .HasForeignKey("RecipeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.RestaurantMeal", "RestaurantMeal")
+                        .WithMany()
+                        .HasForeignKey("RestaurantMealId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.WeeklyMealPlan", null)
+                        .WithMany("MealSlots")
+                        .HasForeignKey("WeeklyMealPlanId");
+                    b.Navigation("Recipe");
+                    b.Navigation("RestaurantMeal");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", "User")
+                        .WithMany("Recipes")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("User");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeIngredient", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Ingredient", "Ingredient")
+                        .WithMany()
+                        .HasForeignKey("IngredientId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.Recipe", null)
+                        .WithMany("RecipeIngredients")
+                        .HasForeignKey("RecipeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("Ingredient");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeRating", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Recipe", "Recipe")
+                        .WithMany("Ratings")
+                        .HasForeignKey("RecipeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.User", "User")
+                        .WithMany("Ratings")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("Recipe");
+                    b.Navigation("User");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RestaurantMeal", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Restaurant", "Restaurant")
+                        .WithMany("RestaurantMeals")
+                        .HasForeignKey("RestaurantId");
+                    b.Navigation("Restaurant");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
+                {
+                    b.Navigation("FavoritedBy");
+                    b.Navigation("Ratings");
+                    b.Navigation("RecipeIngredients");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Restaurant", b =>
+                {
+                    b.Navigation("RestaurantMeals");
+                });
+            modelBuilder.Entity("NutriMatch.Models.User", b =>
+                {
+                    b.Navigation("FavoriteRecipes");
+                    b.Navigation("Ratings");
+                    b.Navigation("Recipes");
+                });
+            modelBuilder.Entity("NutriMatch.Models.WeeklyMealPlan", b =>
+                {
+                    b.Navigation("MealSlots");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
Index: NutriMatch/Migrations/20250815115511_AddMealPlan.cs
===================================================================
--- NutriMatch/Migrations/20250815115511_AddMealPlan.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Migrations/20250815115511_AddMealPlan.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,79 @@
+﻿using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+#nullable disable
+namespace NutriMatch.Migrations
+{
+    public partial class AddMealPlan : Migration
+    {
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.CreateTable(
+                name: "WeeklyMealPlans",
+                columns: table => new
+                {
+                    Id = table.Column<int>(type: "integer", nullable: false)
+                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+                    UserId = table.Column<string>(type: "text", nullable: false),
+                    GeneratedAt = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("PK_WeeklyMealPlans", x => x.Id);
+                });
+            migrationBuilder.CreateTable(
+                name: "MealSlots",
+                columns: table => new
+                {
+                    Id = table.Column<int>(type: "integer", nullable: false)
+                        .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+                    Day = table.Column<string>(type: "text", nullable: false),
+                    MealType = table.Column<string>(type: "text", nullable: false),
+                    RecipeId = table.Column<int>(type: "integer", nullable: false),
+                    RestaurantMealId = table.Column<int>(type: "integer", nullable: false),
+                    IsRestaurantMeal = table.Column<bool>(type: "boolean", nullable: false),
+                    WeeklyMealPlanId = table.Column<int>(type: "integer", nullable: true)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("PK_MealSlots", x => x.Id);
+                    table.ForeignKey(
+                        name: "FK_MealSlots_Recipes_RecipeId",
+                        column: x => x.RecipeId,
+                        principalTable: "Recipes",
+                        principalColumn: "Id",
+                        onDelete: ReferentialAction.Cascade);
+                    table.ForeignKey(
+                        name: "FK_MealSlots_RestaurantMeals_RestaurantMealId",
+                        column: x => x.RestaurantMealId,
+                        principalTable: "RestaurantMeals",
+                        principalColumn: "Id",
+                        onDelete: ReferentialAction.Cascade);
+                    table.ForeignKey(
+                        name: "FK_MealSlots_WeeklyMealPlans_WeeklyMealPlanId",
+                        column: x => x.WeeklyMealPlanId,
+                        principalTable: "WeeklyMealPlans",
+                        principalColumn: "Id");
+                });
+            migrationBuilder.CreateIndex(
+                name: "IX_MealSlots_RecipeId",
+                table: "MealSlots",
+                column: "RecipeId");
+            migrationBuilder.CreateIndex(
+                name: "IX_MealSlots_RestaurantMealId",
+                table: "MealSlots",
+                column: "RestaurantMealId");
+            migrationBuilder.CreateIndex(
+                name: "IX_MealSlots_WeeklyMealPlanId",
+                table: "MealSlots",
+                column: "WeeklyMealPlanId");
+        }
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropTable(
+                name: "MealSlots");
+            migrationBuilder.DropTable(
+                name: "WeeklyMealPlans");
+        }
+    }
+}
Index: NutriMatch/Migrations/20250815123938_MealPlanFix.Designer.cs
===================================================================
--- NutriMatch/Migrations/20250815123938_MealPlanFix.Designer.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Migrations/20250815123938_MealPlanFix.Designer.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,511 @@
+﻿// <auto-generated />
+using System;
+using System.Collections.Generic;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using NutriMatch.Data;
+#nullable disable
+namespace NutriMatch.Migrations
+{
+    [DbContext(typeof(AppDbContext))]
+    [Migration("20250815123938_MealPlanFix")]
+    partial class MealPlanFix
+    {
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "9.0.7")
+                .HasAnnotation("Relational:MaxIdentifierLength", 63);
+            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
+                {
+                    b.Property<string>("Id")
+                        .HasColumnType("text");
+                    b.Property<string>("ConcurrencyStamp")
+                        .IsConcurrencyToken()
+                        .HasColumnType("text");
+                    b.Property<string>("Name")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<string>("NormalizedName")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.HasKey("Id");
+                    b.HasIndex("NormalizedName")
+                        .IsUnique()
+                        .HasDatabaseName("RoleNameIndex");
+                    b.ToTable("AspNetRoles", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("ClaimType")
+                        .HasColumnType("text");
+                    b.Property<string>("ClaimValue")
+                        .HasColumnType("text");
+                    b.Property<string>("RoleId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("RoleId");
+                    b.ToTable("AspNetRoleClaims", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("ClaimType")
+                        .HasColumnType("text");
+                    b.Property<string>("ClaimValue")
+                        .HasColumnType("text");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("UserId");
+                    b.ToTable("AspNetUserClaims", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
+                {
+                    b.Property<string>("LoginProvider")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("ProviderKey")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("ProviderDisplayName")
+                        .HasColumnType("text");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("LoginProvider", "ProviderKey");
+                    b.HasIndex("UserId");
+                    b.ToTable("AspNetUserLogins", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
+                {
+                    b.Property<string>("UserId")
+                        .HasColumnType("text");
+                    b.Property<string>("RoleId")
+                        .HasColumnType("text");
+                    b.HasKey("UserId", "RoleId");
+                    b.HasIndex("RoleId");
+                    b.ToTable("AspNetUserRoles", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
+                {
+                    b.Property<string>("UserId")
+                        .HasColumnType("text");
+                    b.Property<string>("LoginProvider")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("Name")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("Value")
+                        .HasColumnType("text");
+                    b.HasKey("UserId", "LoginProvider", "Name");
+                    b.ToTable("AspNetUserTokens", (string)null);
+                });
+            modelBuilder.Entity("NutriMatch.Models.FavoriteRecipe", b =>
+                {
+                    b.Property<string>("UserId")
+                        .HasColumnType("text");
+                    b.Property<int>("RecipeId")
+                        .HasColumnType("integer");
+                    b.HasKey("UserId", "RecipeId");
+                    b.HasIndex("RecipeId");
+                    b.ToTable("FavoriteRecipes");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Ingredient", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<float>("Calories")
+                        .HasColumnType("real");
+                    b.Property<float>("Carbs")
+                        .HasColumnType("real");
+                    b.Property<float>("Fat")
+                        .HasColumnType("real");
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Protein")
+                        .HasColumnType("real");
+                    b.HasKey("Id");
+                    b.ToTable("Ingredients");
+                });
+            modelBuilder.Entity("NutriMatch.Models.MealSlot", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("Day")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<bool>("IsRestaurantMeal")
+                        .HasColumnType("boolean");
+                    b.Property<string>("MealType")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<int?>("RecipeId")
+                        .HasColumnType("integer");
+                    b.Property<int?>("RestaurantMealId")
+                        .HasColumnType("integer");
+                    b.Property<int?>("WeeklyMealPlanId")
+                        .HasColumnType("integer");
+                    b.HasKey("Id");
+                    b.HasIndex("RecipeId");
+                    b.HasIndex("RestaurantMealId");
+                    b.HasIndex("WeeklyMealPlanId");
+                    b.ToTable("MealSlots");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("AdminComment")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Calories")
+                        .HasColumnType("real");
+                    b.Property<float>("Carbs")
+                        .HasColumnType("real");
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("timestamp with time zone");
+                    b.Property<string>("DeclineReason")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Fat")
+                        .HasColumnType("real");
+                    b.Property<string>("ImageUrl")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.PrimitiveCollection<string[]>("Instructions")
+                        .HasColumnType("text[]");
+                    b.Property<float>("Protein")
+                        .HasColumnType("real");
+                    b.Property<string>("RecipeStatus")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.PrimitiveCollection<List<string>>("Type")
+                        .IsRequired()
+                        .HasColumnType("text[]");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("UserId");
+                    b.ToTable("Recipes");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeIngredient", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<int>("IngredientId")
+                        .HasColumnType("integer");
+                    b.Property<float>("Quantity")
+                        .HasColumnType("real");
+                    b.Property<int>("RecipeId")
+                        .HasColumnType("integer");
+                    b.Property<string>("Unit")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("IngredientId");
+                    b.HasIndex("RecipeId");
+                    b.ToTable("RecipeIngredients");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeRating", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<double>("Rating")
+                        .HasColumnType("double precision");
+                    b.Property<int>("RecipeId")
+                        .HasColumnType("integer");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("RecipeId");
+                    b.HasIndex("UserId", "RecipeId")
+                        .IsUnique();
+                    b.ToTable("RecipeRatings");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Restaurant", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("Description")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("ImageUrl")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.ToTable("Restaurants");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RestaurantMeal", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<float>("Calories")
+                        .HasColumnType("real");
+                    b.Property<float>("Carbs")
+                        .HasColumnType("real");
+                    b.Property<float>("Fat")
+                        .HasColumnType("real");
+                    b.Property<string>("ItemDescription")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("ItemName")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Protein")
+                        .HasColumnType("real");
+                    b.Property<int?>("RestaurantId")
+                        .HasColumnType("integer");
+                    b.Property<string>("RestaurantName")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.PrimitiveCollection<List<string>>("Type")
+                        .IsRequired()
+                        .HasColumnType("text[]");
+                    b.HasKey("Id");
+                    b.HasIndex("RestaurantId");
+                    b.ToTable("RestaurantMeals");
+                });
+            modelBuilder.Entity("NutriMatch.Models.User", b =>
+                {
+                    b.Property<string>("Id")
+                        .HasColumnType("text");
+                    b.Property<int>("AccessFailedCount")
+                        .HasColumnType("integer");
+                    b.Property<string>("ConcurrencyStamp")
+                        .IsConcurrencyToken()
+                        .HasColumnType("text");
+                    b.Property<string>("Email")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<bool>("EmailConfirmed")
+                        .HasColumnType("boolean");
+                    b.Property<bool>("LockoutEnabled")
+                        .HasColumnType("boolean");
+                    b.Property<DateTimeOffset?>("LockoutEnd")
+                        .HasColumnType("timestamp with time zone");
+                    b.Property<string>("NormalizedEmail")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<string>("NormalizedUserName")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<string>("PasswordHash")
+                        .HasColumnType("text");
+                    b.Property<string>("PhoneNumber")
+                        .HasColumnType("text");
+                    b.Property<bool>("PhoneNumberConfirmed")
+                        .HasColumnType("boolean");
+                    b.Property<string>("ProfilePictureUrl")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("SecurityStamp")
+                        .HasColumnType("text");
+                    b.Property<bool>("TwoFactorEnabled")
+                        .HasColumnType("boolean");
+                    b.Property<string>("UserName")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.HasKey("Id");
+                    b.HasIndex("NormalizedEmail")
+                        .HasDatabaseName("EmailIndex");
+                    b.HasIndex("NormalizedUserName")
+                        .IsUnique()
+                        .HasDatabaseName("UserNameIndex");
+                    b.ToTable("AspNetUsers", (string)null);
+                });
+            modelBuilder.Entity("NutriMatch.Models.WeeklyMealPlan", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<DateTime>("GeneratedAt")
+                        .HasColumnType("timestamp with time zone");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.ToTable("WeeklyMealPlans");
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
+                {
+                    b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
+                        .WithMany()
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
+                {
+                    b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
+                        .WithMany()
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("NutriMatch.Models.FavoriteRecipe", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Recipe", "Recipe")
+                        .WithMany("FavoritedBy")
+                        .HasForeignKey("RecipeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.User", "User")
+                        .WithMany("FavoriteRecipes")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("Recipe");
+                    b.Navigation("User");
+                });
+            modelBuilder.Entity("NutriMatch.Models.MealSlot", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Recipe", "Recipe")
+                        .WithMany()
+                        .HasForeignKey("RecipeId");
+                    b.HasOne("NutriMatch.Models.RestaurantMeal", "RestaurantMeal")
+                        .WithMany()
+                        .HasForeignKey("RestaurantMealId");
+                    b.HasOne("NutriMatch.Models.WeeklyMealPlan", null)
+                        .WithMany("MealSlots")
+                        .HasForeignKey("WeeklyMealPlanId");
+                    b.Navigation("Recipe");
+                    b.Navigation("RestaurantMeal");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", "User")
+                        .WithMany("Recipes")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("User");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeIngredient", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Ingredient", "Ingredient")
+                        .WithMany()
+                        .HasForeignKey("IngredientId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.Recipe", null)
+                        .WithMany("RecipeIngredients")
+                        .HasForeignKey("RecipeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("Ingredient");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeRating", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Recipe", "Recipe")
+                        .WithMany("Ratings")
+                        .HasForeignKey("RecipeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.User", "User")
+                        .WithMany("Ratings")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("Recipe");
+                    b.Navigation("User");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RestaurantMeal", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Restaurant", "Restaurant")
+                        .WithMany("RestaurantMeals")
+                        .HasForeignKey("RestaurantId");
+                    b.Navigation("Restaurant");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
+                {
+                    b.Navigation("FavoritedBy");
+                    b.Navigation("Ratings");
+                    b.Navigation("RecipeIngredients");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Restaurant", b =>
+                {
+                    b.Navigation("RestaurantMeals");
+                });
+            modelBuilder.Entity("NutriMatch.Models.User", b =>
+                {
+                    b.Navigation("FavoriteRecipes");
+                    b.Navigation("Ratings");
+                    b.Navigation("Recipes");
+                });
+            modelBuilder.Entity("NutriMatch.Models.WeeklyMealPlan", b =>
+                {
+                    b.Navigation("MealSlots");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
Index: NutriMatch/Migrations/20250815123938_MealPlanFix.cs
===================================================================
--- NutriMatch/Migrations/20250815123938_MealPlanFix.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Migrations/20250815123938_MealPlanFix.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,84 @@
+﻿using Microsoft.EntityFrameworkCore.Migrations;
+#nullable disable
+namespace NutriMatch.Migrations
+{
+    public partial class MealPlanFix : Migration
+    {
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropForeignKey(
+                name: "FK_MealSlots_Recipes_RecipeId",
+                table: "MealSlots");
+            migrationBuilder.DropForeignKey(
+                name: "FK_MealSlots_RestaurantMeals_RestaurantMealId",
+                table: "MealSlots");
+            migrationBuilder.AlterColumn<int>(
+                name: "RestaurantMealId",
+                table: "MealSlots",
+                type: "integer",
+                nullable: true,
+                oldClrType: typeof(int),
+                oldType: "integer");
+            migrationBuilder.AlterColumn<int>(
+                name: "RecipeId",
+                table: "MealSlots",
+                type: "integer",
+                nullable: true,
+                oldClrType: typeof(int),
+                oldType: "integer");
+            migrationBuilder.AddForeignKey(
+                name: "FK_MealSlots_Recipes_RecipeId",
+                table: "MealSlots",
+                column: "RecipeId",
+                principalTable: "Recipes",
+                principalColumn: "Id");
+            migrationBuilder.AddForeignKey(
+                name: "FK_MealSlots_RestaurantMeals_RestaurantMealId",
+                table: "MealSlots",
+                column: "RestaurantMealId",
+                principalTable: "RestaurantMeals",
+                principalColumn: "Id");
+        }
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropForeignKey(
+                name: "FK_MealSlots_Recipes_RecipeId",
+                table: "MealSlots");
+            migrationBuilder.DropForeignKey(
+                name: "FK_MealSlots_RestaurantMeals_RestaurantMealId",
+                table: "MealSlots");
+            migrationBuilder.AlterColumn<int>(
+                name: "RestaurantMealId",
+                table: "MealSlots",
+                type: "integer",
+                nullable: false,
+                defaultValue: 0,
+                oldClrType: typeof(int),
+                oldType: "integer",
+                oldNullable: true);
+            migrationBuilder.AlterColumn<int>(
+                name: "RecipeId",
+                table: "MealSlots",
+                type: "integer",
+                nullable: false,
+                defaultValue: 0,
+                oldClrType: typeof(int),
+                oldType: "integer",
+                oldNullable: true);
+            migrationBuilder.AddForeignKey(
+                name: "FK_MealSlots_Recipes_RecipeId",
+                table: "MealSlots",
+                column: "RecipeId",
+                principalTable: "Recipes",
+                principalColumn: "Id",
+                onDelete: ReferentialAction.Cascade);
+            migrationBuilder.AddForeignKey(
+                name: "FK_MealSlots_RestaurantMeals_RestaurantMealId",
+                table: "MealSlots",
+                column: "RestaurantMealId",
+                principalTable: "RestaurantMeals",
+                principalColumn: "Id",
+                onDelete: ReferentialAction.Cascade);
+        }
+    }
+}
Index: NutriMatch/Migrations/20250820150843_Ingredient Approval.Designer.cs
===================================================================
--- NutriMatch/Migrations/20250820150843_Ingredient Approval.Designer.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Migrations/20250820150843_Ingredient Approval.Designer.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,515 @@
+﻿// <auto-generated />
+using System;
+using System.Collections.Generic;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using NutriMatch.Data;
+#nullable disable
+namespace NutriMatch.Migrations
+{
+    [DbContext(typeof(AppDbContext))]
+    [Migration("20250820150843_Ingredient Approval")]
+    partial class IngredientApproval
+    {
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "9.0.7")
+                .HasAnnotation("Relational:MaxIdentifierLength", 63);
+            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
+                {
+                    b.Property<string>("Id")
+                        .HasColumnType("text");
+                    b.Property<string>("ConcurrencyStamp")
+                        .IsConcurrencyToken()
+                        .HasColumnType("text");
+                    b.Property<string>("Name")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<string>("NormalizedName")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.HasKey("Id");
+                    b.HasIndex("NormalizedName")
+                        .IsUnique()
+                        .HasDatabaseName("RoleNameIndex");
+                    b.ToTable("AspNetRoles", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("ClaimType")
+                        .HasColumnType("text");
+                    b.Property<string>("ClaimValue")
+                        .HasColumnType("text");
+                    b.Property<string>("RoleId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("RoleId");
+                    b.ToTable("AspNetRoleClaims", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("ClaimType")
+                        .HasColumnType("text");
+                    b.Property<string>("ClaimValue")
+                        .HasColumnType("text");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("UserId");
+                    b.ToTable("AspNetUserClaims", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
+                {
+                    b.Property<string>("LoginProvider")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("ProviderKey")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("ProviderDisplayName")
+                        .HasColumnType("text");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("LoginProvider", "ProviderKey");
+                    b.HasIndex("UserId");
+                    b.ToTable("AspNetUserLogins", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
+                {
+                    b.Property<string>("UserId")
+                        .HasColumnType("text");
+                    b.Property<string>("RoleId")
+                        .HasColumnType("text");
+                    b.HasKey("UserId", "RoleId");
+                    b.HasIndex("RoleId");
+                    b.ToTable("AspNetUserRoles", (string)null);
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
+                {
+                    b.Property<string>("UserId")
+                        .HasColumnType("text");
+                    b.Property<string>("LoginProvider")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("Name")
+                        .HasMaxLength(128)
+                        .HasColumnType("character varying(128)");
+                    b.Property<string>("Value")
+                        .HasColumnType("text");
+                    b.HasKey("UserId", "LoginProvider", "Name");
+                    b.ToTable("AspNetUserTokens", (string)null);
+                });
+            modelBuilder.Entity("NutriMatch.Models.FavoriteRecipe", b =>
+                {
+                    b.Property<string>("UserId")
+                        .HasColumnType("text");
+                    b.Property<int>("RecipeId")
+                        .HasColumnType("integer");
+                    b.HasKey("UserId", "RecipeId");
+                    b.HasIndex("RecipeId");
+                    b.ToTable("FavoriteRecipes");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Ingredient", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<float>("Calories")
+                        .HasColumnType("real");
+                    b.Property<float>("Carbs")
+                        .HasColumnType("real");
+                    b.Property<float>("Fat")
+                        .HasColumnType("real");
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Protein")
+                        .HasColumnType("real");
+                    b.Property<string>("Status")
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.ToTable("Ingredients");
+                });
+            modelBuilder.Entity("NutriMatch.Models.MealSlot", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("Day")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<bool>("IsRestaurantMeal")
+                        .HasColumnType("boolean");
+                    b.Property<string>("MealType")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<int?>("RecipeId")
+                        .HasColumnType("integer");
+                    b.Property<int?>("RestaurantMealId")
+                        .HasColumnType("integer");
+                    b.Property<int?>("WeeklyMealPlanId")
+                        .HasColumnType("integer");
+                    b.HasKey("Id");
+                    b.HasIndex("RecipeId");
+                    b.HasIndex("RestaurantMealId");
+                    b.HasIndex("WeeklyMealPlanId");
+                    b.ToTable("MealSlots");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("AdminComment")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Calories")
+                        .HasColumnType("real");
+                    b.Property<float>("Carbs")
+                        .HasColumnType("real");
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("timestamp with time zone");
+                    b.Property<string>("DeclineReason")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Fat")
+                        .HasColumnType("real");
+                    b.Property<bool?>("HasPendingIngredients")
+                        .HasColumnType("boolean");
+                    b.Property<string>("ImageUrl")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.PrimitiveCollection<string[]>("Instructions")
+                        .HasColumnType("text[]");
+                    b.Property<float>("Protein")
+                        .HasColumnType("real");
+                    b.Property<string>("RecipeStatus")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.PrimitiveCollection<List<string>>("Type")
+                        .IsRequired()
+                        .HasColumnType("text[]");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("UserId");
+                    b.ToTable("Recipes");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeIngredient", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<int>("IngredientId")
+                        .HasColumnType("integer");
+                    b.Property<float>("Quantity")
+                        .HasColumnType("real");
+                    b.Property<int>("RecipeId")
+                        .HasColumnType("integer");
+                    b.Property<string>("Unit")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("IngredientId");
+                    b.HasIndex("RecipeId");
+                    b.ToTable("RecipeIngredients");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeRating", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<double>("Rating")
+                        .HasColumnType("double precision");
+                    b.Property<int>("RecipeId")
+                        .HasColumnType("integer");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.HasIndex("RecipeId");
+                    b.HasIndex("UserId", "RecipeId")
+                        .IsUnique();
+                    b.ToTable("RecipeRatings");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Restaurant", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("Description")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("ImageUrl")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.ToTable("Restaurants");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RestaurantMeal", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<float>("Calories")
+                        .HasColumnType("real");
+                    b.Property<float>("Carbs")
+                        .HasColumnType("real");
+                    b.Property<float>("Fat")
+                        .HasColumnType("real");
+                    b.Property<string>("ItemDescription")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("ItemName")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<float>("Protein")
+                        .HasColumnType("real");
+                    b.Property<int?>("RestaurantId")
+                        .HasColumnType("integer");
+                    b.Property<string>("RestaurantName")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.PrimitiveCollection<List<string>>("Type")
+                        .IsRequired()
+                        .HasColumnType("text[]");
+                    b.HasKey("Id");
+                    b.HasIndex("RestaurantId");
+                    b.ToTable("RestaurantMeals");
+                });
+            modelBuilder.Entity("NutriMatch.Models.User", b =>
+                {
+                    b.Property<string>("Id")
+                        .HasColumnType("text");
+                    b.Property<int>("AccessFailedCount")
+                        .HasColumnType("integer");
+                    b.Property<string>("ConcurrencyStamp")
+                        .IsConcurrencyToken()
+                        .HasColumnType("text");
+                    b.Property<string>("Email")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<bool>("EmailConfirmed")
+                        .HasColumnType("boolean");
+                    b.Property<bool>("LockoutEnabled")
+                        .HasColumnType("boolean");
+                    b.Property<DateTimeOffset?>("LockoutEnd")
+                        .HasColumnType("timestamp with time zone");
+                    b.Property<string>("NormalizedEmail")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<string>("NormalizedUserName")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.Property<string>("PasswordHash")
+                        .HasColumnType("text");
+                    b.Property<string>("PhoneNumber")
+                        .HasColumnType("text");
+                    b.Property<bool>("PhoneNumberConfirmed")
+                        .HasColumnType("boolean");
+                    b.Property<string>("ProfilePictureUrl")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<string>("SecurityStamp")
+                        .HasColumnType("text");
+                    b.Property<bool>("TwoFactorEnabled")
+                        .HasColumnType("boolean");
+                    b.Property<string>("UserName")
+                        .HasMaxLength(256)
+                        .HasColumnType("character varying(256)");
+                    b.HasKey("Id");
+                    b.HasIndex("NormalizedEmail")
+                        .HasDatabaseName("EmailIndex");
+                    b.HasIndex("NormalizedUserName")
+                        .IsUnique()
+                        .HasDatabaseName("UserNameIndex");
+                    b.ToTable("AspNetUsers", (string)null);
+                });
+            modelBuilder.Entity("NutriMatch.Models.WeeklyMealPlan", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<DateTime>("GeneratedAt")
+                        .HasColumnType("timestamp with time zone");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.ToTable("WeeklyMealPlans");
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
+                {
+                    b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
+                        .WithMany()
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b =>
+                {
+                    b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null)
+                        .WithMany()
+                        .HasForeignKey("RoleId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", null)
+                        .WithMany()
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+            modelBuilder.Entity("NutriMatch.Models.FavoriteRecipe", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Recipe", "Recipe")
+                        .WithMany("FavoritedBy")
+                        .HasForeignKey("RecipeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.User", "User")
+                        .WithMany("FavoriteRecipes")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("Recipe");
+                    b.Navigation("User");
+                });
+            modelBuilder.Entity("NutriMatch.Models.MealSlot", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Recipe", "Recipe")
+                        .WithMany()
+                        .HasForeignKey("RecipeId");
+                    b.HasOne("NutriMatch.Models.RestaurantMeal", "RestaurantMeal")
+                        .WithMany()
+                        .HasForeignKey("RestaurantMealId");
+                    b.HasOne("NutriMatch.Models.WeeklyMealPlan", null)
+                        .WithMany("MealSlots")
+                        .HasForeignKey("WeeklyMealPlanId");
+                    b.Navigation("Recipe");
+                    b.Navigation("RestaurantMeal");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
+                {
+                    b.HasOne("NutriMatch.Models.User", "User")
+                        .WithMany("Recipes")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("User");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeIngredient", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Ingredient", "Ingredient")
+                        .WithMany()
+                        .HasForeignKey("IngredientId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.Recipe", null)
+                        .WithMany("RecipeIngredients")
+                        .HasForeignKey("RecipeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("Ingredient");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RecipeRating", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Recipe", "Recipe")
+                        .WithMany("Ratings")
+                        .HasForeignKey("RecipeId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.HasOne("NutriMatch.Models.User", "User")
+                        .WithMany("Ratings")
+                        .HasForeignKey("UserId")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                    b.Navigation("Recipe");
+                    b.Navigation("User");
+                });
+            modelBuilder.Entity("NutriMatch.Models.RestaurantMeal", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Restaurant", "Restaurant")
+                        .WithMany("RestaurantMeals")
+                        .HasForeignKey("RestaurantId");
+                    b.Navigation("Restaurant");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
+                {
+                    b.Navigation("FavoritedBy");
+                    b.Navigation("Ratings");
+                    b.Navigation("RecipeIngredients");
+                });
+            modelBuilder.Entity("NutriMatch.Models.Restaurant", b =>
+                {
+                    b.Navigation("RestaurantMeals");
+                });
+            modelBuilder.Entity("NutriMatch.Models.User", b =>
+                {
+                    b.Navigation("FavoriteRecipes");
+                    b.Navigation("Ratings");
+                    b.Navigation("Recipes");
+                });
+            modelBuilder.Entity("NutriMatch.Models.WeeklyMealPlan", b =>
+                {
+                    b.Navigation("MealSlots");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}
Index: NutriMatch/Migrations/20250820150843_Ingredient Approval.cs
===================================================================
--- NutriMatch/Migrations/20250820150843_Ingredient Approval.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Migrations/20250820150843_Ingredient Approval.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,30 @@
+﻿using Microsoft.EntityFrameworkCore.Migrations;
+#nullable disable
+namespace NutriMatch.Migrations
+{
+    public partial class IngredientApproval : Migration
+    {
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.AddColumn<bool>(
+                name: "HasPendingIngredients",
+                table: "Recipes",
+                type: "boolean",
+                nullable: true);
+            migrationBuilder.AddColumn<string>(
+                name: "Status",
+                table: "Ingredients",
+                type: "text",
+                nullable: true);
+        }
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropColumn(
+                name: "HasPendingIngredients",
+                table: "Recipes");
+            migrationBuilder.DropColumn(
+                name: "Status",
+                table: "Ingredients");
+        }
+    }
+}
Index: NutriMatch/Migrations/AppDbContextModelSnapshot.cs
===================================================================
--- NutriMatch/Migrations/AppDbContextModelSnapshot.cs	(revision 4a68273d2173d196bea803f19c4d87863b81f215)
+++ NutriMatch/Migrations/AppDbContextModelSnapshot.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -1,4 +1,5 @@
 ﻿// <auto-generated />
 using System;
+using System.Collections.Generic;
 using Microsoft.EntityFrameworkCore;
 using Microsoft.EntityFrameworkCore.Infrastructure;
@@ -141,7 +142,35 @@
                     b.Property<float>("Protein")
                         .HasColumnType("real");
+                    b.Property<string>("Status")
+                        .HasColumnType("text");
                     b.HasKey("Id");
                     b.ToTable("Ingredients");
                 });
+            modelBuilder.Entity("NutriMatch.Models.MealSlot", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("Day")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<bool>("IsRestaurantMeal")
+                        .HasColumnType("boolean");
+                    b.Property<string>("MealType")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.Property<int?>("RecipeId")
+                        .HasColumnType("integer");
+                    b.Property<int?>("RestaurantMealId")
+                        .HasColumnType("integer");
+                    b.Property<int?>("WeeklyMealPlanId")
+                        .HasColumnType("integer");
+                    b.HasKey("Id");
+                    b.HasIndex("RecipeId");
+                    b.HasIndex("RestaurantMealId");
+                    b.HasIndex("WeeklyMealPlanId");
+                    b.ToTable("MealSlots");
+                });
             modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
                 {
@@ -150,4 +179,7 @@
                         .HasColumnType("integer");
                     NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<string>("AdminComment")
+                        .IsRequired()
+                        .HasColumnType("text");
                     b.Property<float>("Calories")
                         .HasColumnType("real");
@@ -156,6 +188,11 @@
                     b.Property<DateTime>("CreatedAt")
                         .HasColumnType("timestamp with time zone");
+                    b.Property<string>("DeclineReason")
+                        .IsRequired()
+                        .HasColumnType("text");
                     b.Property<float>("Fat")
                         .HasColumnType("real");
+                    b.Property<bool?>("HasPendingIngredients")
+                        .HasColumnType("boolean");
                     b.Property<string>("ImageUrl")
                         .IsRequired()
@@ -163,11 +200,15 @@
                     b.PrimitiveCollection<string[]>("Instructions")
                         .HasColumnType("text[]");
-                    b.Property<bool>("IsApproved")
-                        .HasColumnType("boolean");
                     b.Property<float>("Protein")
                         .HasColumnType("real");
+                    b.Property<string>("RecipeStatus")
+                        .IsRequired()
+                        .HasColumnType("text");
                     b.Property<string>("Title")
                         .IsRequired()
                         .HasColumnType("text");
+                    b.PrimitiveCollection<List<string>>("Type")
+                        .IsRequired()
+                        .HasColumnType("text[]");
                     b.Property<string>("UserId")
                         .IsRequired()
@@ -259,4 +300,7 @@
                         .IsRequired()
                         .HasColumnType("text");
+                    b.PrimitiveCollection<List<string>>("Type")
+                        .IsRequired()
+                        .HasColumnType("text[]");
                     b.HasKey("Id");
                     b.HasIndex("RestaurantId");
@@ -311,4 +355,18 @@
                     b.ToTable("AspNetUsers", (string)null);
                 });
+            modelBuilder.Entity("NutriMatch.Models.WeeklyMealPlan", b =>
+                {
+                    b.Property<int>("Id")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("integer");
+                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
+                    b.Property<DateTime>("GeneratedAt")
+                        .HasColumnType("timestamp with time zone");
+                    b.Property<string>("UserId")
+                        .IsRequired()
+                        .HasColumnType("text");
+                    b.HasKey("Id");
+                    b.ToTable("WeeklyMealPlans");
+                });
             modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b =>
                 {
@@ -370,4 +428,18 @@
                     b.Navigation("Recipe");
                     b.Navigation("User");
+                });
+            modelBuilder.Entity("NutriMatch.Models.MealSlot", b =>
+                {
+                    b.HasOne("NutriMatch.Models.Recipe", "Recipe")
+                        .WithMany()
+                        .HasForeignKey("RecipeId");
+                    b.HasOne("NutriMatch.Models.RestaurantMeal", "RestaurantMeal")
+                        .WithMany()
+                        .HasForeignKey("RestaurantMealId");
+                    b.HasOne("NutriMatch.Models.WeeklyMealPlan", null)
+                        .WithMany("MealSlots")
+                        .HasForeignKey("WeeklyMealPlanId");
+                    b.Navigation("Recipe");
+                    b.Navigation("RestaurantMeal");
                 });
             modelBuilder.Entity("NutriMatch.Models.Recipe", b =>
@@ -432,4 +504,8 @@
                     b.Navigation("Recipes");
                 });
+            modelBuilder.Entity("NutriMatch.Models.WeeklyMealPlan", b =>
+                {
+                    b.Navigation("MealSlots");
+                });
 #pragma warning restore 612, 618
         }
Index: NutriMatch/Models/DailyMacros.cs
===================================================================
--- NutriMatch/Models/DailyMacros.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Models/DailyMacros.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,11 @@
+
+namespace NutriMatch.Models
+{
+        public class DailyMacros
+        {
+            public float Calories { get; set; }
+            public float Protein { get; set; }
+            public float Carbs { get; set; }
+            public float Fat { get; set; }
+        }
+}
Index: NutriMatch/Models/Ingredient.cs
===================================================================
--- NutriMatch/Models/Ingredient.cs	(revision 4a68273d2173d196bea803f19c4d87863b81f215)
+++ NutriMatch/Models/Ingredient.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -19,4 +19,6 @@
         public float Fat { get; set; }
 
+        public String? Status { get; set; }
+
     }
 }
Index: NutriMatch/Models/MealPlanRequest.cs
===================================================================
--- NutriMatch/Models/MealPlanRequest.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Models/MealPlanRequest.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,30 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace NutriMatch.Models
+{
+public class MealPlanRequest
+    {
+        [Required]
+        [Range(1200, 5000, ErrorMessage = "Daily calories must be between 1200 and 5000")]
+        public float DailyCalories { get; set; }
+
+        [Required]
+        [Range(50, 300, ErrorMessage = "Daily protein must be between 50g and 300g")]
+        public float DailyProtein { get; set; }
+
+        [Required]
+        [Range(100, 600, ErrorMessage = "Daily carbs must be between 100g and 600g")]
+        public float DailyCarbs { get; set; }
+
+        [Required]
+        [Range(30, 200, ErrorMessage = "Daily fat must be between 30g and 200g")]
+        public float DailyFat { get; set; }
+
+        [Required]
+        [Range(0, 21, ErrorMessage = "Restaurant meals per week must be between 0 and 21")]
+        public int RestaurantMealsPerWeek { get; set; }
+
+        public List<string> PreferredMealTypes { get; set; } = new List<string>();
+        public List<string> DietaryRestrictions { get; set; } = new List<string>();
+    }
+}
Index: NutriMatch/Models/MealPlanResult.cs
===================================================================
--- NutriMatch/Models/MealPlanResult.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Models/MealPlanResult.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,13 @@
+
+using NutriMatch.Models;
+
+namespace NutriMatch.Models
+{
+    public class MealPlanResult
+    {
+        public WeeklyMealPlan WeeklyMealPlan { get; set; }
+        public Dictionary<string, DailyMacros> DailyMacroTotals { get; set; } = new Dictionary<string, DailyMacros>();
+        public bool Success { get; set; }
+        public string ErrorMessage { get; set; }
+    }
+}
Index: NutriMatch/Models/MealSlot.cs
===================================================================
--- NutriMatch/Models/MealSlot.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Models/MealSlot.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,14 @@
+using System.ComponentModel.DataAnnotations;
+namespace NutriMatch.Models
+{
+    public class MealSlot
+    {
+        [Key]
+        public int Id { get; set; }
+        public string Day { get; set; }
+        public string MealType { get; set; }
+        public Recipe? Recipe { get; set; }
+        public RestaurantMeal? RestaurantMeal { get; set; }
+        public bool IsRestaurantMeal { get; set; }
+    }
+}
Index: NutriMatch/Models/Recipe.cs
===================================================================
--- NutriMatch/Models/Recipe.cs	(revision 4a68273d2173d196bea803f19c4d87863b81f215)
+++ NutriMatch/Models/Recipe.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -4,7 +4,7 @@
 using System.ComponentModel.DataAnnotations.Schema;
 using System.Linq;
+using System.Text.Json.Serialization;
 using System.Threading.Tasks;
 using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
-
 namespace NutriMatch.Models
 {
@@ -31,9 +31,12 @@
         public String ImageUrl { get; set; }
         public DateTime CreatedAt { get; set; } = DateTime.Now.ToUniversalTime();
-        public bool IsApproved { get; set; } = false;
-
+        public String RecipeStatus { get; set; } = "Pending";
+        public String AdminComment { get; set; } = String.Empty;
+        public String DeclineReason { get; set; } = String.Empty;
+        public bool? HasPendingIngredients { get; set; }
         [ValidateNever]
         public String UserId { get; set; }
         [ValidateNever]
+        [JsonIgnore]
         public virtual User User { get; set; }
         [ValidateNever]
@@ -41,4 +44,6 @@
         [ValidateNever]
         public ICollection<RecipeRating> Ratings { get; set; }
+        [ValidateNever]
+        public List<String> Type { get; set; }
     }
 }
Index: NutriMatch/Models/RestaurantMeal.cs
===================================================================
--- NutriMatch/Models/RestaurantMeal.cs	(revision 4a68273d2173d196bea803f19c4d87863b81f215)
+++ NutriMatch/Models/RestaurantMeal.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -19,4 +19,6 @@
 
         public String ItemDescription { get; set; }
+
+        public List<String> Type { get; set; } = new List<String>(){""};
         
         public float Calories { get; set; }
Index: NutriMatch/Models/WeeklyMealPlan.cs
===================================================================
--- NutriMatch/Models/WeeklyMealPlan.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Models/WeeklyMealPlan.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,13 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace NutriMatch.Models
+{
+    public class WeeklyMealPlan
+    {
+        [Key]
+        public int Id { get; set; }
+        public string UserId { get; set; }
+        public List<MealSlot> MealSlots { get; set; } = new List<MealSlot>();
+        public DateTime GeneratedAt { get; set; } = DateTime.Now.ToUniversalTime();
+    }
+}
Index: NutriMatch/Program.cs
===================================================================
--- NutriMatch/Program.cs	(revision 4a68273d2173d196bea803f19c4d87863b81f215)
+++ NutriMatch/Program.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -3,7 +3,9 @@
 using NutriMatch.Models;
 using Microsoft.AspNetCore.Identity;
+using NutriMatch.Services;
 var builder = WebApplication.CreateBuilder(args);
 builder.Services.AddControllersWithViews();
 builder.Services.AddRazorPages();
+builder.Services.AddScoped<IMealPlanService, MealPlanService>();
 builder.Services.AddDbContext<AppDbContext>(options =>
     options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection")));
Index: NutriMatch/Services/IMealPlanService.cs
===================================================================
--- NutriMatch/Services/IMealPlanService.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Services/IMealPlanService.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,14 @@
+using NutriMatch.Models;
+
+namespace NutriMatch.Services
+{
+    public interface IMealPlanService
+    {
+        Task<MealPlanResult> GenerateWeeklyMealPlanAsync(string userId, MealPlanRequest request);
+        Task<List<Recipe>> GetSuitableRecipesAsync(string mealType, DailyMacros targetMacros, List<string> dietaryRestrictions);
+        Task<List<RestaurantMeal>> GetSuitableRestaurantMealsAsync(string mealType, DailyMacros targetMacros);
+        Task<WeeklyMealPlan> GetMealPlanByIdAsync(int id, string userId);
+        Task<List<WeeklyMealPlan>> GetUserMealPlansAsync(string userId);
+        Task<bool> DeleteMealPlanAsync(int id, string userId);
+    }
+}
Index: NutriMatch/Services/MealPlanService.cs
===================================================================
--- NutriMatch/Services/MealPlanService.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Services/MealPlanService.cs	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,308 @@
+using System.ComponentModel.DataAnnotations;
+using Microsoft.EntityFrameworkCore;
+using NutriMatch.Data;
+using NutriMatch.Models;
+using NutriMatch.Services;
+namespace NutriMatch.Services
+{
+    public class MealPlanService : IMealPlanService
+    {
+        private readonly AppDbContext _context;
+        private readonly Random _random;
+        private readonly Dictionary<string, float> _mealTypeDistribution;
+        public MealPlanService(AppDbContext context)
+        {
+            _context = context;
+            _random = new Random();
+            _mealTypeDistribution = new Dictionary<string, float>
+            {
+                { "breakfast", 0.25f },
+                { "lunch", 0.35f },
+                { "dinner", 0.35f },
+                { "snack", 0.05f }
+            };
+        }
+        public async Task<MealPlanResult> GenerateWeeklyMealPlanAsync(string userId, MealPlanRequest request)
+        {
+            var result = new MealPlanResult { Success = false };
+            try
+            {
+                var weeklyPlan = new WeeklyMealPlan
+                {
+                    UserId = userId,
+                    GeneratedAt = DateTime.UtcNow
+                };
+                var days = new[] { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
+                var mealTypes = new[] { "breakfast", "lunch", "dinner" };
+                var restaurantMealSlots = DistributeRestaurantMeals(request.RestaurantMealsPerWeek, days, mealTypes);
+                foreach (var day in days)
+                {
+                    var dailyMacros = new DailyMacros
+                    {
+                        Calories = request.DailyCalories,
+                        Protein = request.DailyProtein,
+                        Carbs = request.DailyCarbs,
+                        Fat = request.DailyFat
+                    };
+                    foreach (var mealType in mealTypes)
+                    {
+                        var mealSlot = new MealSlot
+                        {
+                            Day = day,
+                            MealType = mealType
+                        };
+                        var targetMacros = CalculateMealMacros(dailyMacros, mealType);
+                        var isRestaurantMeal = restaurantMealSlots.Contains($"{day}_{mealType}");
+                        if (isRestaurantMeal)
+                        {
+                            var restaurantMeal = await SelectRestaurantMealAsync(mealType, targetMacros);
+                            if (restaurantMeal != null)
+                            {
+                                mealSlot.RestaurantMeal = restaurantMeal;
+                                mealSlot.IsRestaurantMeal = true;
+                            }
+                            else
+                            {
+                                var recipe = await SelectRecipeAsync(mealType, targetMacros, request.DietaryRestrictions);
+                                mealSlot.Recipe = recipe;
+                                mealSlot.IsRestaurantMeal = false;
+                            }
+                        }
+                        else
+                        {
+                            var recipe = await SelectRecipeAsync(mealType, targetMacros, request.DietaryRestrictions);
+                            if (recipe != null)
+                            {
+                                mealSlot.Recipe = recipe;
+                                mealSlot.IsRestaurantMeal = false;
+                            }
+                        }
+                        weeklyPlan.MealSlots.Add(mealSlot);
+                    }
+                    var remainingCalories = CalculateRemainingCalories(weeklyPlan.MealSlots.Where(ms => ms.Day == day).ToList(), dailyMacros.Calories);
+                    if (remainingCalories > 100)
+                    {
+                        var snackMacros = new DailyMacros
+                        {
+                            Calories = remainingCalories,
+                            Protein = remainingCalories * 0.15f / 4,
+                            Carbs = remainingCalories * 0.50f / 4,
+                            Fat = remainingCalories * 0.35f / 9
+                        };
+                        var snackSlot = new MealSlot
+                        {
+                            Day = day,
+                            MealType = "snack"
+                        };
+                        var snackRecipe = await SelectRecipeAsync("snack", snackMacros, request.DietaryRestrictions);
+                        if (snackRecipe != null)
+                        {
+                            snackSlot.Recipe = snackRecipe;
+                            snackSlot.IsRestaurantMeal = false;
+                            weeklyPlan.MealSlots.Add(snackSlot);
+                        }
+                    }
+                }
+                _context.WeeklyMealPlans.Add(weeklyPlan);
+                await _context.SaveChangesAsync();
+                result.WeeklyMealPlan = weeklyPlan;
+                result.DailyMacroTotals = CalculateDailyMacroTotals(weeklyPlan);
+                result.Success = true;
+            }
+            catch (Exception ex)
+            {
+                result.ErrorMessage = $"Failed to generate meal plan: {ex.Message}";
+            }
+            return result;
+        }
+        public async Task<bool> DeleteMealPlanAsync(int id, string userId)
+        {
+            try
+            {
+                var mealPlan = await _context.WeeklyMealPlans
+                    .Include(wmp => wmp.MealSlots)
+                    .FirstOrDefaultAsync(wmp => wmp.Id == id && wmp.UserId == userId);
+                if (mealPlan == null)
+                {
+                    return false;
+                }
+                _context.MealSlots.RemoveRange(mealPlan.MealSlots);
+                _context.WeeklyMealPlans.Remove(mealPlan);
+                await _context.SaveChangesAsync();
+                return true;
+            }
+            catch (Exception ex)
+            {
+                return false;
+            }
+        }
+        private HashSet<string> DistributeRestaurantMeals(int totalRestaurantMeals, string[] days, string[] mealTypes)
+        {
+            var restaurantSlots = new HashSet<string>();
+            var availableSlots = new List<string>();
+            foreach (var day in days)
+            {
+                foreach (var mealType in mealTypes)
+                {
+                    availableSlots.Add($"{day}_{mealType}");
+                }
+            }
+            for (int i = 0; i < Math.Min(totalRestaurantMeals, availableSlots.Count); i++)
+            {
+                if (availableSlots.Count > 0)
+                {
+                    var randomIndex = _random.Next(availableSlots.Count);
+                    var selectedSlot = availableSlots[randomIndex];
+                    restaurantSlots.Add(selectedSlot);
+                    availableSlots.RemoveAt(randomIndex);
+                }
+            }
+            return restaurantSlots;
+        }
+        private DailyMacros CalculateMealMacros(DailyMacros dailyMacros, string mealType)
+        {
+            var distribution = _mealTypeDistribution.GetValueOrDefault(mealType, 0.25f);
+            return new DailyMacros
+            {
+                Calories = dailyMacros.Calories * distribution,
+                Protein = dailyMacros.Protein * distribution,
+                Carbs = dailyMacros.Carbs * distribution,
+                Fat = dailyMacros.Fat * distribution
+            };
+        }
+        private async Task<Recipe> SelectRecipeAsync(string mealType, DailyMacros targetMacros, List<string> dietaryRestrictions)
+        {
+            var query = _context.Recipes
+                .Include(r => r.RecipeIngredients)
+                .Where(r => r.RecipeStatus == "Accepted");
+            if (!string.IsNullOrEmpty(mealType))
+            {
+                query = query.Where(r => r.Type.Contains(mealType) || r.Type.Count == 0);
+            }
+            foreach (var restriction in dietaryRestrictions)
+            {
+                query = query.Where(r => !r.Type.Contains(restriction));
+            }
+            var recipes = await query.ToListAsync();
+            if (!recipes.Any())
+            {
+                recipes = await _context.Recipes
+                    .Where(r => r.RecipeStatus == "Accepted")
+                    .Take(50)
+                    .ToListAsync();
+            }
+            if (!recipes.Any()) return null;
+            var scoredRecipes = recipes.Select(recipe => new
+            {
+                Recipe = recipe,
+                Score = CalculateMacroMatchScore(recipe, targetMacros)
+            })
+            .OrderByDescending(x => x.Score)
+            .Take(10)
+            .ToList();
+            var selectedRecipe = scoredRecipes[_random.Next(Math.Min(3, scoredRecipes.Count))].Recipe;
+            return selectedRecipe;
+        }
+        private async Task<RestaurantMeal> SelectRestaurantMealAsync(string mealType, DailyMacros targetMacros)
+        {
+            var query = _context.RestaurantMeals.AsQueryable();
+            if (!string.IsNullOrEmpty(mealType))
+            {
+                query = query.Where(rm => rm.Type.Contains(mealType) || rm.Type.Count == 0);
+            }
+            var restaurantMeals = await query.Take(50).ToListAsync();
+            if (!restaurantMeals.Any()) return null;
+            var scoredMeals = restaurantMeals.Select(meal => new
+            {
+                Meal = meal,
+                Score = CalculateMacroMatchScore(meal, targetMacros)
+            })
+            .OrderByDescending(x => x.Score)
+            .Take(5)
+            .ToList();
+            return scoredMeals[_random.Next(scoredMeals.Count)].Meal;
+        }
+        private double CalculateMacroMatchScore(Recipe recipe, DailyMacros targetMacros)
+        {
+            var calorieMatch = 1.0 - Math.Abs(recipe.Calories - targetMacros.Calories) / targetMacros.Calories;
+            var proteinMatch = 1.0 - Math.Abs(recipe.Protein - targetMacros.Protein) / Math.Max(targetMacros.Protein, 1);
+            var carbMatch = 1.0 - Math.Abs(recipe.Carbs - targetMacros.Carbs) / Math.Max(targetMacros.Carbs, 1);
+            var fatMatch = 1.0 - Math.Abs(recipe.Fat - targetMacros.Fat) / Math.Max(targetMacros.Fat, 1);
+            return (calorieMatch * 0.4 + proteinMatch * 0.2 + carbMatch * 0.2 + fatMatch * 0.2) * 100;
+        }
+        private double CalculateMacroMatchScore(RestaurantMeal meal, DailyMacros targetMacros)
+        {
+            var calorieMatch = 1.0 - Math.Abs(meal.Calories - targetMacros.Calories) / targetMacros.Calories;
+            var proteinMatch = 1.0 - Math.Abs(meal.Protein - targetMacros.Protein) / Math.Max(targetMacros.Protein, 1);
+            var carbMatch = 1.0 - Math.Abs(meal.Carbs - targetMacros.Carbs) / Math.Max(targetMacros.Carbs, 1);
+            var fatMatch = 1.0 - Math.Abs(meal.Fat - targetMacros.Fat) / Math.Max(targetMacros.Fat, 1);
+            return (calorieMatch * 0.4 + proteinMatch * 0.2 + carbMatch * 0.2 + fatMatch * 0.2) * 100;
+        }
+        private float CalculateRemainingCalories(List<MealSlot> dayMeals, float targetCalories)
+        {
+            var totalCalories = dayMeals.Sum(ms => 
+                ms.IsRestaurantMeal ? (ms.RestaurantMeal?.Calories ?? 0) : (ms.Recipe?.Calories ?? 0));
+            return Math.Max(0, targetCalories - totalCalories);
+        }
+        private Dictionary<string, DailyMacros> CalculateDailyMacroTotals(WeeklyMealPlan weeklyPlan)
+        {
+            var dailyTotals = new Dictionary<string, DailyMacros>();
+            var days = new[] { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
+            foreach (var day in days)
+            {
+                var dayMeals = weeklyPlan.MealSlots.Where(ms => ms.Day == day).ToList();
+                dailyTotals[day] = new DailyMacros
+                {
+                    Calories = dayMeals.Sum(ms => ms.IsRestaurantMeal ? (ms.RestaurantMeal?.Calories ?? 0) : (ms.Recipe?.Calories ?? 0)),
+                    Protein = dayMeals.Sum(ms => ms.IsRestaurantMeal ? (ms.RestaurantMeal?.Protein ?? 0) : (ms.Recipe?.Protein ?? 0)),
+                    Carbs = dayMeals.Sum(ms => ms.IsRestaurantMeal ? (ms.RestaurantMeal?.Carbs ?? 0) : (ms.Recipe?.Carbs ?? 0)),
+                    Fat = dayMeals.Sum(ms => ms.IsRestaurantMeal ? (ms.RestaurantMeal?.Fat ?? 0) : (ms.Recipe?.Fat ?? 0))
+                };
+            }
+            return dailyTotals;
+        }
+        public async Task<List<Recipe>> GetSuitableRecipesAsync(string mealType, DailyMacros targetMacros, List<string> dietaryRestrictions)
+        {
+            var query = _context.Recipes
+                .Include(r => r.RecipeIngredients)
+                .Where(r => r.RecipeStatus == "Accepted");
+            if (!string.IsNullOrEmpty(mealType))
+            {
+                query = query.Where(r => r.Type.Contains(mealType));
+            }
+            foreach (var restriction in dietaryRestrictions)
+            {
+                query = query.Where(r => !r.Type.Contains(restriction));
+            }
+            return await query.ToListAsync();
+        }
+        public async Task<List<RestaurantMeal>> GetSuitableRestaurantMealsAsync(string mealType, DailyMacros targetMacros)
+        {
+            var query = _context.RestaurantMeals.AsQueryable();
+            if (!string.IsNullOrEmpty(mealType))
+            {
+                query = query.Where(rm => rm.Type.Contains(mealType));
+            }
+            return await query.ToListAsync();
+        }
+        public async Task<WeeklyMealPlan> GetMealPlanByIdAsync(int id, string userId)
+        {
+            return await _context.WeeklyMealPlans
+                .Include(wmp => wmp.MealSlots)
+                    .ThenInclude(ms => ms.Recipe)
+                        .ThenInclude(r => r.RecipeIngredients)
+                .Include(wmp => wmp.MealSlots)
+                    .ThenInclude(ms => ms.RestaurantMeal)
+                        .ThenInclude(rm => rm.Restaurant)
+                .FirstOrDefaultAsync(wmp => wmp.Id == id && wmp.UserId == userId);
+        }
+        public async Task<List<WeeklyMealPlan>> GetUserMealPlansAsync(string userId)
+        {
+            return await _context.WeeklyMealPlans
+                .Where(wmp => wmp.UserId == userId)
+                .Include(wmp => wmp.MealSlots)
+                .OrderByDescending(wmp => wmp.GeneratedAt)
+                .ToListAsync();
+        }
+    }
+}
Index: NutriMatch/Views/Admin/Index.cshtml
===================================================================
--- NutriMatch/Views/Admin/Index.cshtml	(revision 4a68273d2173d196bea803f19c4d87863b81f215)
+++ NutriMatch/Views/Admin/Index.cshtml	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -39,4 +39,9 @@
             padding: 1.5rem;
             transition: all 0.3s ease;
+            display: none; 
+        }
+        .bulk-actions-section.show {
+            display: block;
+            animation: slideDown 0.3s ease;
         }
         .bulk-actions-section:hover {
@@ -219,4 +224,13 @@
             margin-right: 1rem;
         }
+        .toast-container {
+            position: fixed;
+            top: 20px;
+            right: 20px;
+            z-index: 10000;
+        }
+        .toast {
+            margin-bottom: 1rem;
+        }
     </style>
 </head>
@@ -258,5 +272,5 @@
             </div>
         </div>
-        <div class="bulk-actions-section mb-4">
+        <div class="bulk-actions-section mb-4" id="bulkActionsSection">
             <div class="row align-items-center">
                 <div class="col-md-6">
@@ -269,9 +283,6 @@
                 </div>
                 <div class="col-md-6 text-end">
-                    <button class="btn btn-success me-2" id="bulkApprove" disabled>
+                    <button class="btn btn-success" id="bulkApprove" disabled>
                         <i class="fas fa-check me-1"></i>Bulk Approve
-                    </button>
-                    <button class="btn btn-danger" id="bulkDecline" disabled>
-                        <i class="fas fa-times me-1"></i>Bulk Decline
                     </button>
                 </div>
@@ -284,7 +295,4 @@
             </div>
             <div class="admin-actions">
-                <button class="btn btn-outline-primary" onclick="refreshPendingRecipes()">
-                    <i class="fas fa-sync-alt me-1"></i>Refresh
-                </button>
             </div>
         </div>
@@ -301,9 +309,14 @@
                         </span>
                     </div>
-                    <img src="@recipe.ImageUrl" alt="@recipe.Title" class="recipe-image" onclick="showRecipeDetails(@recipe.Id, true)">
+                    <img src="@recipe.ImageUrl" alt="@recipe.Title" class="recipe-image" onclick="showRecipeDetails(@recipe.Id, true,'Buttons')">
                     <div class="recipe-content">
                         <h3 class="recipe-title" onclick="showRecipeDetails(@recipe.Id, true)">@recipe.Title</h3>
                         <div class="recipe-meta">
-                            <span><i class="fas fa-user"></i>@recipe.User.UserName</span>
+                            <span>
+                                <i class="fas fa-user"></i>
+                                @(recipe.User.UserName.Length > 23 
+                                    ? recipe.User.UserName.Substring(0, 23) + "…" 
+                                    : recipe.User.UserName)
+                            </span>
                             <span><i class="fas fa-calendar"></i>@recipe.CreatedAt.ToString("MMM dd, yyyy")</span>
                         </div>
@@ -326,34 +339,4 @@
                             </div>
                         </div>
-                        <div class="admin-actions-buttons mt-3">
-                            <button class="btn btn-success btn-sm me-2" onclick="approveRecipe(@recipe.Id, this)">
-                                <i class="fas fa-check me-1"></i>Approve
-                            </button>
-                            <button class="btn btn-danger btn-sm me-2" onclick="declineRecipe(@recipe.Id, this)">
-                                <i class="fas fa-times me-1"></i>Decline
-                            </button>
-                            <button class="btn btn-outline-primary btn-sm" onclick="showRecipeDetails(@recipe.Id, true)">
-                                <i class="fas fa-eye me-1"></i>Review
-                            </button>
-                        </div>
-                        <div class="decline-reason-section mt-3" style="display: none;" id="declineReason_@recipe.Id">
-                            <label class="form-label small fw-bold">Reason for decline:</label>
-                            <select class="form-select form-select-sm mb-2" id="declineSelect_@recipe.Id">
-                                <option value="">Select a reason...</option>
-                                <option value="inappropriate_content">Inappropriate Content</option>
-                                <option value="incomplete_recipe">Incomplete Recipe</option>
-                                <option value="poor_quality_image">Poor Quality Image</option>
-                                <option value="incorrect_nutrition">Incorrect Nutrition Info</option>
-                                <option value="duplicate_recipe">Duplicate Recipe</option>
-                                <option value="other">Other</option>
-                            </select>
-                            <textarea class="form-control form-control-sm mb-2" placeholder="Additional notes (optional)" id="declineNotes_@recipe.Id" rows="2"></textarea>
-                            <div class="text-end">
-                                <button class="btn btn-outline-secondary btn-sm me-1" onclick="cancelDecline(@recipe.Id)">Cancel</button>
-                                <button class="btn btn-danger btn-sm" onclick="confirmDecline(@recipe.Id)">
-                                    <i class="fas fa-times me-1"></i>Confirm Decline
-                                </button>
-                            </div>
-                        </div>
                     </div>
                 </div>
@@ -379,4 +362,28 @@
         <p class="mt-3">Processing request...</p>
     </div>
+    <div id="toast-container" class="toast-container"></div>
+    <div id="declineModalContainer"></div>
+        <div class="modal fade" id="ingredientReviewModal" tabindex="-1" aria-labelledby="ingredientReviewModalLabel" aria-hidden="true">
+    <div class="modal-dialog modal-lg">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h5 class="modal-title" id="ingredientReviewModalLabel">Ingredient Review</h5>
+                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+                </div>
+                <div class="modal-body">
+                    <div id="ingredientReviewContent">
+                        <div class="text-center">
+                            <div class="spinner-border" role="status">
+                                <span class="visually-hidden">Loading...</span>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button onclick="showRecipeModal()" type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
+                </div>
+            </div>
+        </div>
+    </div>
     <script src="~/js/RecipeIndex.js"></script>
     <script>
@@ -394,5 +401,4 @@
         const recipeCheckboxes = document.querySelectorAll('.recipe-checkbox');
         const bulkApproveBtn = document.getElementById('bulkApprove');
-        const bulkDeclineBtn = document.getElementById('bulkDecline');
         selectAllCheckbox.addEventListener('change', function() {
             recipeCheckboxes.forEach(checkbox => {
@@ -410,5 +416,4 @@
         });
         bulkApproveBtn.addEventListener('click', handleBulkApprove);
-        bulkDeclineBtn.addEventListener('click', handleBulkDecline);
     }
     function toggleRecipeSelection(checkbox) {
@@ -423,8 +428,12 @@
         const selectedCheckboxes = document.querySelectorAll('.recipe-checkbox:checked');
         const bulkApproveBtn = document.getElementById('bulkApprove');
-        const bulkDeclineBtn = document.getElementById('bulkDecline');
+        const bulkActionsSection = document.getElementById('bulkActionsSection');
         const hasSelections = selectedCheckboxes.length > 0;
         bulkApproveBtn.disabled = !hasSelections;
-        bulkDeclineBtn.disabled = !hasSelections;
+        if (hasSelections) {
+            bulkActionsSection.classList.add('show');
+        } else {
+            bulkActionsSection.classList.remove('show');
+        }
     }
     function updateSelectAllState() {
@@ -442,8 +451,5 @@
         }
     }
-    function approveRecipe(recipeId, button) {
-        if (!confirm('Are you sure you want to approve this recipe?')) {
-            return;
-        }
+    function approveRecipe(recipeId) {
         showLoadingOverlay();
         const token = document.querySelector('input[name="__RequestVerificationToken"]').value;
@@ -462,4 +468,5 @@
                 showSuccess('Recipe approved successfully!');
                 removeRecipeCard(recipeId);
+                hideRecipeDetails();
             } else {
                 showError(data.message || 'Failed to approve recipe');
@@ -472,14 +479,36 @@
         });
     }
-    function declineRecipe(recipeId, button) {
-        const declineSection = document.getElementById(`declineReason_${recipeId}`);
-        const recipeCard = button.closest('.recipe-card');
-        declineSection.style.display = 'block';
-        button.style.display = 'none';
-        const actionButtons = recipeCard.querySelectorAll('.admin-actions-buttons .btn:not(.btn-outline-secondary)');
-        actionButtons.forEach(btn => {
-            if (btn !== button && !btn.classList.contains('btn-outline-secondary')) {
-                btn.style.display = 'none';
-            }
+    function declineRecipe(recipeId) {
+    fetch(`/Admin/DeclineReasonModel/${recipeId}`)
+        .then(response => {
+            if (!response.ok) {
+                throw new Error('Failed to load decline modal');
+            }
+            return response.text();
+        })
+        .then(html => {
+            const modalContainer = document.getElementById('declineModalContainer');
+            modalContainer.innerHTML = html;
+            const scripts = modalContainer.querySelectorAll('script');
+            scripts.forEach(script => {
+                const newScript = document.createElement('script');
+                if (script.src) {
+                    newScript.src = script.src;
+                } else {
+                    newScript.textContent = script.textContent;
+                }
+                document.body.appendChild(newScript);
+                document.body.removeChild(newScript);
+            });
+             hideRecipeDetails();
+            const modalElement = modalContainer.querySelector('#recipeDeclineModal');
+            if (modalElement) {
+                const modal = new bootstrap.Modal(modalElement);
+                modal.show();
+            }
+        })
+        .catch(error => {
+            console.error('Error loading decline modal:', error);
+            showError('Failed to load decline modal');
         });
     }
@@ -536,7 +565,4 @@
             return;
         }
-        if (!confirm(`Are you sure you want to approve ${selectedRecipes.length} recipe(s)?`)) {
-            return;
-        }
         showLoadingOverlay();
         const token = document.querySelector('input[name="__RequestVerificationToken"]').value;
@@ -565,12 +591,4 @@
         });
     }
-    function handleBulkDecline() {
-        const selectedRecipes = getSelectedRecipeIds();
-        if (selectedRecipes.length === 0) {
-            showError('No recipes selected');
-            return;
-        }
-        showBulkDeclineModal(selectedRecipes);
-    }
     function getSelectedRecipeIds() {
         const selectedCheckboxes = document.querySelectorAll('.recipe-checkbox:checked');
@@ -627,4 +645,67 @@
         recipeCards.forEach(card => recipeGrid.appendChild(card));
     }
+    function showRecipeDetails(recipeId, isAdmin = false, recipeControl = '') {
+        currentRecipeId = recipeId; 
+        const params = new URLSearchParams({
+            isOwner: true,
+            recipeDetailsDisplayContorol: recipeControl
+        });
+        fetch(`/Recipes/Details/${recipeId}?${params}`)
+            .then(response => {
+                if (!response.ok) {
+                    throw new Error('Network response was not ok');
+                }
+                return response.text();
+            })
+             .then(html => {
+        const modalContainer = document.getElementById('modalWindow');
+        modalContainer.innerHTML = html;
+        const existingScripts = document.querySelectorAll('script[data-recipe-modal]');
+        existingScripts.forEach(script => script.remove());
+        const scripts = modalContainer.querySelectorAll("script");
+        scripts.forEach(script => {
+            const newScript = document.createElement("script");
+            newScript.setAttribute('data-recipe-modal', 'true');
+            if (script.src) {
+                newScript.src = script.src;
+            } else {
+                newScript.textContent = `
+                    (function() {
+                        ${script.textContent}
+                    })();
+                `;
+            }
+            document.body.appendChild(newScript);
+            document.body.removeChild(newScript);
+        });
+                const modalElement = modalContainer.querySelector('.modal');
+                if (modalElement) {
+                    const modal = new bootstrap.Modal(modalElement);
+                    modal.show();
+                    modalElement.addEventListener('hidden.bs.modal', function () {
+                        modalContainer.innerHTML = '';
+                        if (typeof clickedCard !== 'undefined') {
+                            clickedCard.classList.remove('loading');
+                        }
+                    }); 
+                    modalElement.addEventListener('shown.bs.modal', function () {
+                        if (typeof clickedCard !== 'undefined') {
+                            clickedCard.classList.remove('loading');
+                        }
+                    });
+                } else {    
+                    if (typeof clickedCard !== 'undefined') {
+                        clickedCard.classList.remove('loading');
+                    }
+                }
+            })
+            .catch(err => {
+                console.error("Failed to fetch recipe details", err);
+                showError("Failed to load recipe details. Please try again.");
+                if (typeof clickedCard !== 'undefined') {
+                    clickedCard.classList.remove('loading');
+                }
+            });
+    }
     function removeRecipeCard(recipeId) {
         const recipeCard = document.querySelector(`[data-recipe-id="${recipeId}"]`);
@@ -655,268 +736,47 @@
         document.getElementById('loadingOverlay').style.display = 'none';
     }
-    function showSuccess(message) {
-        alert(message);
-    }
-    function showError(message) {
-        alert(message);
-    }
-    function refreshPendingRecipes() {
-        location.reload();
-    }
-    function showRecipeDetails(recipeId, isAdmin = false) {
-            fetch(`/Recipes/Details/${recipeId}`)
-        .then(response => {
-            if (!response.ok) {
-                throw new Error('Network response was not ok');
-            }
-            return response.text();
-        })
-        .then(html => {
-            const modalContainer = document.getElementById('modalWindow');
-            modalContainer.innerHTML = html;
-            const scripts = modalContainer.querySelectorAll("script");
-            scripts.forEach(script => {
-                const newScript = document.createElement("script");
-                if (script.src) {
-                    newScript.src = script.src;
-                } else {
-                    newScript.textContent = script.textContent;
-                }
-                document.body.appendChild(newScript);
-                document.body.removeChild(newScript);
-            });
-            const modalElement = modalContainer.querySelector('.modal');
-            if (modalElement) {
-                const modal = new bootstrap.Modal(modalElement);
-                modal.show();
-                modalElement.addEventListener('hidden.bs.modal', function () {
-                    modalContainer.innerHTML = '';
-                    clickedCard.classList.remove('loading');
-                }); 
-                modalElement.addEventListener('shown.bs.modal', function () {
-                    clickedCard.classList.remove('loading');
-                });
-            } else {    
-                clickedCard.classList.remove('loading');
-            }
-        })
-        .catch(err => {
-            console.error("Failed to fetch recipe details", err);
-            alert("Failed to load recipe details. Please try again.");
-            clickedCard.classList.remove('loading');
-        });
-            addAdminControlsToModal(recipeId);
-    }
-    function addAdminControlsToModal(recipeId) {
-        const modalFooter = document.querySelector('#modalWindow .modal-footer');
-        if (modalFooter) {
-            const adminControls = `
-                <div class="admin-modal-controls me-auto">
-                    <button class="btn btn-success me-2" onclick="approveRecipe(${recipeId}, this); closeModal();">
-                        <i class="fas fa-check me-1"></i>Approve Recipe
-                    </button>
-                    <button class="btn btn-danger" onclick="declineRecipeFromModal(${recipeId})">
-                        <i class="fas fa-times me-1"></i>Decline Recipe
-                    </button>
-                </div>
-            `;
-            modalFooter.insertAdjacentHTML('afterbegin', adminControls);
-        }
-    }
-    function declineRecipeFromModal(recipeId) {
-        const modalBody = document.querySelector('#modalWindow .modal-body');
-        const declineForm = `
-            <div class="decline-reason-modal mt-4 p-3" style="background: #fef2f2; border: 1px solid #fecaca; border-radius: 8px;">
-                <h6 class="text-danger mb-3">
-                    <i class="fas fa-exclamation-triangle me-2"></i>
-                    Decline Recipe
-                </h6>
-                <div class="mb-3">
-                    <label class="form-label">Reason for decline:</label>
-                    <select class="form-select" id="modalDeclineSelect">
-                        <option value="">Select a reason...</option>
-                        <option value="inappropriate_content">Inappropriate Content</option>
-                        <option value="incomplete_recipe">Incomplete Recipe</option>
-                        <option value="poor_quality_image">Poor Quality Image</option>
-                        <option value="incorrect_nutrition">Incorrect Nutrition Info</option>
-                        <option value="duplicate_recipe">Duplicate Recipe</option>
-                        <option value="other">Other</option>
-                    </select>
-                </div>
-                <div class="mb-3">
-                    <label class="form-label">Additional notes (optional):</label>
-                    <textarea class="form-control" id="modalDeclineNotes" rows="3" placeholder="Provide additional details about why this recipe is being declined..."></textarea>
-                </div>
-                <div class="text-end">
-                    <button class="btn btn-outline-secondary me-2" onclick="cancelModalDecline()">Cancel</button>
-                    <button class="btn btn-danger" onclick="confirmModalDecline(${recipeId})">
-                        <i class="fas fa-times me-1"></i>Confirm Decline
-                    </button>
-                </div>
-            </div>
-        `;
-        modalBody.insertAdjacentHTML('beforeend', declineForm);
-        const adminControls = document.querySelector('.admin-modal-controls');
-        if (adminControls) {
-            adminControls.style.display = 'none';
-        }
-    }
-    function cancelModalDecline() {
-        const declineForm = document.querySelector('.decline-reason-modal');
-        const adminControls = document.querySelector('.admin-modal-controls');
-        if (declineForm) {
-            declineForm.remove();
-        }
-        if (adminControls) {
-            adminControls.style.display = 'block';
-        }
-    }
-    function confirmModalDecline(recipeId) {
-        const reason = document.getElementById('modalDeclineSelect').value;
-        const notes = document.getElementById('modalDeclineNotes').value;
-        if (!reason) {
-            showError('Please select a reason for declining the recipe');
-            return;
-        }
-        showLoadingOverlay();
-        const token = document.querySelector('input[name="__RequestVerificationToken"]').value;
-        fetch('/Admin/DeclineRecipe', {
-            method: 'POST',
-            headers: {
-                'Content-Type': 'application/json',
-                'RequestVerificationToken': token
-            },
-            body: JSON.stringify({
-                recipeId: recipeId,
-            })
-        })
-        .then(response => response.json())
-        .then(data => {
-            hideLoadingOverlay();
-            if (data.success) {
-                showSuccess('Recipe declined successfully!');
-                closeModal();
-                removeRecipeCard(recipeId);
-            } else {
-                showError(data.message || 'Failed to decline recipe');
-            }
-        })
-        .catch(error => {
-            hideLoadingOverlay();
-            console.error('Error:', error);
-            showError('An error occurred while declining the recipe');
-        });
-    }
-    function closeModal() {
-        const modal = document.getElementById('modalWindow');
-        modal.innerHTML = '';
-    }
-    function showBulkDeclineModal(recipeIds) {
-        const modalHtml = `
-            <div class="modal fade show" style="display: block;" tabindex="-1">
-                <div class="modal-dialog modal-lg">
-                    <div class="modal-content">
-                        <div class="modal-header">
-                            <h5 class="modal-title text-danger">
-                                <i class="fas fa-exclamation-triangle me-2"></i>
-                                Bulk Decline Recipes
-                            </h5>
-                            <button type="button" class="btn-close" onclick="closeBulkDeclineModal()"></button>
-                        </div>
-                        <div class="modal-body">
-                            <div class="alert alert-warning">
-                                <i class="fas fa-info-circle me-2"></i>
-                                You are about to decline <strong>${recipeIds.length}</strong> recipe(s). This action cannot be undone.
-                            </div>
-                            <div class="mb-3">
-                                <label class="form-label fw-bold">Reason for decline:</label>
-                                <select class="form-select" id="bulkDeclineSelect" required>
-                                    <option value="">Select a reason...</option>
-                                    <option value="inappropriate_content">Inappropriate Content</option>
-                                    <option value="incomplete_recipe">Incomplete Recipe</option>
-                                    <option value="poor_quality_image">Poor Quality Image</option>
-                                    <option value="incorrect_nutrition">Incorrect Nutrition Info</option>
-                                    <option value="duplicate_recipe">Duplicate Recipe</option>
-                                    <option value="other">Other</option>
-                                </select>
-                            </div>
-                            <div class="mb-3">
-                                <label class="form-label fw-bold">Additional notes (optional):</label>
-                                <textarea class="form-control" id="bulkDeclineNotes" rows="4" placeholder="Provide additional details about why these recipes are being declined..."></textarea>
-                            </div>
-                        </div>
-                        <div class="modal-footer">
-                            <button type="button" class="btn btn-outline-secondary" onclick="closeBulkDeclineModal()">Cancel</button>
-                            <button type="button" class="btn btn-danger" onclick="confirmBulkDecline([${recipeIds.join(',')}])">
-                                <i class="fas fa-times me-1"></i>Decline ${recipeIds.length} Recipe(s)
-                            </button>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="modal-backdrop fade show"></div>
-        `;
-        document.getElementById('modalWindow').innerHTML = modalHtml;
-    }
-    function closeBulkDeclineModal() {
-        document.getElementById('modalWindow').innerHTML = '';
-    }
-    function confirmBulkDecline(recipeIds) {
-        const reason = document.getElementById('bulkDeclineSelect').value;
-        const notes = document.getElementById('bulkDeclineNotes').value;
-        if (!reason) {
-            showError('Please select a reason for declining the recipes');
-            return;
-        }
-        showLoadingOverlay();
-        closeBulkDeclineModal();
-        const token = document.querySelector('input[name="__RequestVerificationToken"]').value;
-        fetch('/Admin/BulkDeclineRecipes', {
-            method: 'POST',
-            headers: {
-                'Content-Type': 'application/json',
-                'RequestVerificationToken': token
-            },
-            body: JSON.stringify({
-                recipeIds: recipeIds
-            })
-        })
-        .then(response => response.json())
-        .then(data => {
-            hideLoadingOverlay();
-            if (data.success) {
-                showSuccess(`${data.declinedCount} recipe(s) declined successfully!`);
-                recipeIds.forEach(recipeId => removeRecipeCard(recipeId));
-            } else {
-                showError(data.message || 'Failed to decline recipes');
-            }
-        })
-        .catch(error => {
-            hideLoadingOverlay();
-            console.error('Error:', error);
-            showError('An error occurred during bulk decline');
-        });
-    }
     function createToast(message, type = 'info') {
         const toastContainer = document.getElementById('toast-container') || createToastContainer();
+        const toastId = 'toast-' + Date.now();
         const toast = document.createElement('div');
+        toast.id = toastId;
         toast.className = `toast align-items-center text-white bg-${type} border-0`;
         toast.setAttribute('role', 'alert');
         toast.setAttribute('aria-live', 'assertive');
         toast.setAttribute('aria-atomic', 'true');
+        const iconMap = {
+            'success': 'fas fa-check-circle',
+            'danger': 'fas fa-exclamation-circle',
+            'warning': 'fas fa-exclamation-triangle',
+            'info': 'fas fa-info-circle'
+        };
         toast.innerHTML = `
             <div class="d-flex">
                 <div class="toast-body">
+                    <i class="${iconMap[type] || iconMap.info} me-2"></i>
                     ${message}
                 </div>
-                <button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast"></button>
+                <button type="button" class="btn-close btn-close-white me-2 m-auto" onclick="removeToast('${toastId}')"></button>
             </div>
         `;
         toastContainer.appendChild(toast);
+        toast.style.display = 'block';
         setTimeout(() => {
-            if (toast.parentNode) {
-                toast.remove();
-            }
+            toast.classList.add('show');
+        }, 100);
+        setTimeout(() => {
+            removeToast(toastId);
         }, 5000);
+    }
+    function removeToast(toastId) {
+        const toast = document.getElementById(toastId);
+        if (toast) {
+            toast.classList.remove('show');
+            setTimeout(() => {
+                if (toast.parentNode) {
+                    toast.remove();
+                }
+            }, 300);
+        }
     }
     function createToastContainer() {
@@ -924,5 +784,5 @@
         container.id = 'toast-container';
         container.className = 'toast-container position-fixed top-0 end-0 p-3';
-        container.style.zIndex = '1055';
+        container.style.zIndex = '10000';
         document.body.appendChild(container);
         return container;
@@ -933,4 +793,14 @@
     function showError(message) {
         createToast(message, 'danger');
+    }
+    function showWarning(message) {
+        createToast(message, 'warning');
+    }
+    function showInfo(message) {
+        createToast(message, 'info');
+    }
+    function refreshPendingRecipes() {
+        showLoadingOverlay();
+        location.reload();
     }
     document.addEventListener('keydown', function(e) {
@@ -938,12 +808,137 @@
             e.preventDefault();
             const selectAllCheckbox = document.getElementById('selectAll');
-            selectAllCheckbox.checked = !selectAllCheckbox.checked;
-            selectAllCheckbox.dispatchEvent(new Event('change'));
+            if (selectAllCheckbox) {
+                selectAllCheckbox.checked = !selectAllCheckbox.checked;
+                selectAllCheckbox.dispatchEvent(new Event('change'));
+            }
         }
         if (e.key === 'Escape') {
             closeModal();
-            closeBulkDeclineModal();
+        }
+        if (e.key === 'F5' || ((e.ctrlKey || e.metaKey) && e.key === 'r')) {
+            e.preventDefault();
+            refreshPendingRecipes();
         }
     });
+    let autoRefreshInterval;
+    function startAutoRefresh(intervalMinutes = 5) {
+        if (autoRefreshInterval) {
+            clearInterval(autoRefreshInterval);
+        }
+        autoRefreshInterval = setInterval(() => {
+            if (document.visibilityState === 'visible') {
+                showInfo('Checking for new submissions...');
+                setTimeout(() => {
+                    refreshPendingRecipes();
+                }, 1000);
+            }
+        }, intervalMinutes * 60 * 1000);
+    }
+    function stopAutoRefresh() {
+        if (autoRefreshInterval) {
+            clearInterval(autoRefreshInterval);
+            autoRefreshInterval = null;
+        }
+    }
+    document.addEventListener('visibilitychange', function() {
+        if (document.visibilityState === 'visible') {
+            const lastRefresh = localStorage.getItem('lastAdminRefresh');
+            const now = Date.now();
+            if (!lastRefresh || (now - parseInt(lastRefresh)) > 2 * 60 * 1000) {
+                showInfo('Checking for updates...');
+                setTimeout(() => {
+                    refreshPendingRecipes();
+                }, 1000);
+            }
+        }
+    });
+    window.addEventListener('beforeunload', function() {
+        localStorage.setItem('lastAdminRefresh', Date.now().toString());
+    });
+    window.addEventListener('online', function() {
+        showSuccess('Connection restored. Refreshing data...');
+        setTimeout(() => {
+            refreshPendingRecipes();
+        }, 1000);
+    });
+    window.addEventListener('offline', function() {
+        showWarning('Connection lost. Some features may not work properly.');
+    });
+    console.log('Admin Panel initialized successfully');
+    function hideRecipeDetails(){
+        const modalWindow = document.getElementById('modalWindow');
+            const recipeDetailsModal = modalWindow?.querySelector('.modal');
+            if (recipeDetailsModal) {
+                const modalInstance = bootstrap.Modal.getInstance(recipeDetailsModal);
+                if (modalInstance) {
+                    modalInstance.hide();
+                }
+            }
+    }
+let currentRecipeId = null;
+window.viewIngredientReview = async function(ingredientId) {
+    console.log('Global viewIngredientReview called with ID:', ingredientId);
+    const recipeModal = document.getElementById('recipeModal');
+    if (recipeModal) {
+        const recipeModalInstance = bootstrap.Modal.getInstance(recipeModal);
+        if (recipeModalInstance) {
+            recipeModalInstance.hide();
+        }
+    }
+    setTimeout(async () => {
+        const modal = document.getElementById('ingredientReviewModal');
+        const content = document.getElementById('ingredientReviewContent');
+        if (!modal || !content) {
+            console.error('Modal or content container not found');
+            alert('Modal components not found');
+            return;
+        }
+        try {
+            content.innerHTML = `
+                <div class="text-center p-4">
+                    <div class="spinner-border text-primary" role="status">
+                        <span class="visually-hidden">Loading...</span>
+                    </div>
+                    <p class="mt-2">Loading ingredient details...</p>
+                </div>
+            `;
+            const bootstrapModal = new bootstrap.Modal(modal);
+            bootstrapModal.show();
+            const response = await fetch(`/Admin/GetIngredientReview/${ingredientId}`, {
+                method: 'GET',
+                headers: {
+                    'Content-Type': 'application/json',
+                    'X-Requested-With': 'XMLHttpRequest'
+                }
+            });
+            if (response.ok) {
+                const html = await response.text();
+                content.innerHTML = html;
+            } else {
+                content.innerHTML = `
+                    <div class="alert alert-danger">
+                        <h6>Error ${response.status}</h6>
+                        <p>Failed to load ingredient details.</p>
+                    </div>
+                `;
+            }
+        } catch (error) {
+            console.error('Error:', error);
+            content.innerHTML = `
+                <div class="alert alert-danger">
+                    <h6>Connection Error</h6>
+                    <p>${error.message}</p>
+                </div>
+            `;
+        }
+    }, 300);
+};
+function showRecipeModal(){
+    if (currentRecipeId) {
+        showRecipeDetails(currentRecipeId, true, 'Buttons');
+    } else {
+        console.error('No recipe ID stored - cannot restore recipe modal');
+    }
+}
     </script>
 </body>
Index: NutriMatch/Views/Admin/_IngredientReviewPartial.cshtml
===================================================================
--- NutriMatch/Views/Admin/_IngredientReviewPartial.cshtml	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Views/Admin/_IngredientReviewPartial.cshtml	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,112 @@
+@model NutriMatch.Models.Ingredient
+
+<div class="ingredient-review-container">
+    <div class="ingredient-header mb-3">
+        <h5 class="ingredient-name">@Model.Name</h5>
+        <small class="text-muted">Nutritional values per 100g</small>
+    </div>
+
+    <div class="nutrition-grid">
+        <div class="nutrition-item">
+            <div class="nutrition-label">
+                <i class="fas fa-fire text-danger"></i>
+                <span>Calories</span>
+            </div>
+            <div class="nutrition-value">@Model.Calories kcal</div>
+        </div>
+
+        <div class="nutrition-item">
+            <div class="nutrition-label">
+                <i class="fas fa-drumstick-bite text-success"></i>
+                <span>Protein</span>
+            </div>
+            <div class="nutrition-value">@Model.Protein g</div>
+        </div>
+
+        <div class="nutrition-item">
+            <div class="nutrition-label">
+                <i class="fas fa-bread-slice text-warning"></i>
+                <span>Carbohydrates</span>
+            </div>
+            <div class="nutrition-value">@Model.Carbs g</div>
+        </div>
+
+        <div class="nutrition-item">
+            <div class="nutrition-label">
+                <i class="fas fa-cheese text-info"></i>
+                <span>Fat</span>
+            </div>
+            <div class="nutrition-value">@Model.Fat g</div>
+        </div>
+    </div>
+
+    
+
+   
+</div>
+
+<style>
+.ingredient-review-container {
+    padding: 20px;
+}
+
+.ingredient-name {
+    color: #2c3e50;
+    font-weight: 600;
+    margin-bottom: 5px;
+}
+
+.nutrition-grid {
+    display: grid;
+    grid-template-columns: 1fr 1fr;
+    gap: 15px;
+    margin: 20px 0;
+}
+
+.nutrition-item {
+    background-color: #f8f9fa;
+    border: 1px solid #e9ecef;
+    border-radius: 8px;
+    padding: 15px;
+    text-align: center;
+}
+
+.nutrition-label {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    margin-bottom: 8px;
+    font-size: 14px;
+    color: #6c757d;
+    font-weight: 500;
+}
+
+.nutrition-label i {
+    margin-right: 6px;
+}
+
+.nutrition-value {
+    font-size: 18px;
+    font-weight: 600;
+    color: #2c3e50;
+}
+
+.submission-info {
+    background-color: #f1f3f4;
+    border-radius: 6px;
+    padding: 10px;
+    border-left: 4px solid #007bff;
+}
+
+.action-buttons {
+    display: flex;
+    gap: 10px;
+    justify-content: center;
+}
+
+.action-buttons .btn {
+    min-width: 120px;
+    font-weight: 500;
+}
+</style>
+
Index: NutriMatch/Views/Admin/_RecipeDeclineAdminPartial.cshtml
===================================================================
--- NutriMatch/Views/Admin/_RecipeDeclineAdminPartial.cshtml	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Views/Admin/_RecipeDeclineAdminPartial.cshtml	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,271 @@
+@model NutriMatch.Models.Recipe
+<div class="modal fade" id="recipeDeclineModal" tabindex="-1" aria-labelledby="recipeDeclineModalLabel" aria-hidden="true">
+    <div class="modal-dialog modal-dialog-centered">
+        <div class="modal-content">
+            <div class="modal-header bg-danger text-white">
+                <h5 class="modal-title" id="recipeDeclineModalLabel">
+                    <i class="fas fa-times-circle me-2"></i>
+                    Decline Recipe
+                </h5>
+                <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button>
+            </div>
+            <div class="modal-body">
+                <div class="recipe-info-section mb-4">
+                    <div class="row">
+                        <div class="col-3">
+                            <img src="@Model.ImageUrl" alt="@Model.Title" class="img-fluid rounded shadow-sm">
+                        </div>
+                        <div class="col-9">
+                            <h6 class="fw-bold mb-2">@Model.Title</h6>
+                            <p class="text-muted mb-1">
+                                <i class="fas fa-user me-1"></i>
+                                By @Model.User.UserName
+                            </p>
+                            <p class="text-muted mb-0">
+                                <i class="fas fa-calendar me-1"></i>
+                                Submitted @Model.CreatedAt.ToString("MMM dd, yyyy")
+                            </p>
+                        </div>
+                    </div>
+                </div>
+                <hr>
+                <form id="declineForm">
+                    <input type="hidden" id="declineRecipeId" value="@Model.Id">
+                    <div class="mb-3">
+                        <label for="declineReason" class="form-label fw-bold text-danger">
+                            <i class="fas fa-exclamation-triangle me-1"></i>
+                            Reason for Decline <span class="text-danger">*</span>
+                        </label>
+                        <select class="form-select" id="declineReason" required>
+                            <option value="">Please select a reason...</option>
+                            <option value="inappropriate_content">Inappropriate Content</option>
+                            <option value="incomplete_recipe">Incomplete Recipe Information</option>
+                            <option value="poor_quality_image">Poor Quality Image</option>
+                            <option value="incorrect_nutrition">Incorrect Nutrition Information</option>
+                            <option value="duplicate_recipe">Duplicate Recipe</option>
+                            <option value="unsafe_instructions">Unsafe Cooking Instructions</option>
+                            <option value="invalid_ingredient">Invalid Ingredient</option>
+                            <option value="spam_content">Spam Content</option>
+                            <option value="other">Other (Please specify in notes)</option>
+                        </select>
+                        <div class="invalid-feedback">
+                            Please select a reason for declining this recipe.
+                        </div>
+                    </div>
+                    <div class="mb-3">
+                        <label for="declineNotes" class="form-label fw-bold">
+                            <i class="fas fa-sticky-note me-1"></i>
+                            Additional Notes <span class="text-muted">(Optional)</span>
+                        </label>
+                        <textarea 
+                            class="form-control" 
+                            id="declineNotes" 
+                            rows="4" 
+                            placeholder="Provide additional details about why this recipe is being declined. This information will help the user understand the decision and improve future submissions."
+                            maxlength="500"></textarea>
+                        <div class="form-text">
+                            <span id="notesCounter">0</span>/500 characters
+                        </div>
+                    </div>
+                    <div class="alert alert-warning d-flex align-items-center" role="alert">
+                        <i class="fas fa-info-circle me-2"></i>
+                        <div>
+                            <strong>Note:</strong> Once declined, the recipe will be removed from the pending list and the user will be notified of the decision.
+                        </div>
+                    </div>
+                </form>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">
+                    <i class="fas fa-arrow-left me-1"></i>
+                    Cancel
+                </button>
+                <button type="button" class="btn btn-danger" id="confirmDeclineBtn" disabled>
+                    <i class="fas fa-times me-1"></i>
+                    Decline Recipe
+                </button>
+            </div>
+        </div>
+    </div>
+</div>
+<style>
+    .recipe-info-section {
+        background: #f8f9fa;
+        padding: 1rem;
+        border-radius: 8px;
+        border: 1px solid #e9ecef;
+    }
+    .recipe-info-section img {
+        width: 100%;
+        height: 60px;
+        object-fit: cover;
+    }
+    .modal-header.bg-danger {
+        border-bottom: 1px solid rgba(255, 255, 255, 0.2);
+    }
+    .form-label.fw-bold {
+        color: #495057;
+    }
+    .form-label .text-danger {
+        font-weight: normal;
+    }
+    .alert-warning {
+        background-color: #fff3cd;
+        border-color: #ffeaa7;
+        color: #856404;
+    }
+    #declineNotes:focus {
+        border-color: #dc3545;
+        box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
+    }
+    .form-select:focus {
+        border-color: #dc3545;
+        box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
+    }
+</style>
+<script>
+    document.addEventListener('DOMContentLoaded', function() {
+        initializeDeclineModal();
+    });
+    document.getElementById('recipeDeclineModal').addEventListener('shown.bs.modal', function() {
+        initializeDeclineModal();
+    });
+    function initializeDeclineModal() {
+        const declineReasonSelect = document.getElementById('declineReason');
+        const declineNotesTextarea = document.getElementById('declineNotes');
+        const confirmDeclineBtn = document.getElementById('confirmDeclineBtn');
+        const notesCounter = document.getElementById('notesCounter');
+        if (!declineReasonSelect || !confirmDeclineBtn) {
+            console.error('Required elements not found');
+            return;
+        }
+        const newDeclineReasonSelect = declineReasonSelect.cloneNode(true);
+        declineReasonSelect.parentNode.replaceChild(newDeclineReasonSelect, declineReasonSelect);
+        newDeclineReasonSelect.addEventListener('change', function() {
+            const confirmBtn = document.getElementById('confirmDeclineBtn');
+            if (confirmBtn) {
+                confirmBtn.disabled = !this.value;
+                console.log('Reason selected:', this.value, 'Button disabled:', confirmBtn.disabled);
+            }
+            if (this.value) {
+                this.classList.remove('is-invalid');
+            }
+        });
+        newDeclineReasonSelect.addEventListener('input', function() {
+            const confirmBtn = document.getElementById('confirmDeclineBtn');
+            if (confirmBtn) {
+                confirmBtn.disabled = !this.value;
+            }
+        });
+        if (declineNotesTextarea && notesCounter) {
+            declineNotesTextarea.addEventListener('input', function() {
+                const currentLength = this.value.length;
+                notesCounter.textContent = currentLength;
+                if (currentLength > 400) {
+                    notesCounter.style.color = '#dc3545';
+                } else if (currentLength > 300) {
+                    notesCounter.style.color = '#ffc107';
+                } else {
+                    notesCounter.style.color = '#6c757d';
+                }
+            });
+        }
+        confirmDeclineBtn.addEventListener('click', function() {
+            const recipeId = document.getElementById('declineRecipeId').value;
+            const reasonSelect = document.getElementById('declineReason');
+            const reason = reasonSelect.value;
+            const notes = document.getElementById('declineNotes').value.trim();
+            if (!reason) {
+                reasonSelect.classList.add('is-invalid');
+                reasonSelect.focus();
+                return;
+            }
+            this.disabled = true;
+            this.innerHTML = '<span class="spinner-border spinner-border-sm me-1" role="status"></span>Processing...';
+            processRecipeDecline(recipeId, reason, notes);
+        });
+    }
+    function processRecipeDecline(recipeId, reason, notes) {
+        const tokenElement = document.querySelector('input[name="__RequestVerificationToken"]');
+        const token = tokenElement ? tokenElement.value : '';
+        fetch('/Admin/DeclineRecipe', {
+            method: 'POST',
+            headers: {
+                'Content-Type': 'application/json',
+                'X-Requested-With': 'XMLHttpRequest',
+                'RequestVerificationToken': token
+            },
+            body: JSON.stringify({
+                recipeId: parseInt(recipeId),
+                reason: reason,
+                notes: notes || ''
+            })
+        })
+        .then(response => {
+            console.log('Response status:', response.status);
+            if (!response.ok) {
+                throw new Error(`HTTP error! status: ${response.status}`);
+            }
+            const contentType = response.headers.get('content-type');
+            if (!contentType || !contentType.includes('application/json')) {
+                return response.text().then(text => {
+                    console.error('Non-JSON response:', text);
+                    throw new Error('Server returned non-JSON response');
+                });
+            }
+            return response.json();
+        })
+        .then(data => {
+            if (data && data.success) {
+                const modal = bootstrap.Modal.getInstance(document.getElementById('recipeDeclineModal'));
+                modal.hide();
+                showSuccess('Recipe declined successfully!');
+                removeRecipeCard(recipeId);
+            } else {
+                const errorMessage = data && data.message ? data.message : 'Failed to decline recipe';
+                showError(errorMessage);
+                resetDeclineButton();
+            }
+        })
+        .catch(error => {
+            console.error('Error details:', error);
+            let errorMessage = 'An error occurred while declining the recipe';
+            if (error.message.includes('HTTP error! status: 500')) {
+                errorMessage = 'Server error occurred. Please check the server logs and try again.';
+            } else if (error.message.includes('non-JSON response')) {
+                errorMessage = 'Server returned an unexpected response format.';
+            }
+            showError(errorMessage);
+            resetDeclineButton();
+        });
+    }
+    function resetDeclineButton() {
+        const confirmBtn = document.getElementById('confirmDeclineBtn');
+        const reasonSelect = document.getElementById('declineReason');
+        if (confirmBtn && reasonSelect) {
+            const reason = reasonSelect.value;
+            confirmBtn.disabled = !reason;
+            confirmBtn.innerHTML = '<i class="fas fa-times me-1"></i>Decline Recipe';
+        }
+    }
+    document.getElementById('recipeDeclineModal').addEventListener('hidden.bs.modal', function() {
+        const form = document.getElementById('declineForm');
+        if (form) {
+            form.reset();
+        }
+        const confirmBtn = document.getElementById('confirmDeclineBtn');
+        if (confirmBtn) {
+            confirmBtn.disabled = true;
+            confirmBtn.innerHTML = '<i class="fas fa-times me-1"></i>Decline Recipe';
+        }
+        const reasonSelect = document.getElementById('declineReason');
+        if (reasonSelect) {
+            reasonSelect.classList.remove('is-invalid');
+        }
+        const notesCounter = document.getElementById('notesCounter');
+        if (notesCounter) {
+            notesCounter.textContent = '0';
+            notesCounter.style.color = '#6c757d';
+        }
+    });
+</script>
Index: NutriMatch/Views/Home/Index.cshtml
===================================================================
--- NutriMatch/Views/Home/Index.cshtml	(revision 4a68273d2173d196bea803f19c4d87863b81f215)
+++ NutriMatch/Views/Home/Index.cshtml	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -61,4 +61,80 @@
         </section>
     }
+    else{
+       <section class="welcome-back-section" style="margin-top: 100px; margin-bottom: 100px; position: relative;">
+    <div class="floating-elements">
+        <i class="fas fa-leaf floating-leaf" style="position: absolute; top: 15%; left: 8%; font-size: 1.5rem; color: rgba(76, 175, 80, 0.1); animation: float 8s ease-in-out infinite;"></i>
+        <i class="fas fa-seedling floating-leaf" style="position: absolute; top: 70%; right: 12%; font-size: 1.2rem; color: rgba(76, 175, 80, 0.08); animation: float 10s ease-in-out infinite; animation-delay: -3s;"></i>
+        <i class="fas fa-apple-alt floating-leaf" style="position: absolute; bottom: 20%; left: 15%; font-size: 1.3rem; color: rgba(76, 175, 80, 0.06); animation: float 12s ease-in-out infinite; animation-delay: -6s;"></i>
+    </div>
+    <div class="container">
+        <div class="row align-items-center">
+            <div class="col-lg-8">
+                <div class="welcome-content">
+                    <h1 class="welcome-title" style="color: #2c3e50; font-size: 2.8rem; font-weight: 700; margin-bottom: 16px; line-height: 1.2;">
+                        Welcome back, 
+                        <br>
+                        <span style="color: #4CAF50;">@User.Identity.Name</span>! 
+                        <span style="font-size: 2rem;">👋</span>
+                    </h1>
+                    <p class="welcome-subtitle" style="color: #64748b; font-size: 1.2rem; font-weight: 400; margin-bottom: 32px; max-width: 600px; line-height: 1.6;">
+                        Your personalized nutrition journey continues. Ready to discover delicious, macro-friendly recipes that align with your goals?
+                    </p>
+                    <div class="welcome-actions" style="display: flex; gap: 16px; align-items: center; flex-wrap: wrap;">
+                        <a href="/Recipes" class="btn btn-outline" style="background: transparent; color: #4CAF50; padding: 14px 28px; border-radius: 8px; text-decoration: none; font-weight: 500; font-size: 0.95rem; transition: all 0.2s ease; border: 1px solid #4CAF50; display: inline-flex; align-items: center;">
+                            <i class="fas fa-search" style="margin-right: 8px; font-size: 0.9rem;"></i>
+                            Browse Recipes
+                        </a>
+                    </div>
+                </div>
+            </div>
+            <div class="col-lg-4">
+                <div class="user-summary-card" style="background: white; border-radius: 16px; padding: 32px; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08); border: 1px solid rgba(0, 0, 0, 0.05); position: relative;">
+                     <div class="user-avatar" style="width: 64px; height: 64px; border-radius: 50%; margin: 0 auto 20px; display: flex; align-items: center; justify-content: center; font-size: 1.5rem; color: white; font-weight: 700; overflow: hidden; position: relative;">
+                        @if (!string.IsNullOrEmpty(ViewBag.UserPicture as string))
+                        {
+                            <img src="@ViewBag.UserPicture" 
+                                alt="@(ViewBag.UserName ?? User.Identity.Name)" 
+                                style="width: 100%; height: 100%; object-fit: cover; border-radius: 50%;" />
+                        }
+                        else
+                        {
+                            <div style="background: linear-gradient(135deg, #4CAF50, #45a049); width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; border-radius: 50%;">
+                                @if (!string.IsNullOrEmpty(User.Identity.Name))
+                                {
+                                    @User.Identity.Name.Substring(0, 1).ToUpper()
+                                }
+                                else
+                                {
+                                    <i class="fas fa-user"></i>
+                                }
+                            </div>
+                        }
+                    </div>
+                    <div class="text-center mb-24">
+                        <h3 style="color: #2c3e50; font-size: 1.3rem; font-weight: 600; margin-bottom: 4px;">@User.Identity.Name</h3>
+                    </div>
+                    <div class="stats-grid" style="display: flex; justify-content: center; gap: 3rem; text-align: center;">
+                        <div class="stat-item">
+                            <div style="color: #4CAF50; font-size: 1.6rem; font-weight: 700; margin-bottom: 4px;">@ViewBag.UserRecipesCount</div>
+                            <div style="color: #64748b; font-size: 0.8rem; font-weight: 500;">Recipes</div>
+                        </div>
+                        <div class="stat-item">
+                            <div style="color: #ff9500; font-size: 1.6rem; font-weight: 700; margin-bottom: 4px;">@ViewBag.AverageRating</div>
+                            <div style="color: #64748b; font-size: 0.8rem; font-weight: 500;">Rating</div>
+                        </div>
+                    </div>
+                    <div class="quick-action" style="margin-top: 28px; padding-top: 24px; border-top: 1px solid rgba(0, 0, 0, 0.06);">
+                        <a href="Recipes/MyRecipes" style="display: flex; align-items: center; justify-content: between; color: #4CAF50; text-decoration: none; font-weight: 500; font-size: 0.9rem; transition: color 0.2s ease;">
+                            <span>View My Recipes</span>
+                            <i class="fas fa-arrow-right" style="margin-left: auto; font-size: 0.8rem;"></i>
+                        </a>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</section>
+    }
     <section class="share-recipe-section">
         <div class="container">
@@ -112,5 +188,10 @@
                                         <i class="fas fa-star"></i> @recipe.Rating
                                     </span>
-                                    <span><i class="fas fa-user"></i> @recipe.User.UserName</span>
+                                    <span>
+                                        <i class="fas fa-user"></i>
+                                        @(recipe.User.UserName.Length > 23 
+                                            ? recipe.User.UserName.Substring(0, 23) + "…" 
+                                            : recipe.User.UserName)
+                                    </span>
                                     <span><i class="fas fa-calendar"> </i> @recipe.CreatedAt.ToString("MMM dd, yyyy")</span>
                                 </div>
Index: NutriMatch/Views/MealPlan/Create.cshtml
===================================================================
--- NutriMatch/Views/MealPlan/Create.cshtml	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Views/MealPlan/Create.cshtml	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,378 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Create Meal Plan</title>
+    <link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
+    <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
+    <style>
+        body {
+            background: #c3d5c4;
+            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;
+            margin: 0;
+            padding: 0;
+            min-height: 100vh;
+        }
+        .container {
+            margin: 0 auto;
+            padding: 40px 20px;
+        }
+        .header-section {
+            text-align: center;
+            margin-bottom: 40px;
+            color: #2c5530;
+        }
+        .header-section h1 {
+            font-size: 2.5rem;
+            font-weight: 700;
+            margin-bottom: 10px;
+        }
+        .header-section p {
+            font-size: 1.1rem;
+            color: #6b7280;
+            margin: 0;
+        }
+        .main-card {
+            background: rgba(255, 255, 255, 0.95);
+            border-radius: 24px;
+            padding: 40px;
+            box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
+            backdrop-filter: blur(10px);
+            border: 1px solid rgba(255, 255, 255, 0.2);
+        }
+        .section-title {
+            display: flex;
+            align-items: center;
+            font-size: 1.3rem;
+            font-weight: 600;
+            color: #2c5530;
+            margin-bottom: 20px;
+            padding-bottom: 12px;
+            border-bottom: 2px solid #e5e7eb;
+        }
+        .section-title i {
+            color: #4ade80;
+            margin-right: 12px;
+            font-size: 1.1rem;
+        }
+        .form-group {
+            margin-bottom: 24px;
+        }
+        .form-label {
+            font-weight: 600;
+            color: #374151;
+            margin-bottom: 8px;
+            display: flex;
+            align-items: center;
+            font-size: 0.95rem;
+        }
+        .form-label i {
+            margin-right: 8px;
+            width: 16px;
+            text-align: center;
+        }
+        .form-control {
+            border: 2px solid #e5e7eb;
+            border-radius: 12px;
+            padding: 14px 16px;
+            font-size: 0.95rem;
+            transition: all 0.2s ease;
+            background: white;
+        }
+        .form-control:focus {
+            border-color: #4ade80;
+            box-shadow: 0 0 0 3px rgba(74, 222, 128, 0.1);
+        }
+        .macro-grid {
+            display: grid;
+            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+            gap: 20px;
+            margin-bottom: 30px;
+        }
+        .macro-item {
+            background: #f8fafc;
+            border: 2px solid #e5e7eb;
+            border-radius: 16px;
+            padding: 20px;
+            transition: all 0.2s ease;
+        }
+        .macro-item:hover {
+            border-color: #4ade80;
+            background: #f0fdf4;
+        }
+        .macro-item .form-control {
+            border: 1px solid #d1d5db;
+            margin-top: 8px;
+        }
+        .help-text {
+            font-size: 0.8rem;
+            color: #6b7280;
+            margin-top: 4px;
+        }
+        .submit-section {
+            text-align: center;
+            margin-top: 40px;
+            padding-top: 30px;
+            border-top: 2px solid #e5e7eb;
+        }
+        .btn-create {
+            background: #4ade80;
+            color: white;
+            border: none;
+            border-radius: 16px;
+            padding: 16px 40px;
+            font-size: 1.1rem;
+            font-weight: 600;
+            transition: all 0.3s ease;
+            box-shadow: 0 4px 12px rgba(74, 222, 128, 0.3);
+        }
+        .btn-create:hover {
+            background: #22c55e;
+            transform: translateY(-2px);
+            box-shadow: 0 8px 25px rgba(74, 222, 128, 0.4);
+            color: white;
+        }
+        .btn-create:disabled {
+            background: #9ca3af;
+            transform: none;
+            box-shadow: none;
+        }
+        .success-message {
+            background: #d1f2d9;
+            color: #0d5016;
+            padding: 16px 20px;
+            border-radius: 12px;
+            border: 1px solid #7dd87f;
+            margin-bottom: 24px;
+            display: flex;
+            align-items: center;
+        }
+        .success-message i {
+            margin-right: 12px;
+            color: #16a34a;
+        }
+        .error-message {
+            background: #fed7d7;
+            color: #9b2c2c;
+            padding: 16px 20px;
+            border-radius: 12px;
+            border: 1px solid #feb2b2;
+            margin-bottom: 24px;
+        }
+        .error-message i {
+            margin-right: 12px;
+        }
+        .error-message ul {
+            margin: 8px 0 0 0;
+            padding-left: 20px;
+        }
+        .icon-fire { color: #ef4444; }
+        .icon-protein { color: #8b5cf6; }
+        .icon-carbs { color: #f59e0b; }
+        .icon-fat { color: #06b6d4; }
+        .icon-restaurant { color: #ec4899; }
+        @@media (max-width: 768px) {
+            .container {
+                padding: 20px 16px;
+            }
+            .main-card {
+                padding: 24px;
+                border-radius: 20px;
+            }
+            .macro-grid {
+                grid-template-columns: 1fr;
+                gap: 16px;
+            }
+            .header-section h1 {
+                font-size: 2rem;
+            }
+        }
+        .modal {
+    position: fixed;
+    z-index: 1000;
+    left: 0;
+    top: 0;
+    width: 100%;
+    height: 100%;
+    background-color: rgba(0, 0, 0, 0.5);
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+.modal-content {
+    background-color: white;
+    border-radius: 8px;
+    padding: 0;
+    width: 90%;
+    max-width: 500px;
+    max-height: 90vh;
+    overflow-y: auto;
+    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
+}
+.modal-header {
+    padding: 1.5rem;
+    border-bottom: 1px solid #eee;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+}
+.modal-header h3 {
+    margin: 0;
+    color: #333;
+}
+.close {
+    font-size: 24px;
+    font-weight: bold;
+    color: #999;
+    cursor: pointer;
+    transition: color 0.2s;
+}
+.close:hover {
+    color: #333;
+}
+.modal-body {
+    padding: 1.5rem;
+}
+.btn-secondary {
+    background-color: #6c757d;
+    color: white;
+    border: none;
+    padding: 0.75rem 1.5rem;
+    border-radius: 4px;
+    cursor: pointer;
+    margin-right: 0.5rem;
+    transition: background-color 0.2s;
+}
+.btn-secondary:hover {
+    background-color: #5a6268;
+}
+.add-ingredient-option {
+    padding: 12px;
+    cursor: pointer;
+    border-bottom: 1px solid #eee;
+    color: #007bff;
+    font-weight: 500;
+    transition: background-color 0.2s;
+}
+.add-ingredient-option:hover {
+    background-color: #f8f9fa;
+}
+.add-ingredient-option:last-child {
+    border-bottom: none;
+}
+    </style>
+</head>
+<body>
+    <div class="container">
+        <div class="header-section">
+            <h1>Create Meal Plan</h1>
+            <p>Generate your personalized weekly meal plan tailored to your nutrition goals</p>
+        </div>
+        <div class="main-card">
+            @if (TempData["Success"] != null)
+            {
+                <div class="success-message">
+                    <i class="fas fa-check-circle"></i>
+                    @TempData["Success"]
+                </div>
+            }
+            @if (!ViewData.ModelState.IsValid)
+            {
+                <div class="error-message">
+                    <i class="fas fa-exclamation-triangle"></i>
+                    <strong>Please correct the following errors:</strong>
+                    <ul class="mb-0">
+                        @foreach (var error in ViewData.ModelState.Values.SelectMany(v => v.Errors))
+                        {
+                            <li>@error.ErrorMessage</li>
+                        }
+                    </ul>
+                </div>
+            }
+            <form asp-action="Create" method="post" id="mealPlanForm">
+                @Html.AntiForgeryToken()
+                <div class="section-title">
+                    <i class="fas fa-chart-pie"></i>
+                    Daily Macro Requirements
+                </div>
+                <div class="macro-grid">
+                    <div class="macro-item">
+                        <label for="DailyCalories" class="form-label">
+                            <i class="fas fa-fire icon-fire"></i>
+                            Daily Calories
+                        </label>
+                        <input type="number" class="form-control" id="DailyCalories" name="DailyCalories"
+                               min="1200" max="5000" value="@(Model?.DailyCalories ?? 2000)" required>
+                        <div class="help-text">1200 - 5000 calories</div>
+                    </div>
+                    <div class="macro-item">
+                        <label for="DailyProtein" class="form-label">
+                            <i class="fas fa-drumstick-bite icon-protein"></i>
+                            Daily Protein (g)
+                        </label>
+                        <input type="number" class="form-control" id="DailyProtein" name="DailyProtein"
+                               min="50" max="300" value="@(Model?.DailyProtein ?? 150)" required>
+                        <div class="help-text">50 - 300 grams</div>
+                    </div>
+                    <div class="macro-item">
+                        <label for="DailyCarbs" class="form-label">
+                            <i class="fas fa-bread-slice icon-carbs"></i>
+                            Daily Carbs (g)
+                        </label>
+                        <input type="number" class="form-control" id="DailyCarbs" name="DailyCarbs"
+                               min="100" max="600" value="@(Model?.DailyCarbs ?? 200)" required>
+                        <div class="help-text">100 - 600 grams</div>
+                    </div>
+                    <div class="macro-item">
+                        <label for="DailyFat" class="form-label">
+                            <i class="fas fa-cheese icon-fat"></i>
+                            Daily Fat (g)
+                        </label>
+                        <input type="number" class="form-control" id="DailyFat" name="DailyFat"
+                               min="30" max="200" value="@(Model?.DailyFat ?? 78)" required>
+                        <div class="help-text">30 - 200 grams</div>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <label for="RestaurantMealsPerWeek" class="form-label">
+                        <i class="fas fa-utensils icon-restaurant"></i>
+                        Restaurant Meals Per Week
+                    </label>
+                    <input type="number" class="form-control" id="RestaurantMealsPerWeek" name="RestaurantMealsPerWeek"
+                           min="0" max="21" value="@(Model?.RestaurantMealsPerWeek ?? 3)" required>
+                    <div class="help-text">0 - 21 meals per week</div>
+                </div>
+                <div class="submit-section">
+                    <button type="submit" class="btn btn-create">
+                        <span class="btn-text">
+                            <i class="fas fa-sparkles me-2"></i>
+                            Generate Meal Plan
+                        </span>
+                    </button>
+                </div>
+            </form>
+        </div>
+    </div>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/js/bootstrap.bundle.min.js"></script>
+    <script>
+        document.getElementById('DailyCalories').addEventListener('input', function() {
+            const calories = parseFloat(this.value);
+            if (calories && calories >= 1200) {
+                const proteinCals = calories * 0.30;
+                const carbCals = calories * 0.40;
+                const fatCals = calories * 0.30;
+                document.getElementById('DailyProtein').value = Math.round(proteinCals / 4);
+                document.getElementById('DailyCarbs').value = Math.round(carbCals / 4);
+                document.getElementById('DailyFat').value = Math.round(fatCals / 9);
+            }
+        });
+        document.getElementById('mealPlanForm').addEventListener('submit', function() {
+            const submitBtn = this.querySelector('button[type="submit"]');
+            const btnText = submitBtn.querySelector('.btn-text');
+            btnText.innerHTML = '<i class="fas fa-spinner fa-spin me-2"></i>Generating...';
+            submitBtn.disabled = true;
+        });
+    </script>
+</body>
+</html>
Index: NutriMatch/Views/MealPlan/Details.cshtml
===================================================================
--- NutriMatch/Views/MealPlan/Details.cshtml	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Views/MealPlan/Details.cshtml	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,653 @@
+@model NutriMatch.Models.WeeklyMealPlan
+@{
+    ViewBag.Title = "Weekly Meal Plan";
+    Layout = "~/Views/Shared/_Layout.cshtml";
+}
+<style>
+   :root {
+    --primary-green: #2ECC71;
+    --dark-green: #27AE60;
+    --light-green: #58D68D;
+    --light-green-gray: #bbcabe;
+    --dark-gray: #2C3E50;
+    --light-gray: #ECF0F1;
+    --nutri-light-gray: #f3f4f6;
+    --nutri-green-dark: #22c55e;
+    --danger-red: #dc2626;
+    --danger-red-hover: #b91c1c;
+}
+body {
+    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+    background: linear-gradient(135deg, var(--light-pink) 0%, white 50%, var(--light-green-gray) 100%);
+    min-height: 100vh;
+}
+    .container {
+        max-width: 1200px;
+        margin: 0 auto;
+        padding: 40px 20px;
+    }
+    .header-section {
+        text-align: center;
+        margin-bottom: 30px;
+        color: #2c5530;
+    }
+    .header-section h1 {
+        margin-top: 3rem;
+        font-size: 2.5rem;
+        font-weight: 700;
+        margin-bottom: 8px;
+    }
+    .header-section p {
+        font-size: 1.1rem;
+        color: #6b7280;
+        margin-bottom: 8px;
+    }
+    .generated-date {
+        color: #9ca3af;
+        font-size: 0.9rem;
+        margin-bottom: 0;
+    }
+    .navigation-bar {
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        margin-bottom: 30px;
+        gap: 16px;
+    }
+    .nav-btn {
+        display: inline-flex;
+        align-items: center;
+        gap: 8px;
+        background: rgba(255, 255, 255, 0.95);
+        color: #374151;
+        text-decoration: none;
+        border: none;
+        padding: 12px 20px;
+        border-radius: 12px;
+        font-weight: 600;
+        font-size: 0.95rem;
+        transition: all 0.2s ease;
+        box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+        cursor: pointer;
+    }
+    .nav-btn:hover {
+        background: white;
+        color: #374151;
+        transform: translateY(-1px);
+        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+    }
+    .nav-btn.delete {
+        background: var(--danger-red);
+        color: white;
+    }
+    .nav-btn.delete:hover {
+        background: var(--danger-red-hover);
+        color: white;
+    }
+    .days-container {
+        display: grid;
+        grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
+        gap: 24px;
+        margin-bottom: 40px;
+    }
+    .day-card {
+        background: rgba(255, 255, 255, 0.95);
+        border-radius: 20px;
+        padding: 24px;
+        box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
+        transition: all 0.2s ease;
+        border: 1px solid rgba(255, 255, 255, 0.2);
+    }
+    .day-card:hover {
+        transform: translateY(-2px);
+        box-shadow: 0 8px 30px rgba(0, 0, 0, 0.12);
+    }
+    .day-header {
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        margin-bottom: 20px;
+        padding-bottom: 16px;
+        border-bottom: 2px solid #f1f5f9;
+    }
+    .day-name {
+        font-size: 1.4rem;
+        font-weight: 700;
+        color: #2c5530;
+    }
+    .day-calories {
+        background: #4ade80;
+        color: white;
+        padding: 6px 14px;
+        border-radius: 20px;
+        font-size: 0.85rem;
+        font-weight: 600;
+    }
+    .meals-container {
+        display: flex;
+        flex-direction: column;
+        gap: 12px;
+    }
+    .meal-card {
+        background: #f8fafc;
+        border-radius: 12px;
+        padding: 16px;
+        border-left: 4px solid #4ade80;
+        transition: all 0.2s ease;
+        position: relative;
+    }
+    .meal-card.breakfast {
+        background: #fef3c7;
+        border-left-color: #f59e0b;
+    }
+    .meal-card.lunch {
+        background: #dbeafe;
+        border-left-color: #3b82f6;
+    }
+    .meal-card.dinner {
+        background: #fce7f3;
+        border-left-color: #ec4899;
+    }
+    .meal-card.snack {
+        background: #ede9fe;
+        border-left-color: #8b5cf6;
+    }
+    .meal-card:hover {
+        transform: translateX(2px);
+    }
+    .meal-card.clickable {
+        cursor: pointer;
+    }
+    .meal-card.clickable:hover {
+        transform: translateX(4px);
+        box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
+    }
+    .meal-card.loading {
+        opacity: 0.6;
+        pointer-events: none;
+    }
+    .meal-card.loading::after {
+        content: '';
+        position: absolute;
+        top: 50%;
+        left: 50%;
+        width: 20px;
+        height: 20px;
+        margin: -10px 0 0 -10px;
+        border: 2px solid #f3f3f3;
+        border-top: 2px solid #4ade80;
+        border-radius: 50%;
+        animation: spin 1s linear infinite;
+    }
+    @@keyframes spin {
+        0% { transform: rotate(0deg); }
+        100% { transform: rotate(360deg); }
+    }
+    .meal-header {
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        margin-bottom: 8px;
+    }
+    .meal-type {
+        font-weight: 700;
+        font-size: 0.8rem;
+        text-transform: uppercase;
+        letter-spacing: 0.5px;
+    }
+    .meal-type.breakfast { color: #d97706; }
+    .meal-type.lunch { color: #2563eb; }
+    .meal-type.dinner { color: #db2777; }
+    .meal-type.snack { color: #7c3aed; }
+    .restaurant-badge {
+        background: #ef4444;
+        color: white;
+        padding: 3px 8px;
+        border-radius: 12px;
+        font-size: 0.7rem;
+        font-weight: 600;
+        text-transform: uppercase;
+        letter-spacing: 0.3px;
+    }
+    .recipe-badge {
+        background: #4ade80;
+        color: white;
+        padding: 3px 8px;
+        border-radius: 12px;
+        font-size: 0.7rem;
+        font-weight: 600;
+        text-transform: uppercase;
+        letter-spacing: 0.3px;
+    }
+    .meal-name {
+        font-size: 1.05rem;
+        font-weight: 600;
+        color: #374151;
+        margin-bottom: 4px;
+        line-height: 1.3;
+    }
+    .meal-restaurant {
+        font-size: 0.85rem;
+        color: #6b7280;
+        font-style: italic;
+        margin-bottom: 8px;
+    }
+    .meal-macros {
+        display: flex;
+        gap: 8px;
+        flex-wrap: wrap;
+    }
+    .macro-badge {
+        background: rgba(255, 255, 255, 0.8);
+        padding: 4px 10px;
+        border-radius: 16px;
+        font-size: 0.75rem;
+        font-weight: 600;
+        color: #374151;
+        border: 1px solid rgba(255, 255, 255, 0.5);
+    }
+    .empty-day {
+        text-align: center;
+        color: #9ca3af;
+        font-style: italic;
+        padding: 20px;
+        background: #f8fafc;
+        border-radius: 12px;
+    }
+    .summary-card {
+        background: rgba(255, 255, 255, 0.95);
+        border-radius: 20px;
+        padding: 32px;
+        box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
+        border: 1px solid rgba(255, 255, 255, 0.2);
+    }
+    .summary-header {
+        text-align: center;
+        margin-bottom: 24px;
+    }
+    .summary-header h2 {
+        color: #2c5530;
+        font-size: 1.8rem;
+        font-weight: 700;
+        margin-bottom: 8px;
+    }
+    .summary-header p {
+        color: #6b7280;
+        margin: 0;
+    }
+    .summary-grid {
+        display: grid;
+        grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
+        gap: 16px;
+    }
+    .summary-item {
+        background: #f0fdf4;
+        border: 2px solid #bbf7d0;
+        border-radius: 16px;
+        padding: 20px;
+        text-align: center;
+        transition: all 0.2s ease;
+    }
+    .summary-item:hover {
+        background: #dcfce7;
+        border-color: #4ade80;
+    }
+    .summary-label {
+        font-size: 0.8rem;
+        color: #6b7280;
+        margin-bottom: 8px;
+        text-transform: uppercase;
+        letter-spacing: 0.5px;
+        font-weight: 600;
+    }
+    .summary-value {
+        font-size: 1.6rem;
+        font-weight: 700;
+        color: #16a34a;
+        line-height: 1;
+    }
+    .modal {
+        display: none;
+        position: fixed;
+        left: 0;
+        top: 0;
+        width: 100%;
+        height: 100%;
+        overflow: auto;
+        background-color: rgba(0, 0, 0, 0.5);
+        backdrop-filter: blur(4px);
+    }
+    .modal-content {
+        background-color: #fefefe;
+        margin: 15% auto;
+        padding: 30px;
+        border: none;
+        border-radius: 20px;
+        width: 90%;
+        box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);
+    }
+    .delete-modal-content {
+        max-width: 450px;
+        text-align: center;
+    }
+    .modal-header {
+        color: var(--danger-red);
+        font-size: 1.5rem;
+        font-weight: 700;
+        margin-bottom: 16px;
+        display: flex;
+        justify-content: center;
+    }
+    .modal-body {
+        color: #374151;
+        font-size: 1rem;
+        line-height: 1.5;
+        margin-bottom: 24px;
+    }
+    .modal-buttons {
+        display: flex;
+        gap: 12px;
+        justify-content: center;
+    }
+    .modal-btn {
+        padding: 10px 24px;
+        border: none;
+        border-radius: 8px;
+        font-weight: 600;
+        cursor: pointer;
+        transition: all 0.2s ease;
+        font-size: 0.9rem;
+    }
+    .modal-btn.confirm {
+        background: var(--danger-red);
+        color: white;
+    }
+    .modal-btn.confirm:hover {
+        background: var(--danger-red-hover);
+    }
+    .modal-btn.cancel {
+        background: #f3f4f6;
+        color: #374151;
+    }
+    .modal-btn.cancel:hover {
+        background: #e5e7eb;
+    }
+    @@media (max-width: 768px) {
+        .container {
+            padding: 20px 16px;
+        }
+        .days-container {
+            grid-template-columns: 1fr;
+            gap: 20px;
+        }
+        .navigation-bar {
+            flex-direction: column;
+            align-items: stretch;
+        }
+        .header-section h1 {
+            font-size: 2rem;
+        }
+        .summary-grid {
+            grid-template-columns: repeat(2, 1fr);
+        }
+        .meal-macros {
+            justify-content: center;
+        }
+        .day-card, .summary-card {
+            padding: 20px;
+        }
+        .modal-content {
+            margin: 30% auto;
+            padding: 24px;
+        }
+        .modal-buttons {
+            flex-direction: column;
+        }
+    }
+   @@keyframes fadeInUp {
+        from {
+            opacity: 0;
+            transform: translateY(20px);
+        }
+        to {
+            opacity: 1;
+            transform: translateY(0);
+        }
+    }
+    .day-card {
+        animation: fadeInUp 0.5s ease forwards;
+    }
+</style>
+<div class="container">
+    <div class="header-section">
+        <h1>Your Weekly Meal Plan</h1>
+        <p>Perfectly balanced nutrition for every day of the week</p>
+        <div class="generated-date">
+            Generated on @Model.GeneratedAt.ToString("MMMM dd, yyyy 'at' h:mm tt")
+        </div>
+    </div>
+    <div class="navigation-bar">
+        <a href="@Url.Action("Index", "MealPlan")" class="nav-btn">
+            <i class="fas fa-arrow-left"></i>
+            Back to My Plans
+        </a>
+        <button class="nav-btn delete" onclick="showDeleteModal()">
+            <i class="fas fa-trash-alt"></i>
+            Delete Plan
+        </button>
+    </div>
+    <div class="days-container">
+        @{
+            var days = new[] { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" };
+            var dayMeals = Model.MealSlots.GroupBy(ms => ms.Day).ToDictionary(g => g.Key, g => g.ToList());
+        }
+        @foreach (var day in days)
+        {
+            var meals = dayMeals.ContainsKey(day) ? dayMeals[day] : new List<NutriMatch.Models.MealSlot>();
+            var dailyCalories = meals.Sum(m => m.IsRestaurantMeal ? (m.RestaurantMeal?.Calories ?? 0) : (m.Recipe?.Calories ?? 0));
+            <div class="day-card">
+                <div class="day-header">
+                    <div class="day-name">@day</div>
+                    <div class="day-calories">@((int)dailyCalories) cal</div>
+                </div>
+                @if (meals.Any())
+                {
+                    <div class="meals-container">
+                        @foreach (var meal in meals.OrderBy(m => GetMealOrder(m.MealType)))
+                        {
+                            @if (meal.IsRestaurantMeal && meal.RestaurantMeal != null)
+                            {
+                                <div class="meal-card @meal.MealType">
+                                    <div class="meal-header">
+                                        <span class="meal-type @meal.MealType">@meal.MealType</span>
+                                        <span class="restaurant-badge">Restaurant</span>
+                                    </div>
+                                    <div class="meal-name">@meal.RestaurantMeal.ItemName</div>
+                                    <div class="meal-restaurant">@meal.RestaurantMeal.RestaurantName</div>
+                                    <div class="meal-macros">
+                                        <span class="macro-badge">@((int)meal.RestaurantMeal.Calories) cal</span>
+                                        <span class="macro-badge">@((int)meal.RestaurantMeal.Protein)g protein</span>
+                                        <span class="macro-badge">@((int)meal.RestaurantMeal.Carbs)g carbs</span>
+                                        <span class="macro-badge">@((int)meal.RestaurantMeal.Fat)g fat</span>
+                                    </div>
+                                </div>
+                            }
+                            else if (meal.Recipe != null)
+                            {
+                                <div class="meal-card @meal.MealType clickable" onclick="handleMealCardClick(event, @meal.Recipe.Id)">
+                                    <div class="meal-header">
+                                        <span class="meal-type @meal.MealType">@meal.MealType</span>
+                                        <span class="recipe-badge">Recipe</span>
+                                    </div>
+                                    <div class="meal-name">@meal.Recipe.Title</div>
+                                    <div class="meal-macros">
+                                        <span class="macro-badge">@((int)meal.Recipe.Calories) cal</span>
+                                        <span class="macro-badge">@((int)meal.Recipe.Protein)g protein</span>
+                                        <span class="macro-badge">@((int)meal.Recipe.Carbs)g carbs</span>
+                                        <span class="macro-badge">@((int)meal.Recipe.Fat)g fat</span>
+                                    </div>
+                                </div>
+                            }
+                        }
+                    </div>
+                }
+                else
+                {
+                    <div class="empty-day">No meals planned for this day</div>
+                }
+            </div>
+        }
+    </div>
+    <div class="summary-card">
+        <div class="summary-header">
+            <h2>Weekly Overview</h2>
+            <p>Your nutritional breakdown for the entire week</p>
+        </div>
+        @{
+            var totalCalories = Model.MealSlots.Sum(ms => ms.IsRestaurantMeal ? (ms.RestaurantMeal?.Calories ?? 0) : (ms.Recipe?.Calories ?? 0));
+            var totalProtein = Model.MealSlots.Sum(ms => ms.IsRestaurantMeal ? (ms.RestaurantMeal?.Protein ?? 0) : (ms.Recipe?.Protein ?? 0));
+            var totalCarbs = Model.MealSlots.Sum(ms => ms.IsRestaurantMeal ? (ms.RestaurantMeal?.Carbs ?? 0) : (ms.Recipe?.Carbs ?? 0));
+            var totalFat = Model.MealSlots.Sum(ms => ms.IsRestaurantMeal ? (ms.RestaurantMeal?.Fat ?? 0) : (ms.Recipe?.Fat ?? 0));
+            var restaurantMeals = Model.MealSlots.Count(ms => ms.IsRestaurantMeal);
+        }
+        <div class="summary-grid">
+            <div class="summary-item">
+                <div class="summary-label">Total Calories</div>
+                <div class="summary-value">@((int)totalCalories)</div>
+            </div>
+            <div class="summary-item">
+                <div class="summary-label">Total Protein</div>
+                <div class="summary-value">@((int)totalProtein)g</div>
+            </div>
+            <div class="summary-item">
+                <div class="summary-label">Total Carbs</div>
+                <div class="summary-value">@((int)totalCarbs)g</div>
+            </div>
+            <div class="summary-item">
+                <div class="summary-label">Total Fat</div>
+                <div class="summary-value">@((int)totalFat)g</div>
+            </div>
+            <div class="summary-item">
+                <div class="summary-label">Restaurant Meals</div>
+                <div class="summary-value">@restaurantMeals</div>
+            </div>
+            <div class="summary-item">
+                <div class="summary-label">Home Cooked</div>
+                <div class="summary-value">@(Model.MealSlots.Count - restaurantMeals)</div>
+            </div>
+        </div>
+    </div>
+</div>
+<div id="modalWindow"></div>
+<div id="deleteModal" class="modal">
+    <div class="delete-modal-content modal-content">
+        <div class="modal-header">
+            <i class="fas fa-exclamation-triangle"></i>
+            Delete Meal Plan
+        </div>
+        <div class="modal-body">
+            Are you sure you want to delete this meal plan? This action cannot be undone and all meal data will be permanently removed.
+        </div>
+        <div class="modal-buttons">
+            <button class="modal-btn cancel" onclick="hideDeleteModal()">Cancel</button>
+            <button class="modal-btn confirm" onclick="confirmDelete()">Delete Plan</button>
+        </div>
+    </div>
+</div>
+<form id="deleteForm" method="post" action="@Url.Action("Delete", "MealPlan")" style="display: none;">
+    @Html.AntiForgeryToken()
+    <input type="hidden" name="id" value="@Model.Id" />
+</form>
+<script>
+    function showRecipeDetailsFromMealPlan(recipeId) {
+        const clickedCard = event.currentTarget;
+        clickedCard.classList.add('loading');
+        fetch(`/Recipes/Details/${recipeId}`)
+            .then(response => {
+                if (!response.ok) {
+                    throw new Error('Network response was not ok');
+                }
+                return response.text();
+            })
+            .then(html => {
+                const modalContainer = document.getElementById('modalWindow');
+                modalContainer.innerHTML = html;
+                const scripts = modalContainer.querySelectorAll("script");
+                scripts.forEach(script => {
+                    const newScript = document.createElement("script");
+                    if (script.src) {
+                        newScript.src = script.src;
+                    } else {
+                        newScript.textContent = script.textContent;
+                    }
+                    document.body.appendChild(newScript);
+                    document.body.removeChild(newScript);
+                });
+                const modalElement = modalContainer.querySelector('.modal');
+                if (modalElement) {
+                    const modal = new bootstrap.Modal(modalElement);
+                    modal.show();
+                    modalElement.addEventListener('hidden.bs.modal', function () {
+                        modalContainer.innerHTML = '';
+                        clickedCard.classList.remove('loading');
+                    }); 
+                    modalElement.addEventListener('shown.bs.modal', function () {
+                        clickedCard.classList.remove('loading');
+                    });
+                } else {    
+                    clickedCard.classList.remove('loading');
+                }
+            })
+            .catch(err => {
+                console.error("Failed to fetch recipe details", err);
+                alert("Failed to load recipe details. Please try again.");
+                clickedCard.classList.remove('loading');
+            });
+    }
+    function handleMealCardClick(event, recipeId) {
+        if (recipeId && recipeId > 0) {
+            showRecipeDetailsFromMealPlan(recipeId);
+        }
+    }
+    function showDeleteModal() {
+        document.getElementById('deleteModal').style.display = 'block';
+        document.body.style.overflow = 'hidden';
+    }
+    function hideDeleteModal() {
+        document.getElementById('deleteModal').style.display = 'none';
+        document.body.style.overflow = 'auto';
+    }
+    function confirmDelete() {
+        document.getElementById('deleteForm').submit();
+    }
+    window.onclick = function(event) {
+        const modal = document.getElementById('deleteModal');
+        if (event.target === modal) {
+            hideDeleteModal();
+        }
+    }
+    document.addEventListener('keydown', function(event) {
+        if (event.key === 'Escape') {
+            hideDeleteModal();
+        }
+    });
+    document.addEventListener('DOMContentLoaded', function() {
+        const cards = document.querySelectorAll('.day-card');
+        cards.forEach((card, index) => {
+            card.style.animationDelay = `${index * 0.1}s`;
+        });
+    });
+</script>
+@functions {
+    private int GetMealOrder(string mealType)
+    {
+        return mealType?.ToLower() switch
+        {
+            "breakfast" => 1,
+            "lunch" => 2,
+            "dinner" => 3,
+            "snack" => 4,
+            _ => 5
+        };
+    }
+}
Index: NutriMatch/Views/MealPlan/Index.cshtml
===================================================================
--- NutriMatch/Views/MealPlan/Index.cshtml	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Views/MealPlan/Index.cshtml	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,424 @@
+@model List<WeeklyMealPlan>
+@{
+    ViewData["Title"] = "My Meal Plans";
+}
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>@ViewData["Title"]</title>
+    <link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
+    <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
+    <style>
+    :root {
+    --primary-green: #2ECC71;
+    --dark-green: #27AE60;
+    --light-green: #58D68D;
+    --light-green-gray: #bbcabe;
+    --dark-gray: #2C3E50;
+    --light-gray: #ECF0F1;
+    --nutri-light-gray: #f3f4f6;
+    --nutri-green-dark: #22c55e;
+}
+body {
+    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
+    background: linear-gradient(135deg, var(--light-pink) 0%, white 50%, var(--light-green-gray) 100%);
+    min-height: 100vh;
+}
+        .container {
+            max-width: 1200px;
+            margin: 0 auto;
+            padding: 40px 20px;
+        }
+        .header-section {
+            margin-top: 3rem;
+            text-align: center;
+            margin-bottom: 40px;
+            color: #2c5530;
+        }
+        .header-section h1 {
+            font-size: 2.8rem;
+            font-weight: 700;
+            margin-bottom: 12px;
+        }
+        .header-section p {
+            font-size: 1.1rem;
+            color: #6b7280;
+            margin: 0;
+        }
+        .alert-message {
+            padding: 16px 20px;
+            border-radius: 12px;
+            margin-bottom: 30px;
+            display: flex;
+            align-items: center;
+            font-weight: 500;
+        }
+        .alert-message i {
+            margin-right: 12px;
+        }
+        .alert-success {
+            background: rgba(209, 250, 229, 0.9);
+            color: #065f46;
+            border: 1px solid #6ee7b7;
+        }
+        .alert-error {
+            background: rgba(254, 226, 226, 0.9);
+            color: #991b1b;
+            border: 1px solid #fca5a5;
+        }
+        .plans-grid {
+            display: grid;
+            grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
+            gap: 24px;
+        }
+        .plan-card {
+            background: rgba(255, 255, 255, 0.95);
+            border-radius: 20px;
+            overflow: hidden;
+            box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
+            transition: all 0.3s ease;
+            cursor: pointer;
+            border: 1px solid rgba(255, 255, 255, 0.2);
+            height: 100%;
+        }
+        .plan-card:hover {
+            transform: translateY(-4px);
+            box-shadow: 0 12px 40px rgba(0, 0, 0, 0.15);
+        }
+        .plan-card-header {
+            background: linear-gradient(135deg, #4ade80 0%, #22c55e 100%);
+            color: white;
+            padding: 20px;
+            position: relative;
+            overflow: hidden;
+        }
+        .plan-card-header::before {
+            content: '';
+            position: absolute;
+            top: 0;
+            left: -100%;
+            width: 100%;
+            height: 100%;
+            background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent);
+            transition: left 0.5s ease;
+        }
+        .plan-card:hover .plan-card-header::before {
+            left: 100%;
+        }
+        .plan-title {
+            font-size: 1.2rem;
+            font-weight: 700;
+            margin-bottom: 4px;
+            display: flex;
+            align-items: center;
+            gap: 8px;
+        }
+        .plan-date {
+            font-size: 0.85rem;
+            opacity: 0.9;
+            display: flex;
+            align-items: center;
+            gap: 6px;
+        }
+        .plan-card-body {
+            padding: 20px;
+            flex: 1;
+            display: flex;
+            flex-direction: column;
+        }
+        .plan-stats {
+            display: grid;
+            grid-template-columns: 1fr 1fr;
+            gap: 12px;
+            margin-bottom: 16px;
+        }
+        .stat-box {
+            background: #f8fafc;
+            border: 1px solid #e2e8f0;
+            border-radius: 12px;
+            padding: 12px;
+            text-align: center;
+            transition: all 0.2s ease;
+        }
+        .stat-box:hover {
+            background: #f0fdf4;
+            border-color: #4ade80;
+        }
+        .stat-number {
+            font-size: 1.4rem;
+            font-weight: 700;
+            color: #16a34a;
+            display: block;
+            line-height: 1;
+        }
+        .stat-label {
+            font-size: 0.75rem;
+            color: #6b7280;
+            text-transform: uppercase;
+            font-weight: 600;
+            letter-spacing: 0.5px;
+            margin-top: 4px;
+        }
+        .meal-preview {
+            background: #f8fafc;
+            border-radius: 12px;
+            padding: 14px;
+            margin-bottom: 16px;
+            flex: 1;
+        }
+        .meal-preview h6 {
+            color: #374151;
+            font-weight: 600;
+            margin-bottom: 8px;
+            font-size: 0.85rem;
+            display: flex;
+            align-items: center;
+            gap: 6px;
+        }
+        .meal-list {
+            font-size: 0.8rem;
+            color: #6b7280;
+            line-height: 1.4;
+        }
+        .meal-list div {
+            margin-bottom: 2px;
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+        }
+        .view-plan-btn {
+            background: #4ade80;
+            color: white;
+            text-decoration: none;
+            border: none;
+            padding: 12px 16px;
+            border-radius: 12px;
+            font-weight: 600;
+            text-align: center;
+            transition: all 0.2s ease;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            gap: 8px;
+            font-size: 0.9rem;
+        }
+        .view-plan-btn:hover {
+            background: #22c55e;
+            color: white;
+            text-decoration: none;
+        }
+        .create-new-card {
+            background: rgba(255, 255, 255, 0.7);
+            border: 3px dashed #4ade80;
+            border-radius: 20px;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            min-height: 300px;
+            transition: all 0.3s ease;
+            cursor: pointer;
+            text-decoration: none;
+            color: #16a34a;
+        }
+        .create-new-card:hover {
+            background: rgba(255, 255, 255, 0.9);
+            border-color: #22c55e;
+            color: #15803d;
+            transform: translateY(-2px);
+            box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1);
+        }
+        .create-new-content {
+            text-align: center;
+            padding: 20px;
+        }
+        .create-new-content i {
+            font-size: 3.5rem;
+            margin-bottom: 16px;
+            display: block;
+            color: #4ade80;
+        }
+        .create-new-content h4 {
+            font-weight: 700;
+            margin-bottom: 8px;
+            font-size: 1.2rem;
+        }
+        .create-new-content p {
+            margin: 0;
+            font-size: 0.9rem;
+            color: #6b7280;
+        }
+        .empty-state {
+            text-align: center;
+            padding: 60px 20px;
+            color: #374151;
+        }
+        .empty-state i {
+            font-size: 4rem;
+            margin-bottom: 24px;
+            color: #9ca3af;
+        }
+        .empty-state h3 {
+            font-size: 1.8rem;
+            font-weight: 700;
+            margin-bottom: 12px;
+            color: #2c5530;
+        }
+        .empty-state p {
+            font-size: 1rem;
+            margin-bottom: 30px;
+            color: #6b7280;
+            max-width: 500px;
+            margin-left: auto;
+            margin-right: auto;
+        }
+        .btn-create-first {
+            background: rgba(255, 255, 255, 0.9);
+            color: #16a34a;
+            border: 2px solid #4ade80;
+            padding: 16px 32px;
+            border-radius: 16px;
+            font-size: 1rem;
+            font-weight: 600;
+            transition: all 0.3s ease;
+            text-decoration: none;
+            display: inline-flex;
+            align-items: center;
+            gap: 10px;
+        }
+        .btn-create-first:hover {
+            background: #4ade80;
+            color: white;
+            border-color: #22c55e;
+            transform: translateY(-2px);
+            box-shadow: 0 8px 25px rgba(74, 222, 128, 0.3);
+        }
+        @@media (max-width: 768px) {
+            .container {
+                padding: 20px 16px;
+            }
+            .plans-grid {
+                grid-template-columns: 1fr;
+                gap: 20px;
+            }
+            .header-section h1 {
+                font-size: 2.2rem;
+            }
+            .plan-card-header, .plan-card-body {
+                padding: 16px;
+            }
+            .empty-state {
+                padding: 40px 16px;
+            }
+        }
+        @@keyframes slideInUp {
+            from {
+                opacity: 0;
+                transform: translateY(30px);
+            }
+            to {
+                opacity: 1;
+                transform: translateY(0);
+            }
+        }
+        .plan-card {
+            animation: slideInUp 0.6s ease forwards;
+            opacity: 0;
+        }
+        .create-new-card {
+            animation: slideInUp 0.6s ease forwards;
+            opacity: 0;
+        }
+    </style>
+</head>
+<body>
+    <div class="container">
+        <div class="header-section">
+            <h1>
+                <i class="fas fa-calendar-alt" style="color: #4ade80; margin-right: 16px;"></i>
+                My Meal Plans
+            </h1>
+            <p>Manage and view your personalized weekly meal plans</p>
+        </div>
+        @if (TempData["Success"] != null)
+        {
+            <div class="alert-message alert-success">
+                <i class="fas fa-check-circle"></i>
+                @TempData["Success"]
+            </div>
+        }
+        @if (TempData["Error"] != null)
+        {
+            <div class="alert-message alert-error">
+                <i class="fas fa-exclamation-triangle"></i>
+                @TempData["Error"]
+            </div>
+        }
+        @if (Model == null || !Model.Any())
+        {
+            <div class="empty-state">
+                <i class="fas fa-utensils"></i>
+                <h3>No Meal Plans Yet</h3>
+                <p>You haven't created any meal plans yet. Start by creating your first personalized weekly meal plan tailored to your nutrition goals!</p>
+                <a href="@Url.Action("Create", "MealPlan")" class="btn-create-first">
+                    <i class="fas fa-plus"></i>
+                    Create Your First Meal Plan
+                </a>
+            </div>
+        }
+        else
+        {
+            <div class="plans-grid">
+                <a href="@Url.Action("Create", "MealPlan")" class="create-new-card">
+                    <div class="create-new-content">
+                        <i class="fas fa-plus-circle"></i>
+                        <h4>Create New Meal Plan</h4>
+                        <p>Generate a fresh weekly meal plan</p>
+                    </div>
+                </a>
+                @foreach (var mealPlan in Model.OrderByDescending(m => m.GeneratedAt))
+                {
+                    <div class="plan-card" onclick="location.href='@Url.Action("Details", "MealPlan", new { id = mealPlan.Id })'">
+                        <div class="plan-card-header">
+                            <div class="plan-title">
+                                <i class="fas fa-calendar-week"></i>
+                                Weekly Meal Plan #@mealPlan.Id
+                            </div>
+                            <div class="plan-date">
+                                <i class="fas fa-clock"></i>
+                                @mealPlan.GeneratedAt.ToString("MMM dd, yyyy 'at' h:mm tt")
+                            </div>
+                        </div>
+                        <div class="plan-card-body">
+                            <div class="plan-stats">
+                                <div class="stat-box">
+                                    <span class="stat-number">@(mealPlan.MealSlots?.Count ?? 0)</span>
+                                    <span class="stat-label">Meals</span>
+                                </div>
+                                <div class="stat-box">
+                                    <span class="stat-number">7</span>
+                                    <span class="stat-label">Days</span>
+                                </div>
+                            </div>
+                            <a href="@Url.Action("Details", "MealPlan", new { id = mealPlan.Id })" class="view-plan-btn">
+                                <i class="fas fa-arrow-right"></i>
+                                View Full Plan
+                            </a>
+                        </div>
+                    </div>
+                }
+            </div>
+        }
+    </div>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/js/bootstrap.bundle.min.js"></script>
+    <script>
+        document.addEventListener('DOMContentLoaded', function() {
+            const cards = document.querySelectorAll('.plan-card, .create-new-card');
+            cards.forEach((card, index) => {
+                card.style.animationDelay = `${index * 0.1}s`;
+            });
+        });
+    </script>
+</body>
+</html>
Index: NutriMatch/Views/Recipes/Create.cshtml
===================================================================
--- NutriMatch/Views/Recipes/Create.cshtml	(revision 4a68273d2173d196bea803f19c4d87863b81f215)
+++ NutriMatch/Views/Recipes/Create.cshtml	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -20,4 +20,5 @@
             <div class="form-content">
                 <form asp-action="Create" enctype="multipart/form-data">
+                    @Html.AntiForgeryToken()
                     <div class="form-group">
                         <label for="Title" class="label">Recipe Title</label>
@@ -35,7 +36,7 @@
                             <div class="flex-row">
                                 <input type="text" 
-                                       class="input flex-2" 
-                                       placeholder="Search ingredients..." 
-                                       id="ingredientSearch">
+                                    class="input flex-2" 
+                                    placeholder="Search ingredients..." 
+                                    id="ingredientSearch">
                                 <select class="input flex-1" id="ingredientUnit">
                                     <option value="">Unit</option>
@@ -48,12 +49,15 @@
                                 </select>
                                 <input type="number" 
-                                       class="input flex-1" 
-                                       placeholder="Amount" 
-                                       id="ingredientQuantity" 
-                                       step="0.01" 
-                                       min="0">
+                                    class="input flex-1" 
+                                    placeholder="Amount" 
+                                    id="ingredientQuantity" 
+                                    step="0.01" 
+                                    min="0">
                                 <button type="button" class="btn btn-primary" id="addIngredientButton">
                                     Add
                                 </button>
+                                <button type="button" class="btn btn-secondary add-new-ingredient-btn" id="addNewIngredientBtn" style="display: none;">
+                                        + Create New Ingredient
+                                 </button>
                             </div>
                             <div class="dropdown" id="ingredientDropdown"></div>
@@ -80,5 +84,5 @@
                     </div>
                     <div class="form-group">
-                    <label class="form-label">Recipe Photo</label>
+                        <label class="form-label">Recipe Photo</label>
                         <div class="file-upload-area" id="fileUploadArea">
                             <div class="file-upload-icon">📷</div>
@@ -101,5 +105,6 @@
         </a>
     </div>
+    <partial name="_AddIngredientModal" />
+    <script src="~/js/RecipeCreate.js"></script>
 </body>
 </html>
-<script src="~/js/RecipeCreate.js"></script>
Index: NutriMatch/Views/Recipes/Edit.cshtml
===================================================================
--- NutriMatch/Views/Recipes/Edit.cshtml	(revision 4a68273d2173d196bea803f19c4d87863b81f215)
+++ NutriMatch/Views/Recipes/Edit.cshtml	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -102,7 +102,10 @@
             </div>
         </div>
-        <a href="/Recipes" class="back-link">
+        @if(!@ViewBag.RequireChange)
+        {
+           <a href="/Recipes" class="back-link">
             ← Back to Recipes
-        </a>
+            </a>
+        }
     </div>
 </body>
@@ -115,2 +118,19 @@
 </script>
 <script src="~/js/RecipeEdit.js"></script>
+<script>
+    const requireChange = @((ViewBag.RequireChange ?? false).ToString().ToLower());
+    document.addEventListener("DOMContentLoaded", () => {
+        if (!requireChange) return; 
+        const form = document.querySelector("form");
+        let changed = false;
+        form.addEventListener("input", () => {
+            changed = true;
+        });
+        form.addEventListener("submit", (e) => {
+            if (!changed) {
+                e.preventDefault();
+                alert("Please make a change before saving.");
+            }
+        });
+    });
+</script>
Index: NutriMatch/Views/Recipes/Index.cshtml
===================================================================
--- NutriMatch/Views/Recipes/Index.cshtml	(revision 4a68273d2173d196bea803f19c4d87863b81f215)
+++ NutriMatch/Views/Recipes/Index.cshtml	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -108,5 +108,10 @@
                                 <i class="fas fa-star"></i> @recipe.Rating
                             </span>
-                            <span><i class="fas fa-user"></i>@recipe.User.UserName</span>
+                            <span>
+                                <i class="fas fa-user"></i>
+                                @(recipe.User.UserName.Length > 23 
+                                    ? recipe.User.UserName.Substring(0, 23) + "…" 
+                                    : recipe.User.UserName)
+                            </span>
                             <span><i class="fas fa-calendar"> </i> @recipe.CreatedAt.ToString("MMM dd, yyyy")</span>
                         </div>
Index: NutriMatch/Views/Recipes/MyRecipes.cshtml
===================================================================
--- NutriMatch/Views/Recipes/MyRecipes.cshtml	(revision 4a68273d2173d196bea803f19c4d87863b81f215)
+++ NutriMatch/Views/Recipes/MyRecipes.cshtml	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -23,5 +23,4 @@
     }
     .container {
-        max-width: 1200px;
         margin: 0 auto;
         padding: 40px 20px;
@@ -120,5 +119,5 @@
     box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
     transition: transform 0.3s ease, box-shadow 0.3s ease;
-    position: relative;
+    position: relative !important;
     cursor: pointer;
     flex-shrink: 0;
@@ -178,4 +177,13 @@
     color: #ef4444;
     font-weight: 900;
+}
+.badge {
+    position: absolute;
+    top: 5px;
+    right: 7px;
+    padding: 6px 12px;
+    font-size: 0.8rem;
+    font-weight: 600;
+    z-index: 15;
 }
 .recipe-content {
@@ -328,6 +336,26 @@
             @foreach (var recipe in Model)
             {
-                <div class="recipe-card" onclick="showRecipeDetails(@recipe.Id,true)" data-calories="@recipe.Calories" data-protein="@recipe.Protein" data-carbs="@recipe.Carbs" data-fat="@recipe.Fat">
+                <div class="recipe-card" onclick="showRecipeDetails(@recipe.Id,true,'@recipe.RecipeStatus')" data-calories="@recipe.Calories" data-protein="@recipe.Protein" data-carbs="@recipe.Carbs" data-fat="@recipe.Fat">
                     <img src="@recipe.ImageUrl" alt="@recipe.Title" class="recipe-image">
+                    <div class="badge">
+                        @if(recipe.RecipeStatus == "Pending")
+                        {
+                            <span class="badge bg-warning">
+                                <i class="fas fa-clock me-1"></i>Pending
+                            </span>
+                        }
+                        else if (recipe.RecipeStatus == "Accepted")
+                        {
+                            <span class="badge bg-success">
+                                <i class="fas fa-check me-1"></i>Accepted
+                            </span>
+                        }
+                        else if (recipe.RecipeStatus == "Declined")
+                        {
+                            <span class="badge bg-danger">
+                                <i class="fas fa-times me-1"></i>Declined
+                            </span>
+                        }
+                    </div>
                     <div class="recipe-content">
                         <h3 class="recipe-title">@recipe.Title</h3>
@@ -336,5 +364,10 @@
                                 <i class="fas fa-star"></i> @recipe.Rating
                             </span>
-                            <span><i class="fas fa-user"></i>@recipe.User.UserName</span>
+                            <span>
+                                <i class="fas fa-user"></i>
+                                @(recipe.User.UserName.Length > 23 
+                                    ? recipe.User.UserName.Substring(0, 23) + "…" 
+                                    : recipe.User.UserName)
+                            </span>
                         </div>
                         <div class="recipe-macros">
@@ -374,8 +407,12 @@
     <div id="modalWindowDelete"></div>
 <script>
-    function showRecipeDetails(recipeId,isOwner) {
+    function showRecipeDetails(recipeId,isOwner,recipeStatus) {
     const clickedCard = event.currentTarget;
     clickedCard.classList.add('loading');
-    fetch(`/Recipes/Details/${recipeId}/${isOwner}`)
+    const params = new URLSearchParams({
+    isOwner: isOwner,
+    recipeDetailsDisplayContorol: recipeStatus
+});
+    fetch(`/Recipes/Details/${recipeId}?${params}`)
         .then(response => {
             if (!response.ok) {
@@ -387,4 +424,15 @@
             const modalContainer = document.getElementById('modalWindow');
             modalContainer.innerHTML = html;
+            const scripts = modalContainer.querySelectorAll("script");
+                scripts.forEach(script => {
+                    const newScript = document.createElement("script");
+                    if (script.src) {
+                        newScript.src = script.src;
+                    } else {
+                        newScript.textContent = script.textContent;
+                    }
+                    document.body.appendChild(newScript);
+                    document.body.removeChild(newScript);
+                });
             const modalElement = modalContainer.querySelector('.modal');
             if (modalElement) {
Index: NutriMatch/Views/Recipes/_AddIngredientModal.cshtml
===================================================================
--- NutriMatch/Views/Recipes/_AddIngredientModal.cshtml	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Views/Recipes/_AddIngredientModal.cshtml	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,38 @@
+
+<div id="addIngredientModal" class="modal" style="display: none;">
+    <div class="modal-content">
+        <div class="modal-header">
+            <h3>Add New Ingredient</h3>
+            <span class="close" id="closeModal">&times;</span>
+        </div>
+        <div class="modal-body">
+            <form id="addIngredientForm">
+                @Html.AntiForgeryToken()
+                <div class="form-group">
+                    <label for="newIngredientName" class="label">Ingredient Name</label>
+                    <input type="text" id="newIngredientName" name="Name" class="input" placeholder="Enter ingredient name..." required>
+                </div>
+                <div class="form-group">
+                    <label for="newIngredientCalories" class="label">Calories (per 100g)</label>
+                    <input type="number" id="newIngredientCalories" name="Calories" class="input" step="0.01" min="0" placeholder="0" required>
+                </div>
+                <div class="form-group">
+                    <label for="newIngredientProtein" class="label">Protein (per 100g)</label>
+                    <input type="number" id="newIngredientProtein" name="Protein" class="input" step="0.01" min="0" placeholder="0" required>
+                </div>
+                <div class="form-group">
+                    <label for="newIngredientCarbs" class="label">Carbohydrates (per 100g)</label>
+                    <input type="number" id="newIngredientCarbs" name="Carbs" class="input" step="0.01" min="0" placeholder="0" required>
+                </div>
+                <div class="form-group">
+                    <label for="newIngredientFat" class="label">Fat (per 100g)</label>
+                    <input type="number" id="newIngredientFat" name="Fat" class="input" step="0.01" min="0" placeholder="0" required>
+                </div>
+                <div class="form-actions">
+                    <button type="button" id="cancelAddIngredient" class="btn btn-secondary">Cancel</button>
+                    <button type="submit" class="btn btn-primary">Add Ingredient</button>
+                </div>
+            </form>
+        </div>
+    </div>
+</div>
Index: NutriMatch/Views/Recipes/_RecipeDeclinePartial.cshtml
===================================================================
--- NutriMatch/Views/Recipes/_RecipeDeclinePartial.cshtml	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
+++ NutriMatch/Views/Recipes/_RecipeDeclinePartial.cshtml	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -0,0 +1,880 @@
+@model NutriMatch.Models.Recipe
+<style>
+.recipe-hero {
+    display: flex;
+    gap: 20px;
+    margin-bottom: 30px;
+}
+.recipe-image-container {
+    position: relative;
+    flex: 1;
+    max-width: 300px;
+}
+.recipe-image-details {
+    width: 100%;
+    height: 200px;
+    object-fit: cover;
+    border-radius: 12px;
+    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+}
+.recipe-info {
+    flex: 2;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-between;
+}
+.chef-badge {
+    display: flex;
+    align-items: center;
+    gap: 8px;
+    margin-bottom: 10px;
+    font-size: 14px;
+    color: #6b7280;
+}
+.chef-avatar {
+    width: 32px;
+    height: 32px;
+    border-radius: 50%;
+    object-fit: cover;
+}
+.recipe-title-details {
+    font-size: 24px;
+    font-weight: 700;
+    color: #1f2937;
+    margin: 0 0 15px 0;
+    line-height: 1.3;
+}
+.nutrition-card {
+    background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%);
+    border-radius: 12px;
+    padding: 20px;
+    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+}
+.section-title {
+    display: flex;
+    align-items: center;
+    gap: 8px;
+    font-size: 16px;
+    font-weight: 600;
+    color: #374151;
+    margin-bottom: 15px;
+}
+.nutrition-grid {
+    display: grid;
+    grid-template-columns: 1fr 1fr;
+    gap: 15px;
+}
+.nutrition-item {
+    text-align: center;
+    padding: 12px 8px;
+    background: white;
+    border-radius: 8px;
+    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.05);
+    transition: transform 0.2s ease;
+}
+.nutrition-item:hover {
+    transform: translateY(-2px);
+}
+.nutrition-icon {
+    margin-bottom: 5px;
+}
+.nutrition-value {
+    font-size: 18px;
+    font-weight: 700;
+    color: #1f2937;
+    margin-bottom: 2px;
+}
+.nutrition-label {
+    font-size: 12px;
+    color: #6b7280;
+    font-weight: 500;
+    text-transform: uppercase;
+    letter-spacing: 0.5px;
+}
+.ingredients-list, .instructions-list {
+    background: white;
+    border-radius: 12px;
+    padding: 20px;
+    margin-bottom: 20px;
+    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+}
+.ingredient-item {
+    padding: 10px 0;
+    border-bottom: 1px solid #f1f5f9;
+    font-size: 14px;
+    color: #374151;
+}
+.ingredient-item:last-child {
+    border-bottom: none;
+}
+.ingredient-bullet {
+    color: #10b981;
+    font-weight: bold;
+    font-size: 16px;
+}
+.instruction-item {
+    display: flex;
+    align-items: flex-start;
+    background-color: #f8f9fa;
+    padding: 15px;
+    margin: 10px 0;
+    border-radius: 10px;
+    border-left: 4px solid #ef4444;
+    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
+}
+.instruction-number {
+    background-color: #ef4444;
+    color: white;
+    border-radius: 50%;
+    width: 28px;
+    height: 28px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    font-size: 13px;
+    font-weight: bold;
+    margin-right: 15px;
+    flex-shrink: 0;
+    box-shadow: 0 2px 4px rgba(239, 68, 68, 0.3);
+}
+.instruction-text {
+    flex: 1;
+    line-height: 1.6;
+    color: #374151;
+    font-size: 14px;
+}
+.decline-overlay {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background: rgba(0, 0, 0, 0.4);
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    border-radius: 12px;
+    backdrop-filter: blur(2px);
+}
+.decline-badge {
+    background: linear-gradient(135deg, #ef4444, #dc2626);
+    color: white;
+    padding: 10px 20px;
+    border-radius: 25px;
+    font-weight: bold;
+    font-size: 14px;
+    display: flex;
+    align-items: center;
+    gap: 8px;
+    box-shadow: 0 6px 20px rgba(239, 68, 68, 0.4);
+    text-transform: uppercase;
+    letter-spacing: 1px;
+}
+.decline-status {
+    margin: 15px 0;
+    padding: 15px;
+    background: linear-gradient(135deg, #fef2f2, #fee2e2);
+    border: 1px solid #fecaca;
+    border-radius: 10px;
+}
+.status-item {
+    display: flex;
+    align-items: center;
+    gap: 10px;
+    margin: 6px 0;
+    font-size: 14px;
+    color: #374151;
+}
+.status-item i {
+    width: 16px;
+    text-align: center;
+}
+.feedback-section {
+    margin: 25px 0;
+}
+.feedback-card {
+    background: white;
+    border: 1px solid #e2e8f0;
+    border-radius: 12px;
+    overflow: hidden;
+    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
+}
+.feedback-header {
+    background: linear-gradient(135deg, #1e293b, #334155);
+    color: white;
+    padding: 18px 24px;
+}
+.feedback-header h4 {
+    margin: 0;
+    display: flex;
+    align-items: center;
+    gap: 10px;
+    font-size: 17px;
+    font-weight: 600;
+}
+.feedback-content {
+    padding: 24px;
+}
+.admin-comment {
+    font-size: 15px;
+    line-height: 1.7;
+    color: #374151;
+    background: #fef9f9;
+    padding: 20px;
+    border-radius: 10px;
+    border-left: 4px solid #ef4444;
+    position: relative;
+}
+.admin-comment::before {
+    content: '"';
+    font-size: 40px;
+    color: #ef4444;
+    position: absolute;
+    top: 10px;
+    left: 15px;
+    opacity: 0.3;
+    font-family: serif;
+}
+.no-comment {
+    display: flex;
+    align-items: center;
+    gap: 10px;
+    color: #6b7280;
+    font-style: italic;
+    padding: 20px;
+    background: #f8fafc;
+    border-radius: 8px;
+    border: 2px dashed #d1d5db;
+}
+.recipe-actions {
+    padding-top: 20px;
+    border-top: 2px solid #e5e7eb;
+}
+.action-btn {
+    background: white;
+    border: 2px solid #e5e7eb;
+    border-radius: 10px;
+    padding: 14px 24px;
+    display: flex;
+    align-items: center;
+    gap: 10px;
+    cursor: pointer;
+    transition: all 0.3s ease;
+    color: #374151;
+    font-weight: 600;
+    text-decoration: none;
+    font-size: 14px;
+    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
+}
+.edit-btn:hover {
+    border-color: #3b82f6;
+    background: linear-gradient(135deg, #3b82f6, #2563eb);
+    color: white;
+    transform: translateY(-3px);
+    box-shadow: 0 6px 20px rgba(59, 130, 246, 0.3);
+}
+.resubmit-btn:hover:not(.disabled) {
+    border-color: #10b981;
+    background: linear-gradient(135deg, #10b981, #059669);
+    color: white;
+    transform: translateY(-3px);
+    box-shadow: 0 6px 20px rgba(16, 185, 129, 0.3);
+}
+.resubmit-btn.disabled {
+    opacity: 0.6;
+    cursor: not-allowed;
+    border-color: #d1d5db;
+    color: #9ca3af;
+    background: #f9fafb;
+}
+.resubmit-btn.disabled:hover {
+    transform: none;
+    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
+}
+.resubmit-hint {
+    display: flex;
+    align-items: center;
+    gap: 8px;
+    font-size: 13px;
+    color: #6b7280;
+    margin-top: 12px;
+    font-style: italic;
+    padding: 10px 15px;
+    background: #fffbeb;
+    border-radius: 8px;
+    border-left: 3px solid #f59e0b;
+}
+.decline-toast {
+    position: fixed;
+    top: 20px;
+    right: 20px;
+    background: linear-gradient(135deg, #10b981, #059669);
+    color: white;
+    padding: 16px 24px;
+    border-radius: 10px;
+    font-size: 14px;
+    font-weight: 500;
+    z-index: 9999;
+    transform: translateX(100%);
+    transition: transform 0.3s ease;
+    box-shadow: 0 6px 20px rgba(16, 185, 129, 0.3);
+    max-width: 350px;
+}
+.decline-toast.show {
+    transform: translateX(0);
+}
+.decline-toast.error {
+    background: linear-gradient(135deg, #ef4444, #dc2626);
+    box-shadow: 0 6px 20px rgba(239, 68, 68, 0.3);
+}
+.fa-spinner {
+    animation: spin 1s linear infinite;
+}
+@@keyframes spin {
+    from { transform: rotate(0deg); }
+    to { transform: rotate(360deg); }
+}
+.modal-content {
+    border: none;
+    border-radius: 15px;
+    box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15);
+}
+.modal-header {
+    background: linear-gradient(135deg, #fee2e2, #fecaca);
+    border-radius: 15px 15px 0 0;
+    padding: 20px 30px;
+}
+.modal-title {
+    font-weight: 700;
+    font-size: 20px;
+}
+.modal-body {
+    padding: 30px;
+    max-height: 80vh;
+    overflow-y: auto;
+}
+.modal-body::-webkit-scrollbar {
+    width: 6px;
+}
+.modal-body::-webkit-scrollbar-track {
+    background: #f1f5f9;
+    border-radius: 3px;
+}
+.modal-body::-webkit-scrollbar-thumb {
+    background: #cbd5e1;
+    border-radius: 3px;
+}
+.modal-body::-webkit-scrollbar-thumb:hover {
+    background: #94a3b8;
+}
+@@media (max-width: 768px) {
+    .recipe-hero {
+        flex-direction: column;
+        gap: 15px;
+    }
+    .recipe-image-container {
+        max-width: 100%;
+    }
+    .recipe-actions .d-flex {
+        flex-direction: column;
+        gap: 15px !important;
+    }
+    .action-btn {
+        justify-content: center;
+        width: 100%;
+        padding: 16px 20px;
+    }
+    .nutrition-grid {
+        grid-template-columns: 1fr;
+        gap: 10px;
+    }
+    .modal-body {
+        padding: 20px;
+    }
+    .feedback-content {
+        padding: 20px;
+    }
+    .admin-comment {
+        padding: 16px;
+    }
+    .decline-toast {
+        right: 10px;
+        left: 10px;
+        max-width: none;
+        transform: translateY(-100%);
+    }
+    .decline-toast.show {
+        transform: translateY(0);
+    }
+}
+@@media (max-width: 576px) {
+    .recipe-title-details {
+        font-size: 20px;
+    }
+    .modal-dialog {
+        margin: 10px;
+    }
+    .instruction-item {
+        padding: 12px;
+    }
+    .instruction-number {
+        width: 24px;
+        height: 24px;
+        font-size: 12px;
+        margin-right: 12px;
+    }
+}
+</style>
+@{
+    bool canResubmit = ViewBag.CanResubmit ?? false;
+    DateTime? lastEditDate = ViewBag.LastEditDate;
+    DateTime? declineDate = ViewBag.DeclineDate;
+}
+<div class="modal fade" id="recipeDeclineModal" tabindex="-1" aria-labelledby="recipeDeclineModalLabel" aria-hidden="true">
+    @Html.AntiForgeryToken()
+    <div class="modal-dialog modal-xl">
+        <div class="modal-content">
+            <div class="modal-header border-0">
+                <h5 class="modal-title text-danger" id="recipeDeclineModalLabel">
+                    <i class="fas fa-exclamation-triangle"></i>
+                    Recipe Declined
+                </h5>
+                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+            </div>
+            <div class="modal-body">
+                <div class="recipe-hero">
+                    <div class="recipe-image-container">
+                        <img src="@Model.ImageUrl" alt="@Model.Title" class="recipe-image-details">
+                        <div class="decline-overlay">
+                            <div class="decline-badge">
+                                <i class="fas fa-times-circle"></i>
+                                DECLINED
+                            </div>
+                        </div>
+                    </div>
+                    <div class="recipe-info">
+                        <div>
+                            <div class="chef-badge">
+                                <img src="@Model.User.ProfilePictureUrl" class="chef-avatar">
+                                @Model.User.UserName
+                            </div>
+                            <h2 class="recipe-title-details">@Model.Title</h2>
+                            <div class="decline-status">
+                                <div class="status-item">
+                                    <i class="fas fa-calendar-times text-danger"></i>
+                                    <span>Declined on: @Model.DeclineReason </span>
+                                </div>
+                                @if (lastEditDate.HasValue)
+                                {
+                                    <div class="status-item">
+                                        <i class="fas fa-edit text-info"></i>
+                                        <span>Last edited: @lastEditDate.Value.ToString("MMM dd, yyyy HH:mm")</span>
+                                    </div>
+                                }
+                            </div>
+                        </div>
+                        <div class="recipe-actions">
+                            <div class="d-flex gap-3 align-items-center">
+                                <button onclick="location.href='/Recipes/Edit/@Model.Id?requiresChange=true'" 
+                                        class="action-btn edit-btn" 
+                                        title="Edit Recipe">
+                                    <i class="fas fa-edit"></i>
+                                    <span>Edit and Resubmit Recipe</span>
+                                </button>
+                            </div>
+                            @if (!canResubmit)
+                            {
+                                <div class="resubmit-hint">
+                                    <i class="fas fa-info-circle"></i>
+                                    Please edit your recipe to address the feedback before resubmitting
+                                </div>
+                            }
+                        </div>
+                    </div>
+                </div>
+                <div class="feedback-section">
+                    <div class="feedback-card">
+                        <div class="feedback-header">
+                            <h4>
+                                <i class="fas fa-comment-alt"></i>
+                                Moderator Feedback
+                            </h4>
+                        </div>
+                        <div class="feedback-content">
+                            @if (!string.IsNullOrWhiteSpace(Model.AdminComment))
+                            {
+                                <div class="admin-comment">
+                                    @Html.Raw(Model.AdminComment.Replace("\n", "<br/>"))
+                                </div>
+                            }
+                            else
+                            {
+                                <div class="no-comment">
+                                    <i class="fas fa-info-circle"></i>
+                                    No specific feedback was provided. Please review your recipe for compliance with our guidelines.
+                                </div>
+                            }
+                        </div>
+                    </div>
+                </div>
+                <div class="row mt-4">
+                    <div class="col-md-4">
+                        <div class="nutrition-card">
+                            <h4 class="section-title">
+                                <i class="fas fa-chart-pie"></i>
+                                Nutrition Facts
+                            </h4>
+                            <div class="nutrition-grid">
+                                <div class="nutrition-item">
+                                    <div class="nutrition-icon">
+                                        <i class="fas fa-fire me-1" style="color: #ef4444;"></i>
+                                    </div>
+                                    <div class="nutrition-value">@Model.Calories</div>
+                                    <div class="nutrition-label">Calories</div>
+                                </div>
+                                <div class="nutrition-item">
+                                    <div class="nutrition-icon">
+                                        <i class="fas fa-drumstick-bite me-1" style="color: #8b5cf6;"></i>
+                                    </div>
+                                    <div class="nutrition-value">@Model.Protein</div>
+                                    <div class="nutrition-label">Protein</div>
+                                </div>
+                                <div class="nutrition-item">
+                                    <div class="nutrition-icon">
+                                        <i class="fas fa-bread-slice me-1" style="color: #f59e0b;"></i>
+                                    </div>
+                                    <div class="nutrition-value">@Model.Carbs</div>
+                                    <div class="nutrition-label">Carbs</div>
+                                </div>
+                                <div class="nutrition-item">
+                                    <div class="nutrition-icon">
+                                        <i class="fas fa-tint me-1" style="color: #e5eb4dfa;"></i>
+                                    </div>
+                                    <div class="nutrition-value">@Model.Fat</div>
+                                    <div class="nutrition-label">Fat</div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <div class="col-md-8">
+                        <div class="ingredients-list">
+                            <h4 class="section-title">
+                                <i class="fas fa-list-ul"></i>
+                                Ingredients
+                            </h4>
+                            @if (Model.RecipeIngredients != null && Model.RecipeIngredients.Any())
+                            {
+                                @for (int i = 0; i < Model.RecipeIngredients.Count; i++)
+                                {
+                                    <div class="ingredient-item">
+                                        <span class="ingredient-bullet">•</span>
+                                        <span>@Model.RecipeIngredients[i].Ingredient.Name, @Model.RecipeIngredients[i].Quantity @Model.RecipeIngredients[i].Unit</span>
+                                    </div>
+                                }
+                            }
+                        </div>
+                        <div class="instructions-list">
+                            <h4 class="section-title">
+                                <i class="fas fa-clipboard-list"></i>
+                                Instructions
+                            </h4>
+                            @{
+                                var instructions = System.Text.Json.JsonSerializer.Deserialize<List<string>>(Model.Instructions[0]);
+                            }
+                            @for(var i = 0; i < instructions.Count; i++){
+                                <div class="instruction-item">
+                                    <span class="instruction-number">@(i + 1)</span>
+                                    <span class="instruction-text">@instructions[i]</span>
+                                </div>
+                            }
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<style>
+.decline-overlay {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    background: rgba(0, 0, 0, 0.3);
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    border-radius: 12px;
+}
+.decline-badge {
+    background: #ef4444;
+    color: white;
+    padding: 8px 16px;
+    border-radius: 20px;
+    font-weight: bold;
+    font-size: 14px;
+    display: flex;
+    align-items: center;
+    gap: 6px;
+    box-shadow: 0 4px 12px rgba(239, 68, 68, 0.3);
+}
+.decline-status {
+    margin: 15px 0;
+    padding: 12px;
+    background: #fef2f2;
+    border: 1px solid #fecaca;
+    border-radius: 8px;
+}
+.status-item {
+    display: flex;
+    align-items: center;
+    gap: 8px;
+    margin: 4px 0;
+    font-size: 14px;
+    color: #374151;
+}
+.feedback-section {
+    margin: 20px 0;
+}
+.feedback-card {
+    background: #f8fafc;
+    border: 1px solid #e2e8f0;
+    border-radius: 12px;
+    overflow: hidden;
+}
+.feedback-header {
+    background: #1e293b;
+    color: white;
+    padding: 15px 20px;
+}
+.feedback-header h4 {
+    margin: 0;
+    display: flex;
+    align-items: center;
+    gap: 8px;
+    font-size: 16px;
+}
+.feedback-content {
+    padding: 20px;
+}
+.admin-comment {
+    font-size: 15px;
+    line-height: 1.6;
+    color: #374151;
+    background: white;
+    padding: 16px;
+    border-radius: 8px;
+    border-left: 4px solid #ef4444;
+}
+.no-comment {
+    display: flex;
+    align-items: center;
+    gap: 8px;
+    color: #6b7280;
+    font-style: italic;
+}
+.recipe-actions {
+    padding-top: 15px;
+    border-top: 1px solid #e5e7eb;
+}
+.action-btn {
+    background: none;
+    border: 2px solid #e5e7eb;
+    border-radius: 8px;
+    padding: 12px 20px;
+    display: flex;
+    align-items: center;
+    gap: 8px;
+    cursor: pointer;
+    transition: all 0.3s ease;
+    color: #374151;
+    font-weight: 500;
+    text-decoration: none;
+}
+.edit-btn:hover {
+    border-color: #3b82f6;
+    background-color: #3b82f6;
+    color: white;
+    transform: translateY(-2px);
+}
+.resubmit-btn:hover:not(.disabled) {
+    border-color: #10b981;
+    background-color: #10b981;
+    color: white;
+    transform: translateY(-2px);
+}
+.resubmit-btn.disabled {
+    opacity: 0.5;
+    cursor: not-allowed;
+    border-color: #d1d5db;
+    color: #9ca3af;
+}
+.resubmit-hint {
+    display: flex;
+    align-items: center;
+    gap: 6px;
+    font-size: 13px;
+    color: #6b7280;
+    margin-top: 8px;
+    font-style: italic;
+}
+.ingredient-item {
+    display: flex;
+    align-items: flex-start;
+    gap: 8px;
+    padding: 8px 0;
+    border-bottom: 1px solid #f3f4f6;
+}
+.ingredient-bullet {
+    color: #10b981;
+    font-weight: bold;
+    margin-top: 2px;
+}
+.instruction-item {
+    display: flex;
+    align-items: flex-start;
+    background-color: #f8f9fa;
+    padding: 12px;
+    margin: 8px 0;
+    border-radius: 8px;
+    border-left: 4px solid #ef4444;
+}
+.instruction-number {
+    background-color: #ef4444;
+    color: white;
+    border-radius: 50%;
+    width: 24px;
+    height: 24px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    font-size: 12px;
+    font-weight: bold;
+    margin-right: 12px;
+    flex-shrink: 0;
+}
+.instruction-text {
+    flex: 1;
+    line-height: 1.5;
+}
+.decline-toast {
+    position: fixed;
+    top: 20px;
+    right: 20px;
+    background: #10b981;
+    color: white;
+    padding: 12px 20px;
+    border-radius: 8px;
+    font-size: 14px;
+    z-index: 9999;
+    transform: translateX(100%);
+    transition: transform 0.3s ease;
+}
+.decline-toast.show {
+    transform: translateX(0);
+}
+.decline-toast.error {
+    background: #ef4444;
+}
+@@media (max-width: 768px) {
+    .recipe-actions .d-flex {
+        flex-direction: column;
+        gap: 12px !important;
+    }
+    .action-btn {
+        justify-content: center;
+        width: 100%;
+    }
+}
+</style>
+<script>
+document.getElementById('recipeDeclineModal').addEventListener('shown.bs.modal', function () {
+    this.querySelector('.modal-body').scrollTop = 0;
+});
+let isResubmitInProgress = false;
+function resubmitRecipe(recipeId) {
+    if (isResubmitInProgress) return;
+    const resubmitBtn = document.querySelector('.resubmit-btn');
+    if (resubmitBtn.classList.contains('disabled')) {
+        showDeclineToast('Please edit your recipe first before resubmitting', 'error');
+        return;
+    }
+    if (!confirm('Are you sure you want to resubmit this recipe for review?')) {
+        return;
+    }
+    isResubmitInProgress = true;
+    resubmitBtn.classList.add('disabled');
+    const originalText = resubmitBtn.innerHTML;
+    resubmitBtn.innerHTML = '<i class="fas fa-spinner fa-spin"></i><span>Submitting...</span>';
+    fetch('/Recipes/Resubmit', {
+        method: 'POST',
+        headers: {
+            'Content-Type': 'application/json',
+            'RequestVerificationToken': document.querySelector('input[name="__RequestVerificationToken"]')?.value
+        },
+        body: JSON.stringify({
+            recipeId: recipeId
+        })
+    })
+    .then(response => response.json())
+    .then(data => {
+        if (data.success) {
+            showDeclineToast('Recipe resubmitted successfully! It will be reviewed again.', 'success');
+            setTimeout(() => {
+                const modal = bootstrap.Modal.getInstance(document.getElementById('recipeDeclineModal'));
+                if (modal) modal.hide();
+                if (data.redirectUrl) {
+                    window.location.href = data.redirectUrl;
+                } else {
+                    setTimeout(() => window.location.reload(), 1000);
+                }
+            }, 1500);
+        } else {
+            showDeclineToast(data.message || 'Failed to resubmit recipe', 'error');
+            resubmitBtn.classList.remove('disabled');
+        }
+    })
+    .catch(error => {
+        console.error('Error:', error);
+        showDeclineToast('An error occurred while resubmitting the recipe', 'error');
+        resubmitBtn.classList.remove('disabled');
+    })
+    .finally(() => {
+        isResubmitInProgress = false;
+        resubmitBtn.innerHTML = originalText;
+    });
+}
+function showDeclineToast(message, type = 'success') {
+    const existingToast = document.querySelector('.decline-toast');
+    if (existingToast) {
+        existingToast.remove();
+    }
+    const toast = document.createElement('div');
+    toast.className = `decline-toast ${type}`;
+    toast.textContent = message;
+    document.body.appendChild(toast);
+    setTimeout(() => toast.classList.add('show'), 100);
+    setTimeout(() => {
+        toast.classList.remove('show');
+        setTimeout(() => toast.remove(), 300);
+    }, 4000);
+}
+document.addEventListener('DOMContentLoaded', function() {
+    const urlParams = new URLSearchParams(window.location.search);
+    if (urlParams.get('edited') === 'true') {
+        const resubmitBtn = document.querySelector('.resubmit-btn');
+        if (resubmitBtn) {
+            resubmitBtn.classList.remove('disabled');
+            resubmitBtn.removeAttribute('disabled');
+            resubmitBtn.title = 'Resubmit for Review';
+            const hint = document.querySelector('.resubmit-hint');
+            if (hint) {
+                hint.style.display = 'none';
+            }
+            showDeclineToast('Recipe updated! You can now resubmit it for review.', 'success');
+        }
+    }
+});
+document.addEventListener
+</script>
Index: NutriMatch/Views/Recipes/_RecipeDetailsPartial.cshtml
===================================================================
--- NutriMatch/Views/Recipes/_RecipeDetailsPartial.cshtml	(revision 4a68273d2173d196bea803f19c4d87863b81f215)
+++ NutriMatch/Views/Recipes/_RecipeDetailsPartial.cshtml	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -8,4 +8,6 @@
     bool hasUserRated = ViewBag.HasUserRated ?? false;
     bool isFavorited = ViewBag.IsFavorited ?? false;
+    bool AddAdminButtons = ViewBag.AddAdminButtons ?? false;
+    bool InIndex = ViewBag.InIndex ?? false;
 }
 <div class="modal fade" id="recipeModal" tabindex="-1" aria-labelledby="recipeModalLabel" aria-hidden="true">
@@ -56,38 +58,54 @@
                         </div>
                         <div class="recipe-actions">
-                            @if(isOwner){
-                            <div class="d-flex gap-2">
-                                <button onclick="location.href='/Recipes/Edit/@Model.Id'" class="action-btn edit-btn" title="Edit Recipe">
-                                    <i class="fas fa-edit"></i>
-                                </button>
-                                <button onclick="openDeleteModal('@Model.Id')" class="action-btn delete-btn" title="Delete Recipe">
-                                    <i class="fas fa-trash"></i>
-                                </button>
-                            </div>
-                            } else {
-                                        <div class="rate-recipe">
-                                            <span class="rate-label">@(hasUserRated ? "Your rating:" : "Rate this recipe:")</span>
-                                            <div class="rating-input" id="userRatingStars">
-                                                @for (int i = 1; i <= 5; i++)
+                            @if(AddAdminButtons){
+                                    <div class="admin-actions">
+                                        <button onclick="approveRecipe(@Model.Id)" class="admin-btn approve-btn subtle" title="Approve Recipe">
+                                            <i></i>
+                                            <span>Approve</span>
+                                        </button>
+                                        <button onclick="declineRecipe(@Model.Id)" class="admin-btn decline-btn subtle" title="Decline Recipe">
+                                            <i></i>
+                                            <span>Decline</span>
+                                        </button>
+                                    </div>
+                            }
+                            else{
+                                @if(isOwner){
+                                    if(!InIndex){
+                                    <div class="d-flex gap-2">
+                                        <button onclick="location.href='/Recipes/Edit/@Model.Id'" class="action-btn edit-btn" title="Edit Recipe">
+                                            <i class="fas fa-edit"></i>
+                                        </button>
+                                        <button onclick="openDeleteModal('@Model.Id')" class="action-btn delete-btn" title="Delete Recipe">
+                                            <i class="fas fa-trash"></i>
+                                        </button>
+                                    </div>
+                                    }
+                                } else {
+                                            <div class="rate-recipe">
+                                                <span class="rate-label">@(hasUserRated ? "Your rating:" : "Rate this recipe:")</span>
+                                                <div class="rating-input" id="userRatingStars">
+                                                    @for (int i = 1; i <= 5; i++)
+                                                    {
+                                                        <i class="@(i <= userRating ? "fas" : "far") fa-star rating-star" 
+                                                        data-rating="@i" 
+                                                        onclick="rateRecipe(@i, @Model.Id)"></i>
+                                                    }
+                                                </div>
+                                                @if (hasUserRated)
                                                 {
-                                                    <i class="@(i <= userRating ? "fas" : "far") fa-star rating-star" 
-                                                       data-rating="@i" 
-                                                       onclick="rateRecipe(@i, @Model.Id)"></i>
+                                                    <button class="remove-rating-btn" onclick="removeRating(@Model.Id)" title="Remove your rating">
+                                                        <i class="fas fa-times"></i> Remove
+                                                    </button>
                                                 }
                                             </div>
-                                            @if (hasUserRated)
-                                            {
-                                                <button class="remove-rating-btn" onclick="removeRating(@Model.Id)" title="Remove your rating">
-                                                    <i class="fas fa-times"></i> Remove
-                                                </button>
-                                            }
-                                        </div>
-                                        <div> 
-                                                <button class="action-btn favorite-btn-details @(isFavorited ? "favorited" : "")" 
-                                                        onclick="toggleFavorite(@Model.Id)" 
-                                                        title="@(isFavorited ? "Remove from Favorites" : "Add to Favorites")">
-                                                <i class="far fa-heart"></i>
-                                                </button>
-                                        </div>
+                                            <div> 
+                                                    <button class="action-btn favorite-btn-details @(isFavorited ? "favorited" : "")" 
+                                                            onclick="toggleFavorite(@Model.Id)" 
+                                                            title="@(isFavorited ? "Remove from Favorites" : "Add to Favorites")">
+                                                    <i class="far fa-heart"></i>
+                                                    </button>
+                                            </div>
+                                }
                             }
                         </div>
@@ -134,5 +152,5 @@
                     </div>
                     <div class="col-md-8">
-                        <div class="ingredients-list">
+                       <div class="ingredients-list">
                             <h4 class="section-title">
                                 <i class="fas fa-list-ul"></i>
@@ -143,7 +161,24 @@
                                 @for (int i = 0; i < Model.RecipeIngredients.Count; i++)
                                 {
-                                    <div class="ingredient-item">
-                                        <input type="checkbox" class="ingredient-checkbox" id="ingredient@(i + 1)"> 
-                                        <label for="ingredient@(i + 1)">@Model.RecipeIngredients[i].Ingredient.Name, @Model.RecipeIngredients[i].Quantity @Model.RecipeIngredients[i].Unit </label>
+                                    <div class="ingredient-item" style="display: flex; align-items: center; justify-content: space-between;">
+                                        <div style="display: flex; align-items: center; flex: 1;">
+                                            <input type="checkbox" class="ingredient-checkbox" id="ingredient@(i + 1)"> 
+                                            <label for="ingredient@(i + 1)" style="margin-left: 8px;">
+                                                @Model.RecipeIngredients[i].Ingredient.Name, @Model.RecipeIngredients[i].Quantity @Model.RecipeIngredients[i].Unit
+                                                @if (Model.RecipeIngredients[i].Ingredient.Status == "Pending")
+                                                {
+                                                    <span class="pending-badge" style="background-color: #ffc107; color: #212529; padding: 2px 8px; border-radius: 12px; font-size: 12px; margin-left: 8px;">
+                                                        <i class="fas fa-clock"></i> Pending Review
+                                                    </span>
+                                                }
+                                            </label>
+                                        </div>
+                                        @if (Model.RecipeIngredients[i].Ingredient.Status == "Pending")
+                                        {
+                                            <button onclick="viewIngredientReview(@Model.RecipeIngredients[i].Ingredient.Id)" type="button" class="btn btn-sm btn-outline-primary view-ingredient-btn" 
+                                                    style="margin-left: 10px;">
+                                                <i class="fas fa-eye"></i> View
+                                            </button>
+                                        }
                                     </div>
                                 }
@@ -312,4 +347,210 @@
     .rate-recipe {
         align-items: flex-start;
+    }
+}
+.admin-actions {
+    display: flex;
+    gap: 12px;
+    flex-direction: column;
+}
+.admin-btn {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    gap: 8px;
+    padding: 12px 20px;
+    border: none;
+    border-radius: 8px;
+    font-size: 14px;
+    font-weight: 600;
+    cursor: pointer;
+    transition: all 0.3s ease;
+    text-transform: uppercase;
+    letter-spacing: 0.5px;
+    min-width: 120px;
+}
+.approve-btn {
+    background: linear-gradient(135deg, #10b981, #059669);
+    color: white;
+    box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3);
+}
+.approve-btn:hover {
+    background: linear-gradient(135deg, #059669, #047857);
+    transform: translateY(-2px);
+    box-shadow: 0 6px 16px rgba(16, 185, 129, 0.4);
+}
+.approve-btn:active {
+    transform: translateY(0);
+}
+.decline-btn {
+    background: linear-gradient(135deg, #ef4444, #dc2626);
+    color: white;
+    box-shadow: 0 4px 12px rgba(239, 68, 68, 0.3);
+}
+.decline-btn:hover {
+    background: linear-gradient(135deg, #dc2626, #b91c1c);
+    transform: translateY(-2px);
+    box-shadow: 0 6px 16px rgba(239, 68, 68, 0.4);
+}
+.decline-btn:active {
+    transform: translateY(0);
+}
+.admin-btn i {
+    font-size: 16px;
+}
+.admin-btn:disabled {
+    opacity: 0.6;
+    cursor: not-allowed;
+    transform: none !important;
+}
+.admin-btn.loading {
+    position: relative;
+    color: transparent;
+}
+.admin-btn.loading::after {
+    content: '';
+    position: absolute;
+    width: 16px;
+    height: 16px;
+    border: 2px solid transparent;
+    border-top: 2px solid currentColor;
+    border-radius: 50%;
+    animation: spin 1s linear infinite;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    color: white;
+}
+@@keyframes spin {
+    0% { transform: translate(-50%, -50%) rotate(0deg); }
+    100% { transform: translate(-50%, -50%) rotate(360deg); }
+}
+@@media (min-width: 768px) {
+    .admin-actions {
+        flex-direction: row;
+    }
+}
+.admin-actions {
+    display: flex;
+    gap: 12px;
+    margin-top: 16px;
+    justify-content: flex-start;
+    align-items: center;
+}
+.admin-btn {
+    display: inline-flex;
+    align-items: center;
+    gap: 8px;
+    padding: 10px 18px;
+    border: none;
+    border-radius: 25px;
+    font-family: inherit;
+    font-size: 14px;
+    font-weight: 500;
+    cursor: pointer;
+    transition: all 0.3s ease;
+    text-decoration: none;
+    outline: none;
+    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+}
+.admin-btn:hover {
+    transform: translateY(-1px);
+    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
+}
+.admin-btn:active {
+    transform: translateY(0);
+    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+}
+.admin-btn i {
+    font-size: 14px;
+    line-height: 1;
+}
+.admin-btn span {
+    line-height: 1;
+}
+.approve-btn {
+    background: linear-gradient(135deg, #4CAF50 0%, #45a049 100%);
+    color: white;
+}
+.approve-btn:hover {
+    background: linear-gradient(135deg, #45a049 0%, #3d8b40 100%);
+}
+.approve-btn:focus {
+    box-shadow: 0 0 0 3px rgba(76, 175, 80, 0.3);
+}
+.decline-btn {
+    background: linear-gradient(135deg, #f44336 0%, #d32f2f 100%);
+    color: white;
+}
+.decline-btn:hover {
+    background: linear-gradient(135deg, #d32f2f 0%, #c62828 100%);
+}
+.decline-btn:focus {
+    box-shadow: 0 0 0 3px rgba(244, 67, 54, 0.3);
+}
+.admin-btn.subtle {
+    background: #f8f9fa;
+    color: #6c757d;
+    border: 1px solid #e9ecef;
+}
+.admin-btn.subtle:hover {
+    background: #e9ecef;
+    color: #495057;
+    border-color: #dee2e6;
+}
+.approve-btn.subtle {
+    color: #28a745;
+    border-color: #28a745;
+}
+.approve-btn.subtle:hover {
+    background: #28a745;
+    color: white;
+}
+.decline-btn.subtle {
+    color: #dc3545;
+    border-color: #dc3545;
+}
+.decline-btn.subtle:hover {
+    background: #dc3545;
+    color: white;
+}
+@@media (max-width: 768px) {
+    .admin-actions {
+        flex-direction: column;
+        gap: 8px;
+        width: 100%;
+    }
+    .admin-btn {
+        width: 100%;
+        justify-content: center;
+        padding: 12px 18px;
+    }
+}
+.admin-btn:disabled {
+    opacity: 0.6;
+    cursor: not-allowed;
+    transform: none;
+}
+.admin-btn.loading {
+    position: relative;
+    color: transparent;
+}
+.admin-btn.loading::after {
+    content: "";
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    margin-top: -8px;
+    margin-left: -8px;
+    width: 16px;
+    height: 16px;
+    border: 2px solid #ffffff;
+    border-radius: 50%;
+    border-top-color: transparent;
+    animation: spin 1s linear infinite;
+}
+@@keyframes spin {
+    to {
+        transform: rotate(360deg);
     }
 }
Index: NutriMatch/Views/Shared/_Layout.cshtml
===================================================================
--- NutriMatch/Views/Shared/_Layout.cshtml	(revision 4a68273d2173d196bea803f19c4d87863b81f215)
+++ NutriMatch/Views/Shared/_Layout.cshtml	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -13,4 +13,5 @@
     var currentController = ViewContext.RouteData.Values["controller"]?.ToString();
     var currentAction = ViewContext.RouteData.Values["action"]?.ToString();
+    var currentPage = ViewContext.RouteData.Values["page"]?.ToString();
 }
 <body>
@@ -40,6 +41,10 @@
                             </li>
                             <li class="nav-item">
-                                <a class="nav-link" href="/Identity/Account/MyAccount">My Account</a>
-                            </li>  
+                                <a class="nav-link @(currentController == "MealPlan" && currentAction == "Index" ? "active-glow" : "") " href="/MealPlan">Meal Plans</a>
+                            </li>
+                             <a class="nav-link @(currentPage == "/Account/MyAccount" ? "active-glow" : "")"
+                                href="/Identity/Account/MyAccount">
+                                My Account
+                            </a>
                             @if (User.IsInRole("Admin")){
                                 <li class="nav-item">
Index: NutriMatch/wwwroot/css/HomeIndex.css
===================================================================
--- NutriMatch/wwwroot/css/HomeIndex.css	(revision 4a68273d2173d196bea803f19c4d87863b81f215)
+++ NutriMatch/wwwroot/css/HomeIndex.css	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -458,2 +458,91 @@
     line-height: 1;
 }
+
+
+
+
+@keyframes float {
+    0%, 100% { 
+        transform: translateY(0px) rotate(0deg); 
+        opacity: 0.6;
+    }
+    50% { 
+        transform: translateY(-15px) rotate(5deg); 
+        opacity: 0.3;
+    }
+}
+
+
+.welcome-back-section .btn-primary-custom:hover {
+    background: #45a049 !important;
+    transform: translateY(-1px);
+    box-shadow: 0 4px 12px rgba(76, 175, 80, 0.3);
+}
+
+.welcome-back-section .btn-outline:hover {
+    background: #4CAF50;
+    color: white;
+    transform: translateY(-1px);
+}
+
+
+.user-summary-card:hover {
+    transform: translateY(-2px);
+    box-shadow: 0 8px 25px rgba(0, 0, 0, 0.12);
+    transition: all 0.3s ease;
+}
+
+
+.quick-action a:hover {
+    color: #45a049;
+}
+
+.quick-action a:hover i {
+    transform: translateX(4px);
+    transition: transform 0.2s ease;
+}
+
+
+@media (max-width: 768px) {
+    .welcome-title {
+        font-size: 2.2rem !important;
+        text-align: center;
+    }
+    
+    .welcome-subtitle {
+        text-align: center;
+        font-size: 1.1rem !important;
+    }
+    
+    .welcome-actions {
+        justify-content: center;
+        margin-top: 24px;
+    }
+    
+    .welcome-actions a {
+        flex: 1;
+        min-width: 140px;
+        justify-content: center;
+    }
+    
+    .user-summary-card {
+        margin-top: 40px;
+    }
+    
+    .status-badge {
+        display: flex !important;
+        justify-content: center;
+    }
+}
+
+@media (max-width: 576px) {
+    .welcome-actions {
+        flex-direction: column;
+        width: 100%;
+    }
+    
+    .welcome-actions a {
+        width: 100%;
+        justify-content: center;
+    }
+}
Index: NutriMatch/wwwroot/css/RecipeCreate.css
===================================================================
--- NutriMatch/wwwroot/css/RecipeCreate.css	(revision 4a68273d2173d196bea803f19c4d87863b81f215)
+++ NutriMatch/wwwroot/css/RecipeCreate.css	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -454,2 +454,192 @@
 }
 
+
+.add-new-ingredient-btn {
+    
+    background-color: #10b981;
+    color: white;
+    border: none;
+    border-radius: 4px;
+    cursor: pointer;
+    font-size: 14px;
+    transition: background-color 0.2s;
+}
+
+.add-new-ingredient-btn:hover {
+    background-color: rgb(24, 99, 40);
+}
+
+.search-container {
+    position: relative;
+}
+
+
+
+
+.modal {
+    display: none;
+    position: fixed;
+    z-index: 1000;
+    left: 0;
+    top: 0;
+    width: 100%;
+    height: 100%;
+    background-color: rgba(0, 0, 0, 0.5);
+    backdrop-filter: blur(2px);
+    align-items: center;
+    justify-content: center;
+    animation: fadeIn 0.3s ease;
+}
+
+.modal.show {
+    display: flex;
+}
+
+.modal-content {
+    background: white;
+    border-radius: 16px;
+    box-shadow: 0 20px 40px rgba(0, 0, 0, 0.2);
+    width: 90%;
+    max-width: 500px;
+    max-height: 90vh;
+    overflow-y: auto;
+    animation: slideUp 0.3s ease;
+    position: relative;
+}
+
+.modal-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    padding: 1.5rem 2rem;
+    border-bottom: 1px solid #e5e7eb;
+    background: #f9fafb;
+    border-radius: 16px 16px 0 0;
+}
+
+.modal-header h3 {
+    margin: 0;
+    font-size: 1.25rem;
+    font-weight: 600;
+    color: #1a1a1a;
+}
+
+.close {
+    font-size: 24px;
+    font-weight: bold;
+    color: #6b7280;
+    cursor: pointer;
+    transition: color 0.2s ease;
+    line-height: 1;
+    background: none;
+    border: none;
+    padding: 0;
+    width: 30px;
+    height: 30px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    border-radius: 50%;
+}
+
+.close:hover {
+    color: #dc2626;
+    background: #fef2f2;
+}
+
+.modal-body {
+    padding: 2rem;
+}
+
+.modal .form-group {
+    margin-bottom: 1.5rem;
+}
+
+.modal .form-group:last-child {
+    margin-bottom: 0;
+}
+
+.modal .form-actions {
+    margin-top: 2rem;
+    padding-top: 1.5rem;
+    border-top: 1px solid #e5e7eb;
+    display: flex;
+    gap: 1rem;
+    justify-content: flex-end;
+}
+
+@keyframes fadeIn {
+    from {
+        opacity: 0;
+    }
+    to {
+        opacity: 1;
+    }
+}
+
+@keyframes slideUp {
+    from {
+        opacity: 0;
+        transform: translateY(30px) scale(0.95);
+    }
+    to {
+        opacity: 1;
+        transform: translateY(0) scale(1);
+    }
+}
+
+
+@media (max-width: 768px) {
+    .modal-content {
+        width: 95%;
+        margin: 1rem;
+    }
+    
+    .modal-header {
+        padding: 1rem 1.5rem;
+    }
+    
+    .modal-body {
+        padding: 1.5rem;
+    }
+    
+    .modal .form-actions {
+        flex-direction: column-reverse;
+    }
+    
+    .modal .btn {
+        width: 100%;
+        justify-content: center;
+    }
+}
+
+
+.modal .btn:disabled {
+    opacity: 0.6;
+    cursor: not-allowed;
+}
+
+.modal .btn.loading {
+    position: relative;
+    color: transparent;
+}
+
+.modal .btn.loading::after {
+    content: '';
+    position: absolute;
+    width: 16px;
+    height: 16px;
+    top: 50%;
+    left: 50%;
+    margin-left: -8px;
+    margin-top: -8px;
+    border: 2px solid transparent;
+    border-top: 2px solid currentColor;
+    border-radius: 50%;
+    animation: spin 1s linear infinite;
+}
+
+@keyframes spin {
+    0% { transform: rotate(0deg); }
+    100% { transform: rotate(360deg); }
+}
Index: NutriMatch/wwwroot/js/RecipeCreate.js
===================================================================
--- NutriMatch/wwwroot/js/RecipeCreate.js	(revision 4a68273d2173d196bea803f19c4d87863b81f215)
+++ NutriMatch/wwwroot/js/RecipeCreate.js	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -5,5 +5,4 @@
 let currentFocus = -1;
 let selectedIngredient = null;
-
 const ingredientSearch = document.getElementById('ingredientSearch');
 const ingredientDropdown = document.getElementById('ingredientDropdown');
@@ -13,34 +12,34 @@
 const qtyInput = document.getElementById('ingredientQuantity');
 const unitSelect = document.getElementById('ingredientUnit');
-
 const instructionInput = document.getElementById('instructionInput');
 const addInstructionButton = document.getElementById('addInstructionButton');
 const instructionsList = document.getElementById('instructionsList');
 const hiddenInstructionsInput = document.getElementById('selectedInstructions');
-
 const fileUploadArea = document.getElementById('fileUploadArea');
 const fileInput = document.getElementById('RecipeImage');
 const imagePreview = document.getElementById('imagePreview');
-
+const addNewIngredientBtn = document.getElementById('addNewIngredientBtn');
+const addIngredientModal = document.getElementById('addIngredientModal');
+const addIngredientForm = document.getElementById('addIngredientForm');
+const closeModal = document.getElementById('closeModal');
+const cancelAddIngredient = document.getElementById('cancelAddIngredient');
+let lastSearchQuery = '';
 document.addEventListener('DOMContentLoaded', function() {
-    initializeSearchFunctionality();
+     initializeSearchFunctionality();
     initializeInstructionsFunctionality();
     initializeFileUpload();
+    initializeModalFunctionality();
 });
-
 function initializeFileUpload(){
     if(fileUploadArea)
     {
         fileUploadArea.addEventListener('click', () => fileInput.click());
-
         fileUploadArea.addEventListener('dragover', (e) => {
             e.preventDefault();
             fileUploadArea.classList.add('dragover');
         });
-
         fileUploadArea.addEventListener('dragleave', () => {
             fileUploadArea.classList.remove('dragover');
         });
-
         fileUploadArea.addEventListener('drop', (e) => {
             e.preventDefault();
@@ -52,5 +51,4 @@
             }
         });
-
         fileInput.addEventListener('change', (e) => {
             if (e.target.files && e.target.files[0]) {
@@ -60,12 +58,9 @@
     }
 }
-
 function setFileToInput(file) {
     const dataTransfer = new DataTransfer();
     dataTransfer.items.add(file);
-    
     fileInput.files = dataTransfer.files;
 }
-
 function initializeSearchFunctionality() {
     if (addButton) {
@@ -74,5 +69,4 @@
                 const qty = parseFloat(qtyInput.value);
                 const unit = unitSelect.value;
-                
                 if (qty > 0 && unit && selectedIngredient.name) {
                     addIngredient(selectedIngredient, qty, unit);
@@ -85,26 +79,24 @@
         });
     }
-
     if (ingredientSearch) {
         ingredientSearch.addEventListener('input', function() {
-            const query = this.value.trim();
-            currentFocus = -1;
-            selectedIngredient = null; 
-            
-            if (query === '') {
-                hideDropdown(ingredientDropdown);
-                return;
-            }
-
-            clearTimeout(searchTimeout);
-            searchTimeout = setTimeout(() => {
-                searchIngredients(query);
-            }, 300);
-        });
-
+        const query = this.value.trim();
+        currentFocus = -1;
+        selectedIngredient = null; 
+        if (query === '') {
+            hideDropdown(ingredientDropdown);
+            if (addNewIngredientBtn) {
+                addNewIngredientBtn.style.display = 'none';
+            }
+            return;
+        }
+        clearTimeout(searchTimeout);
+        searchTimeout = setTimeout(() => {
+            searchIngredients(query);
+        }, 300);
+    });
         ingredientSearch.addEventListener('keydown', function(e) {
             handleKeyNavigation(e, ingredientDropdown);
         });
-
         ingredientSearch.addEventListener('focus', function() {
             if (this.value.trim() !== '') {
@@ -113,5 +105,4 @@
         });
     }
-
     document.addEventListener('click', function(e) {
         if (!e.target.closest('.search-container')) {
@@ -120,5 +111,4 @@
     });
 }
-
 function initializeInstructionsFunctionality() {
     if (addInstructionButton) {
@@ -127,5 +117,4 @@
         });
     }
-
     if (instructionInput) {
         instructionInput.addEventListener('keydown', function(e) {
@@ -137,23 +126,17 @@
     }
 }
-
 async function searchIngredients(query) {
     if (!ingredientDropdown) return;
-
     try {
         ingredientDropdown.innerHTML = '<div class="loading">Loading...</div>';
         showDropdown(ingredientDropdown);
-
         const response = await fetch(`/Recipes/getSuggestions?query=${encodeURIComponent(query)}`, {
             method: 'GET',
         });
-
         if (!response.ok) {
             throw new Error(`HTTP error! status: ${response.status}`);
         }
-
         const suggestions = await response.json();
         displaySuggestions(suggestions, query);
-
     } catch (error) {
         console.error('Error fetching suggestions:', error);
@@ -162,31 +145,29 @@
     }
 }
-
 function displaySuggestions(suggestions, query) {
     if (!ingredientDropdown) return;
-
+    lastSearchQuery = query;
     ingredientDropdown.innerHTML = '';
-    
     if (!suggestions || suggestions.length === 0) {
         ingredientDropdown.innerHTML = '<div class="no-results">No results found</div>';
         showDropdown(ingredientDropdown);
+        if (addNewIngredientBtn) {
+            addNewIngredientBtn.style.display = 'block';
+            console.log('Showing button for query:', query);
+        }
         return;
     }
-
+    if (addNewIngredientBtn) {
+        addNewIngredientBtn.style.display = 'none';
+    }
     suggestions.forEach((suggestion, index) => {
         const item = document.createElement('div');
         item.className = 'dropdown-item';
         item.setAttribute('data-index', index);
-        
-        
         const name = suggestion.name;
         const id = suggestion.id;
-        
-        
         const regex = new RegExp(`(${query})`, 'gi');
         const highlightedText = name.replace(regex, '<strong>$1</strong>');
         item.innerHTML = highlightedText;
-        
-        
         item.addEventListener('click', function() {
             selectedIngredient = {
@@ -197,16 +178,11 @@
             hideDropdown(ingredientDropdown);
         });
-        
         ingredientDropdown.appendChild(item);
     });
-
     showDropdown(ingredientDropdown);
 }
-
 function handleKeyNavigation(e, dropdownElement) {
     if (!dropdownElement) return;
-
     const items = dropdownElement.querySelectorAll('.dropdown-item:not(.no-results):not(.loading)');
-    
     switch(e.key) {
         case 'ArrowDown':
@@ -216,5 +192,4 @@
             setActive(items);
             break;
-            
         case 'ArrowUp':
             e.preventDefault();
@@ -223,5 +198,4 @@
             setActive(items);
             break;
-            
         case 'Enter':
             e.preventDefault();
@@ -230,5 +204,4 @@
             }
             break;
-            
         case 'Escape':
             hideDropdown(dropdownElement);
@@ -237,8 +210,6 @@
     }
 }
-
 function setActive(items) {
     items.forEach(item => item.classList.remove('highlighted'));
-    
     if (currentFocus >= 0 && currentFocus < items.length) {
         items[currentFocus].classList.add('highlighted');
@@ -246,5 +217,4 @@
     }
 }
-
 function addIngredient(ingredient, quantity, unit) {
     if (!ingredient || !ingredient.name) {
@@ -252,12 +222,9 @@
         return;
     }
-
     const existingIngredient = selectedIngredients.find(item => item.Id === ingredient.id);
-    
     if (existingIngredient) {
         alert('This ingredient is already added to the recipe.');
         return;
     }
-
     const newIngredient = {
         Id: ingredient.id,
@@ -266,18 +233,14 @@
         Unit: unit
     };
-
     selectedIngredients.push(newIngredient);
     updateIngredientsDisplay();
     updateIngredientsInput();
-
     if (ingredientSearch) ingredientSearch.value = '';
     if (qtyInput) qtyInput.value = '';
     if (unitSelect) unitSelect.value = '';
-    
     selectedIngredient = null;
     hideDropdown(ingredientDropdown);
     currentFocus = -1;
 }
-
 function removeIngredient(ingredientName) {
     selectedIngredients = selectedIngredients.filter(item => item.Name !== ingredientName);
@@ -285,27 +248,20 @@
     updateIngredientsInput();
 }
-
 function addInstruction() {
     if (!instructionInput) return;
-
     const instruction = instructionInput.value.trim();
-    
     if (instruction === '') {
         alert('Please enter an instruction.');
         return;
     }
-
     if (selectedInstructions.includes(instruction)) {
         alert('This instruction is already added.');
         return;
     }
-
     selectedInstructions.push(instruction);
     updateInstructionsDisplay();
     updateInstructionsInput();
-
     instructionInput.value = '';
 }
-
 function removeInstruction(instructionIndex) {
     selectedInstructions.splice(instructionIndex, 1);
@@ -313,8 +269,6 @@
     updateInstructionsInput();
 }
-
 function updateIngredientsDisplay() {
     if (!ingredientsList) return;
-
     if (selectedIngredients.length === 0) {
         ingredientsList.innerHTML = '<small class="text-muted">Selected ingredients will appear here</small>';
@@ -329,8 +283,6 @@
     }
 }
-
 function updateInstructionsDisplay() {
     if (!instructionsList) return;
-
     if (selectedInstructions.length === 0) {
         instructionsList.innerHTML = '<small class="text-muted">Added instructions will appear here</small>';
@@ -345,5 +297,4 @@
     }
 }
-
 function updateIngredientsInput() {
     if (hiddenIngredientsInput) {
@@ -351,6 +302,4 @@
     }
 }
-
-
 function updateInstructionsInput() {
     if (hiddenInstructionsInput) {
@@ -358,5 +307,4 @@
     }
 }
-
 function showDropdown(dropdownElement) {
     if (dropdownElement) {
@@ -364,12 +312,13 @@
     }
 }
-
 function hideDropdown(dropdownElement) {
     if (dropdownElement) {
         dropdownElement.style.display = 'none';
     }
+    if (addNewIngredientBtn) {
+        addNewIngredientBtn.style.display = 'none';
+    }
     currentFocus = -1;
 }
-
 function handleFileSelect(file) {
     if (file.type.startsWith('image/')) {
@@ -384,5 +333,4 @@
     }
 }
-
 function validateInstructions() {
     const instructionsContainer = document.getElementById('instructionsList');
@@ -391,5 +339,4 @@
                            instructionsInput.value !== '[]' && 
                            instructionsInput.value.trim() !== '';
-    
     if (!hasInstructions) {
         instructionsContainer.innerHTML = '<div class="items-empty error">Please add at least one instruction step</div>';
@@ -399,6 +346,4 @@
     return true;
 }
-
-
 document.querySelector('form').addEventListener('submit', function(e) {
     if (!validateInstructions()) {
@@ -407,2 +352,255 @@
     }
 });
+function initializeModalFunctionality() {
+    console.log('Initializing modal functionality');
+    const addNewIngredientBtn = document.getElementById('addNewIngredientBtn');
+    const addIngredientModal = document.getElementById('addIngredientModal');
+    const addIngredientForm = document.getElementById('addIngredientForm');
+    const closeModal = document.getElementById('closeModal');
+    const cancelAddIngredient = document.getElementById('cancelAddIngredient');
+    if (addNewIngredientBtn) {
+    addNewIngredientBtn.addEventListener('click', function(e) {
+        e.preventDefault();
+        const qty = qtyInput ? parseFloat(qtyInput.value) : 0;
+        const unit = unitSelect ? unitSelect.value : '';
+        if (!qty || qty <= 0 || !unit) {
+            showValidationMessage('Please enter a valid quantity and select a unit before adding a new ingredient.');
+            return;
+        }
+        showAddIngredientModal(lastSearchQuery);
+    });
+}
+    if (closeModal) {
+        closeModal.addEventListener('click', hideAddIngredientModal);
+    }
+    if (cancelAddIngredient) {
+        cancelAddIngredient.addEventListener('click', function(e) {
+            e.preventDefault();
+            hideAddIngredientModal();
+        });
+    }
+    if (addIngredientModal) {
+        addIngredientModal.addEventListener('click', function(e) {
+            if (e.target === addIngredientModal) {
+                hideAddIngredientModal();
+            }
+        });
+        document.addEventListener('keydown', function(e) {
+            if (e.key === 'Escape' && addIngredientModal.style.display === 'flex') {
+                hideAddIngredientModal();
+            }
+        });
+    }
+    if (addIngredientForm) {
+        addIngredientForm.addEventListener('submit', handleAddNewIngredient);
+    }
+}
+function showAddIngredientModal(ingredientName = '') {
+    console.log('showAddIngredientModal called with:', ingredientName);
+    const addIngredientModal = document.getElementById('addIngredientModal');
+    if (addIngredientModal) {
+        const nameInput = document.getElementById('newIngredientName');
+        if (nameInput) {
+            nameInput.value = ingredientName;
+        }
+        addIngredientModal.style.display = 'flex';
+        addIngredientModal.classList.add('show');
+        setTimeout(() => {
+            if (nameInput) {
+                nameInput.focus();
+                nameInput.select();
+            }
+        }, 100);
+        hideDropdown(ingredientDropdown);
+        console.log('Modal should be visible now');
+    } else {
+        console.log('Modal element not found!');
+    }
+}
+function hideAddIngredientModal() {
+    const addIngredientModal = document.getElementById('addIngredientModal');
+    if (addIngredientModal) {
+        addIngredientModal.classList.remove('show');
+        setTimeout(() => {
+            addIngredientModal.style.display = 'none';
+        }, 300);
+        const form = document.getElementById('addIngredientForm');
+        if (form) {
+            form.reset();
+            const submitBtn = form.querySelector('button[type="submit"]');
+            if (submitBtn) {
+                submitBtn.disabled = false;
+                submitBtn.classList.remove('loading');
+            }
+        }
+    }
+}
+async function handleAddNewIngredient(e) {
+    e.preventDefault();
+    const form = e.target;
+    const submitBtn = form.querySelector('button[type="submit"]');
+    if (submitBtn) {
+        submitBtn.disabled = true;
+        submitBtn.classList.add('loading');
+    }
+    if (!document.getElementById('newIngredientName').value.trim()) {
+        alert('Please enter an ingredient name');
+        if (submitBtn) {
+            submitBtn.disabled = false;
+            submitBtn.classList.remove('loading');
+        }
+        return;
+    }
+    try {
+        let token = document.querySelector('input[name="__RequestVerificationToken"]');
+        if (!token) {
+            token = document.querySelector('input[name="RequestVerificationToken"]');
+        }
+        if (!token) {
+            token = form.querySelector('input[name="__RequestVerificationToken"]');
+        }
+        const tokenValue = token ? token.value : '';
+        const response = await fetch('/Recipes/AddIngredient', {
+            method: 'POST',
+            headers: {
+                'Content-Type': 'application/json',
+                'X-Requested-With': 'XMLHttpRequest',
+                'RequestVerificationToken': tokenValue
+            },
+            body: JSON.stringify({
+                Name: document.getElementById('newIngredientName').value.trim(),
+                Calories: parseFloat(document.getElementById('newIngredientCalories').value) || 0.0,
+                Protein: parseFloat(document.getElementById('newIngredientProtein').value) || 0.0,
+                Carbs: parseFloat(document.getElementById('newIngredientCarbs').value) || 0.0,
+                Fat: parseFloat(document.getElementById('newIngredientFat').value) || 0.0
+            })
+        });
+        if (!response.ok) {
+            const errorText = await response.text();
+            console.error('Server response:', errorText);
+            throw new Error(errorText || `HTTP error! status: ${response.status}`);
+        }
+        const newIngredient = await response.json();
+        selectedIngredient = {
+            id: newIngredient.id,
+            name: newIngredient.name
+        };
+        const ingredientSearch = document.getElementById('ingredientSearch');
+        if (ingredientSearch) {
+            ingredientSearch.value = newIngredient.name;
+        }
+        hideAddIngredientModal();
+        const qtyInput = document.getElementById('ingredientQuantity');
+        const unitSelect = document.getElementById('ingredientUnit');
+        if (qtyInput && unitSelect && qtyInput.value && unitSelect.value) {
+            const qty = parseFloat(qtyInput.value);
+            const unit = unitSelect.value;
+            if (qty > 0) {
+                addIngredient(selectedIngredient, qty, unit);
+            }
+        }
+        showSuccessMessage('Ingredient added successfully!');
+        hideDropdown(ingredientDropdown);
+    } catch (error) {
+        console.error('Error adding ingredient:', error);
+        let errorMessage = 'Error adding ingredient. Please try again.';
+        if (error.message.includes('already exists')) {
+            errorMessage = 'An ingredient with this name already exists.';
+        } else if (error.message.includes('required')) {
+            errorMessage = 'Please fill in all required fields.';
+        } else if (error.message.includes('Anti-forgery')) {
+            errorMessage = 'Security validation failed. Please refresh the page and try again.';
+        }
+        alert(errorMessage);
+    } finally {
+        if (submitBtn) {
+            submitBtn.disabled = false;
+            submitBtn.classList.remove('loading');
+        }
+    }
+}
+function showSuccessMessage(message) {
+    const successMsg = document.createElement('div');
+    successMsg.style.cssText = `
+        position: fixed;
+        top: 20px;
+        right: 20px;
+        background: #10b981;
+        color: white;
+        padding: 1rem 1.5rem;
+        border-radius: 8px;
+        box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3);
+        z-index: 1001;
+        font-weight: 500;
+        animation: slideInRight 0.3s ease;
+    `;
+    successMsg.textContent = message;
+    document.body.appendChild(successMsg);
+    setTimeout(() => {
+        successMsg.style.animation = 'slideOutRight 0.3s ease forwards';
+        setTimeout(() => {
+            if (successMsg.parentNode) {
+                successMsg.parentNode.removeChild(successMsg);
+            }
+        }, 300);
+    }, 3000);
+}
+if (!document.getElementById('success-message-styles')) {
+    const style = document.createElement('style');
+    style.id = 'success-message-styles';
+    style.textContent = `
+        @keyframes slideInRight {
+            from {
+                transform: translateX(100%);
+                opacity: 0;
+            }
+            to {
+                transform: translateX(0);
+                opacity: 1;
+            }
+        }
+        @keyframes slideOutRight {
+            from {
+                transform: translateX(0);
+                opacity: 1;
+            }
+            to {
+                transform: translateX(100%);
+                opacity: 0;
+            }
+        }
+    `;
+    document.head.appendChild(style);
+}
+function showValidationMessage(message) {
+    const existingMsg = document.getElementById('validation-message');
+    if (existingMsg) {
+        existingMsg.remove();
+    }
+    const validationMsg = document.createElement('div');
+    validationMsg.id = 'validation-message';
+    validationMsg.style.cssText = `
+        position: fixed;
+        top: 20px;
+        right: 20px;
+        background: #ef4444;
+        color: white;
+        padding: 1rem 1.5rem;
+        border-radius: 8px;
+        box-shadow: 0 4px 12px rgba(239, 68, 68, 0.3);
+        z-index: 1001;
+        font-weight: 500;
+        animation: slideInRight 0.3s ease;
+        max-width: 300px;
+    `;
+    validationMsg.textContent = message;
+    document.body.appendChild(validationMsg);
+    setTimeout(() => {
+        validationMsg.style.animation = 'slideOutRight 0.3s ease forwards';
+        setTimeout(() => {
+            if (validationMsg.parentNode) {
+                validationMsg.parentNode.removeChild(validationMsg);
+            }
+        }, 300);
+    }, 4000);
+}
Index: NutriMatch/wwwroot/js/RecipeIndex.js
===================================================================
--- NutriMatch/wwwroot/js/RecipeIndex.js	(revision 4a68273d2173d196bea803f19c4d87863b81f215)
+++ NutriMatch/wwwroot/js/RecipeIndex.js	(revision 770ffeaff8f68701ab1f80ba9cdb2d9ced9b33c4)
@@ -14,5 +14,9 @@
     const clickedCard = event.currentTarget;
     clickedCard.classList.add('loading');
-    fetch(`/Recipes/Details/${recipeId}`)
+    const params = new URLSearchParams({
+    isOwner: false,
+    recipeDetailsDisplayContorol: "Index"
+});
+    fetch(`/Recipes/Details/${recipeId}?${params}`)
         .then(response => {
             if (!response.ok) {
@@ -109,5 +113,5 @@
         const recipeFats = parseInt(card.dataset.fat) || 0;
         const favoriteButton = card.querySelector('.favorite-btn');
-        const isFavorited = favoriteButton.getAttribute('data-favorited') === 'true';
+        const isFavorited = favoriteButton ? favoriteButton.getAttribute('data-favorited') === 'true' : false;
         const matchesSearch = searchTerm === '' || title.includes(searchTerm);
         const matchesMacros = 
@@ -116,5 +120,5 @@
             recipeCarbs >= carbs.min && recipeCarbs <= carbs.max &&
             recipeFats >= fats.min && recipeFats <= fats.max;
-        const matchesFavorites = !showingFavoritesOnly || isFavorited;
+        const matchesFavorites = !showingFavoritesOnly || (isFavorited );
         if (matchesSearch && matchesMacros && matchesFavorites) {
             card.style.display = 'block';
