using System;
using System.Collections;
using System.Collections.Generic;

namespace FourLayer.BusinessEntity
{

   /// <summary>
   /// Ogólny zbiór encji biznesowych aplikacji
   /// </summary>
   [Serializable]
   public class EntityCollection<T> : IEnumerable<T> where T : AbstractEntity
   {
      // dane składowe
      private List<T> _entities;

      /// <summary>
      /// Konstruktor inicjalizuje zbiór wewnętrzny
      /// </summary>
      public EntityCollection()
      {
         _entities = new List<T>();
      }

      /// <summary>
      /// Dodaj encję do zbioru
      /// </summary>
      public void Add(T entity)
      {
         _entities.Add(entity);
      }

      public void Remove(T entity)
      {
         _entities.Remove(entity);
      }

      public void Clear(T entity)
      {
         _entities.Clear();
      }

      /// <summary>
      /// Indekser umożliwiający pobranie elementu ze zbioru na podstawie indeksu numerycznego
      /// </summary>
      public T this[int index]
      {
         get
         {
            if (index >= 0 && index < _entities.Count)
               return _entities[index];
            else
               return default(T);
         }
      }

      /// <summary>
      /// Odszukaj klienta o przekazanej wartości identyfikatora
      /// </summary>
      public T FindByKey(object key)
      {
         foreach (T entity in _entities)
         {
            if (entity.Key == key)
               return entity;
         }
         return null;
      }

      /// <summary>
      /// Sprawdza, czy zbiór jest prawidłowy, prosząc, aby
      /// każdy element zbioru sprawdził, czy sam jest prawidłowy
      /// </summary>
      public bool IsValid()
      {
         bool valid = true;
         foreach (T entity in _entities)
         {
            if (!entity.IsValid)
               valid = false;
         }
         return valid;
      }

      /// <summary>
      /// Musi zaimplementować GetEnumerator dla IEnumerable&lt;T&gt;
      /// 
      /// Implementacja tego interfejsu umożliwi iterowanie zbioru za pomocą instrukcji foreach
      /// (a tym samym umożliwi użycie zbioru do wiązania danych)
      /// </summary>
      public IEnumerator<T> GetEnumerator()
      {
         return _entities.GetEnumerator();
      }

      /// <summary>
      /// Musi zaimplementować także GetEnumerator dla IEnumerable w celu umożliwienia iteracji.
      /// </summary>
      IEnumerator IEnumerable.GetEnumerator()
      {
         return GetEnumerator();
      }


      public int Count
      {
         get { return _entities.Count; }
      }

      
   }
}