using FoodsharingSiegen.Contracts;
using FoodsharingSiegen.Contracts.Entity;
using Microsoft.EntityFrameworkCore;

namespace FoodsharingSiegen.Server.Data.Service
{
    public class UserService : ServiceBase
    {
        public UserService(FsContext context) : base(context)
        {
            
        }

        public async Task<OperationResult<User>> AddUserAsync(User user)
        {
            try
            {
                if (await Context.Users.AnyAsync(x => x.Mail.ToLower().Equals(user.Mail.ToLower())))
                    return new OperationResult<User>(new Exception("Diese E-Mail Adresse wird bereits verwendet"));
            
                user.Created = DateTime.UtcNow;
            
                await Context.Users.AddAsync(user);
            
                var saveResult = await Context.SaveChangesAsync();
                if (saveResult == 0) return new OperationResult<User>(new Exception("Fehler bei der Registrierung"));
            
                return new OperationResult<User>(user);
            }
            catch (Exception e)
            {
                return new OperationResult<User>(e);
            }
            
        }
        
        public async Task<OperationResult> Update(User user)
        {
            try
            {
                Context.Users.Update(user);
                var saveR = await Context.SaveChangesAsync();
            
                if(saveR < 1) return new OperationResult(new Exception("Fehler beim speichern"));
                return new OperationResult();
            }
            catch (Exception e)
            {
                return new OperationResult(e);
            }
        }
        
        ////////////////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>   Gets users asynchronous. </summary>
        ///
        /// <remarks>   A Beging, 20.10.2021. </remarks>
        ///
        /// <returns>   An asynchronous result that yields the users. </returns>
        ////////////////////////////////////////////////////////////////////////////////////////////////////
        public async Task<OperationResult<List<User>>> GetUsersAsync()
        {
            try
            {
                var users = await Context.Users.ToListAsync();
                return new OperationResult<List<User>>(users);
            }
            catch (Exception e)
            {
                return new OperationResult<List<User>>(e);
            }
        }
    }
}