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

namespace ThreeLayer.Business
{
   /// <summary>
   /// Reprezentuje klasę bazową wszystkich obiektów biznesowych
   /// </summary>
   public abstract class AbstractBO
   {
      // dane składowe
      protected const int DEFAULT_ID = 0;

      // flagi określające, czy obiekt jest nowy lub był modyfikowany
      private bool _isNew = true;
      private bool _isModified = false;
      // zbiór opisów wszystkich naruszonych reguł
      private List<string> _brokenRules = new List<string>();


      /// <summary>
      /// Każda podklasa bedzie odpowiaqdać za sprawdzanie, czy 
      /// jej stan (dane składowe) narusza reguły biznesowe
      /// </summary>
      protected abstract bool CheckIfSubClassStateIsValid
      {
         get;
      }

      /// <summary>
      /// Podklasy muszą mieć możliwość dodawania opisu naruszonej reguły
      /// </summary>
      protected void AddBrokenRule(string rule)
      {
         _brokenRules.Add(rule);
      }
      /// <summary>
      /// Zwraca 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;
         }
      }
      /// <summary>
      /// Czy obiekt był modyfikowany od chwili ostatniego zachowania
      /// </summary>
      protected bool IsModified
      {
         get { return _isModified; }
         set { _isModified = value; }
      }
      /// <summary>
      /// Czy obiekt biznesowy jest nowy albo czy zawiera
      /// dane istniejące w bazie danych
      /// </summary>
      protected bool IsNew
      {
         get { return _isNew; }
         set { _isNew = value; }
      }
      
   }
}
