using AsbCloudApp.Services;
using AsbCloudDb.Model;
using Microsoft.EntityFrameworkCore;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace AsbCloudInfrastructure.Repository
{
    public class UserSettingsRepository : IUserSettingsRepository
    {
        private readonly IAsbCloudDbContext context;

        public UserSettingsRepository(IAsbCloudDbContext context)
        {
            this.context = context;
        }

        public Task<System.Text.Json.JsonDocument> GetOrDefaultAsync(int userId, string key, CancellationToken token)
            => context.Set<UserSetting>()
                .Where(s => s.IdUser == userId && s.Key == key)
                .Select(s => s.Value)
                .FirstOrDefaultAsync(token);

        public async Task<int> InsertAsync(int userId, string key, System.Text.Json.JsonDocument value, CancellationToken token)
        {
            var set = context.Set<UserSetting>();

            if (await set.AnyAsync(s => s.IdUser == userId && s.Key == key, token))
                return IUserSettingsRepository.ErrorKeyIsUsed;

            var entity = new UserSetting
            {
                IdUser = userId,
                Key = key,
                Value = value,
            };

            context.Set<UserSetting>()
                .Add(entity);

            return await context.SaveChangesAsync(token);
        }

        public async Task<int> UpdateAsync(int userId, string key, System.Text.Json.JsonDocument value, CancellationToken token)
        {
            var set = context.Set<UserSetting>();
            var updatingItem = await set
                .FirstOrDefaultAsync(s => s.IdUser == userId && s.Key == key, token);

            if (updatingItem is null)
                return IUserSettingsRepository.ErrorKeyNotFound;

            updatingItem.Value = value;
            set.Update(updatingItem);

            return await context.SaveChangesAsync(token);
        }
        public async Task<int> DeleteAsync(int userId, string key, CancellationToken token)
        {
            var set = context.Set<UserSetting>();
            var removingItem = await set
                .FirstOrDefaultAsync(s => s.IdUser == userId && s.Key == key, token);

            if (removingItem is null)
                return IUserSettingsRepository.ErrorKeyNotFound;

            set.Remove(removingItem);
            return await context.SaveChangesAsync(token);
        }
    }
}