using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;

namespace Mirea.Api.Endpoint.Sync.Common;

internal class DataRepository<T> where T : class
{
    private readonly ConcurrentBag<T> _data = [];
    private readonly object _lock = new();

    public IEnumerable<T> GetAll() => _data.ToList();

    public DataRepository(List<T> data)
    {
        foreach (var d in data)
            _data.Add(d);
    }

    public T? Get(Func<T, bool> predicate)
    {
        var entity = _data.FirstOrDefault(predicate);
        return entity;
    }

    public T Create(Func<T> createEntity)
    {
        var entity = createEntity();
        _data.Add(entity);
        return entity;
    }

    public T GetOrCreate(Func<T, bool> predicate, Func<T> createEntity)
    {
        lock (_lock)
        {
            var entity = Get(predicate);
            return entity ?? Create(createEntity);
        }
    }
}