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

namespace FourLayer.BusinessEntity
{

   /// <summary>
   /// Ogólny opis klasy AbstractEntity
   /// </summary>
   [Serializable]
   public abstract class AbstractEntity
   {
      // dane składowe
      private object _key;
      // zbiór opisów wszystkich naruszonych reguł
      private List<string> _brokenRules = new List<string>();

      public AbstractEntity()
      {
         _key = 0;
      }
      public AbstractEntity(object key)
      {
         _key = key;
      }

      /// <summary>
      /// Każda encja musi mieć klucz
      /// </summary>
      public object Key
      {
         get { return _key; }
         set { _key = value; }
      }


      /// <summary>
      /// Każda podklasa będzie odpowiedzialna za sprawdzanie, czy 
      /// jej stan (dane składowe) nie narusza reguł biznesowych
      /// </summary>
      protected abstract bool CheckIfSubClassStateIsValid
      {
         get;
      }

      /// <summary>
      /// Podklasy musza mieć możliwość dodawania opisów naruszonych reguł
      /// </summary>
      protected void AddBrokenRule(string rule)
      {
         _brokenRules.Add(rule);
      }
      /// <summary>
      /// Zwróć opisy naruszonych reguł
      /// </summary>
      public List<string> BrokenRules
      {
         get { return _brokenRules; }
      }
      /// <summary>
      /// Czy obiekt biznesowy jest prawidłowy?
      /// </summary>
      public bool IsValid
      {
         get
         {
            _brokenRules.Clear();
            return CheckIfSubClassStateIsValid;
         }
      }
   }
}