using SharedLibraryCore.Interfaces;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Text;

namespace SharedLibraryCore.Helpers
{
    /// <summary>
    /// This class provides a way to keep track of changes to an entity
    /// </summary>
    /// <typeparam name="T">Type of entity to keep track of changes to</typeparam>
    public class ChangeTracking<T>
    {
        ConcurrentQueue<T> Values;

        public ChangeTracking()
        {
            Values = new ConcurrentQueue<T>();
        }

        public void OnChange(T value)
        {
            if (Values.Count > 30)
                Values.TryDequeue(out T throwAway);
            Values.Enqueue(value);
        }

        public T GetNextChange()
        {
            bool itemDequeued = Values.TryDequeue(out T val);
            return itemDequeued ? val : default(T);
        }

        public bool HasChanges => Values.Count > 0;
    }
}