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;
        }

        public async Task<PrefereredRecipes> ReadPrefereredRecipes(int userId)
        {
            var recipes = await _context.Users.Include(u => u.PrefereredRecipes).ThenInclude(p => p.Recipes).FirstOrDefaultAsync(u => u.Id == userId);

            return recipes.PrefereredRecipes;
        }

        public async Task<PrefereredRecipes> ReadAllRecipe(int prefereredRecipesId)
        {
            return await _context.PrefereredRecipes.Include(p => p.Recipes).FirstOrDefaultAsync(r => r.Id == prefereredRecipesId);
        }

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

        public async Task<PrefereredRecipes> CreateMissingLists(int userId)
        {
            var user = await _context.Users.FirstOrDefaultAsync(u => u.Id == userId);
            user.PrefereredRecipes = new PrefereredRecipes();
            user.PrefereredRecipes.Recipes = new List<Recipe>();

            _context.SaveChangesAsync();

            return await ReadPrefereredRecipes(userId);
        }

        public async Task<IActionResult> CreateRecipe(Recipe recipe, int prefereredRecipeId)
        {
            var recipes = await _context.PrefereredRecipes.Include(p => p.Recipes).FirstOrDefaultAsync(p => p.Id == prefereredRecipeId);

            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" });
        }

        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" });
        }

        public async Task<IActionResult> DeleteUser(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" });
        }
    }
}