//using Modules.User.Database.Database;
//using Modules.User.Database.Database.Entities;
//using System.Linq.Expressions;

//namespace Modules.User.Database.Repositories;

//public abstract class RepositoryBase<T>(UserDbContext context) : IRepository<T> where T : Entity
//{
//    protected abstract IMongoCollection<T> GetCollections(UserDbContext context);
//    protected bool _useSoftDelete = true;

//    public async Task<Guid> AddAsync(T entity)
//    {
//        await GetCollections(context).InsertOneAsync(entity);
//        return entity.Id;
//    }

//    public async Task<bool> DeleteAsync(T entity)
//    {
//        if (!_useSoftDelete)
//        {
//            var document = await GetCollections(context).FindOneAndDeleteAsync(q => q.Id == entity.Id);
//            return document != null;
//        }
//        else return await SoftDeleteAsync(entity);
//    }

//    protected virtual Task<bool> SoftDeleteAsync(T entity) => throw new NotImplementedException();

//    public async Task<List<T>> GetAllAsync() => await GetCollections(context).Find("{}").ToListAsync();

//    public async Task<T> GetByIdAsync(Guid id) => await GetCollections(context).Find(q => q.Id == id).SingleAsync();

//    public async Task<T?> GetByIdOrDefaultAsync(Guid id) => await GetCollections(context).Find(q => q.Id == id).SingleOrDefaultAsync();

//    public async Task<T> GetFirstWhere(Expression<Func<T, bool>> predicate) =>
//        await GetCollections(context).Find(predicate).SingleAsync();

//    public async Task<T?> GetFirstOrDefaultWhere(Expression<Func<T, bool>> predicate) =>
//        await GetCollections(context).Find(predicate).SingleOrDefaultAsync();

//    public async Task<List<T>> GetRangeByIdsAsync(List<Guid> ids) =>
//        await GetCollections(context).Find(q => ids.Contains(q.Id)).ToListAsync();

//    public async Task<List<T>> GetWhere(Expression<Func<T, bool>> predicate) =>
//        await GetCollections(context).Find(predicate).ToListAsync();

//    public async Task<bool> AnyWhere(Expression<Func<T, bool>> predicate) =>
//        await GetCollections(context).Find(predicate).AnyAsync();

//    public async Task<bool> UpdateAsync(T entity)
//    {
//        //var document = await _context.PaymentCollections.FindOneAndReplaceAsync(q => q.Id == entity.Id, entity, new () { ReturnDocument = ReturnDocument.After });
//        var document = await GetCollections(context).FindOneAndReplaceAsync(q => q.Id == entity.Id, entity);
//        return document != null;
//    }
//}