using API.Models.RecipeModels;
using API.Models.UserModels;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

namespace API.DBAccess
{
    public class RecipeDBAccess
    {
        private readonly DBContext _context;

        public RecipeDBAccess(DBContext context)
        {
            _context = context;
        }

        // Reads the users recipes
        public async Task<List<Recipe>> ReadRecipes(int userId)
        {
            var recipes = await _context.Users.Include(p => p.Recipes).FirstOrDefaultAsync(u => u.Id == userId);

            return recipes.Recipes;
        }

        // Returns a specifik recipe
        public async Task<Recipe> ReadRecipe(int recipeId)
        {
            return await _context.Recipes.Include(r => r.Ingredients).Include(r => r.Directions).FirstOrDefaultAsync(r => r.Id == recipeId);
        }

        // Adds a new recipe to the database
        public async Task<IActionResult> CreateRecipe(Recipe recipe, int userId)
        {
            var recipes = await _context.Users.Include(p => p.Recipes).FirstOrDefaultAsync(u => u.Id == userId);

            recipes.Recipes.Add(recipe);

            bool saved = await _context.SaveChangesAsync() > 1;

            if (saved) { return new OkObjectResult(saved); }

            return new ConflictObjectResult(new { message = "Could not save to database" });
        }

        // Updates the recipe in the database
        public async Task<IActionResult> UpdateRecipe(Recipe recipe)
        {
            _context.Entry(recipe).State = EntityState.Modified;

            bool saved = await _context.SaveChangesAsync() >= 1;

            if (saved) { return new OkObjectResult(recipe); }

            return new ConflictObjectResult(new { message = "Could not save to database" });
        }

        // Deletes the recipe from the database
        public async Task<IActionResult> DeleteRecipe(Recipe recipe)
        {
            _context.Recipes.Remove(recipe);
            bool saved = await _context.SaveChangesAsync() >= 0;

            if (saved) { return new OkObjectResult(saved); }

            return new ConflictObjectResult(new { message = "Could not save to database" });
        }
    }
}