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

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

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

        public async Task<User> ReadUser(int userId)
        {
            return await _context.Users.FirstOrDefaultAsync(u => u.Id == userId);
        }

        public async Task<List<User>> ReadAllUsers()
        {
            return await _context.Users.ToListAsync();
        }

        public async Task<User> ReadUserByRefreshToken(string refreshToken)
        {
            return await _context.Users.FirstOrDefaultAsync(u => u.RefreshToken == refreshToken);
        }

        public async Task<User> ReadUserForDelete(int userId)
        {
            return await _context.Users.FirstOrDefaultAsync(u => u.Id == userId);
        }

        public async Task<User> ReadUserForLogin(string emailOrUsername)
        {
            if (emailOrUsername.Contains("@"))
            {
                return await _context.Users.FirstOrDefaultAsync(u => u.Email == emailOrUsername);
            }
            else
            {
                return await _context.Users.FirstOrDefaultAsync(u => u.UserName == emailOrUsername);
            }
        }

        public async Task<IActionResult> CreateUser(User user)
        {
            _context.Users.Add(user);

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

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

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

        }

        public async Task<IActionResult> UpdateUser(User user)
        {
            _context.Entry(user).State = EntityState.Modified;

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

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

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

        }

        public async Task<IActionResult> UpdatePassword(User user)
        {
            _context.Entry(user).State = EntityState.Modified;

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

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

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

        public async Task<IActionResult> DeleteUser(User user)
        {
            _context.Users.Remove(user);
            bool saved = await _context.SaveChangesAsync() >= 0;

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

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