using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Linq;
namespace MECF.Framework.UI.Client.ClientBase.Collections
{
    ///  
    /// Represents a dynamic data collection that provides notifications when items get added, removed, or when the whole list is refreshed. 
    ///  
    ///  
    public class ObservableRangeCollection : ObservableCollection
    {
        #region Constructors
        ///  
        /// Initializes a new instance of the System.Collections.ObjectModel.ObservableCollection(Of T) class. 
        ///  
        public ObservableRangeCollection()
        {
        }
        ///  
        /// Initializes a new instance of the System.Collections.ObjectModel.ObservableCollection(Of T) class that contains elements copied from the specified collection. 
        ///  
        /// collection: The collection from which the elements are copied. 
        /// The collection parameter cannot be null. 
        public ObservableRangeCollection(IEnumerable collection)
            : base(collection)
        {
        }
        #endregion
        
        ///  
        /// Adds the elements of the specified collection to the end of the ObservableCollection(Of T). 
        ///  
        public virtual void AddRange(IEnumerable collection)
        {
            if (collection == null) throw new ArgumentNullException(nameof(collection));
            var startIndex = Count;
            var enumerable = collection.ToList();
            foreach (var i in enumerable)
                Items.Add(i);
            OnCollectionChanged(
                new NotifyCollectionChangedEventArgs(
                    NotifyCollectionChangedAction.Reset));
        }
        ///  
        /// Removes the first occurence of each item in the specified collection from ObservableCollection(Of T). 
        ///  
        public virtual void RemoveRange(IEnumerable collection)
        {
            if (collection == null) throw new ArgumentNullException(nameof(collection));
            foreach (var i in collection)
                Items.Remove(i);
            OnCollectionChanged(
                new NotifyCollectionChangedEventArgs(
                    NotifyCollectionChangedAction.Reset));
        }
        ///  
        /// Clears the current collection and replaces it with the specified item. 
        ///  
        public virtual void Replace(T item)
        {
            ReplaceRange(new[] {item});
        }
        ///  
        /// Clears the current collection and replaces it with the specified collection. 
        ///  
        public void ReplaceRange(IEnumerable collection)
        {
            if (collection == null) throw new ArgumentNullException(nameof(collection));
            Items.Clear();
            foreach (var i in collection) Items.Add(i);
            OnCollectionChanged(
                new NotifyCollectionChangedEventArgs(
                    NotifyCollectionChangedAction.Reset));
        }
    }
}