using System;
using System.Data;

using TwoLayer.DataAccess;

namespace ThreeLayer.Business
{
   /// <summary>
   /// Obiekt biznesowy na informacje o wydawcy
   /// </summary>
   public class PublisherBO: AbstractBO 
   {
      // dane składowe
      private int _id = DEFAULT_ID;
      private string _name = "";

      // konstruktory
      public PublisherBO() { }
      public PublisherBO(int id, string name)
      {
         _id = id;
         _name = name;
         IsNew = false;
         IsModified = true;
      }

      public static PublisherBO CreatePublisher(int pubId)
      {
         PublisherBO pub = new PublisherBO();
         if (pub.Load(pubId))
            return pub;
         else
            return null;
      }

      public static void UpdatePublisher(PublisherBO pub)
      {
         pub.Update();
      }

      /// <summary>
      /// Zapełnia obiekt danymi na podstawie przekazanego identyfikatora
      /// </summary>
      /// <returns>
      /// true w przypadku pomślnego zapełnienia danymi, w przeciwnym razie false
      /// </returns>
      public bool Load(int id)
      {
         PublisherDA da = new PublisherDA();
         DataTable table = da.GetById(id);
         // jeśli w tabeli nie ma danych, zapełnienie nie powidoło się
         if (table.Rows.Count == 0)
         {
            AddBrokenRule("Wydawca o numerze id=" + id + " nie zopstał odnaleziony");
            return false;
         }
         // ustaw dane składowe zgodnie z pobranymi danymi
         Id = (int)table.Rows[0]["PublisherId"];
         Name = (string)table.Rows[0]["PublisherName"];
         IsNew = false;
         // upewnij się, że załadowane dane są zgodne z regułami biznesowymi
         return IsValid;
      }

      /// <summary>
      /// Zapisuje dane obiektu. Jeśli obiekt jest nowy, wstaw dane,
      /// w przeciwnym razie aktualizuj dane, jeżeli uległy zmianie
      /// </summary>
      public void Save()
      {
         if (IsNew)
            Insert();
         else 
            Update();
      }

      /// <summary>
      /// Tylko aktualizuje dane
      /// </summary>
      public void Update()
      {
         if (IsValid)
         {
            PublisherDA da = new PublisherDA();
            if (IsModified)
            {
               da.UpdatePublisher(Id, Name);
               IsModified = false;
            }
         }
      }

      /// <summary>
      /// Tylko wstawia dane
      /// </summary>
      public void Insert()
      {
         IsNew = true;
         if (IsValid)
         {
            
            PublisherDA da = new PublisherDA();
            da.InsertPublisher(Name);
         }
      }

      /// <summary>
      /// Usuwa dane
      /// </summary>
      public void Delete()
      {
         PublisherDA da = new PublisherDA();
         da.DeletePublisher(Id);
      }

      /// <summary>
      /// Sprawdza, czy stan wewnętrzny obiektu biznesowego jest prawidłowy
      /// </summary>
      protected override bool CheckIfSubClassStateIsValid
      {
         get
         {
            bool valid = true;
            if (Name.Length == 0)
            {
               AddBrokenRule("Nazwa wydawcy nie może byc pusta");
               valid = false;
            }
            if (Id < 0)
            {
               AddBrokenRule("Id wydawcy nie może być mniejsze niż zero");
               valid = false;
            }
            if (IsNew)
            {
               // sprawdź, czy wydawca już nie istnieje
               PublisherDA da = new PublisherDA();
               DataTable dt = da.GetByName(Name);
               if (dt.Rows.Count > 0)
               {
                  AddBrokenRule("Nazwa wydawcy już istnieje");
                  valid = false;
               }
            }
            return valid;
         }
      }

      // właściwości

      public int Id
      {
         get { return _id; }
         set { 
            _id = value;
            IsModified = true;
         }
      }
      public string Name
      {
         get { return _name; }
         set { 
            _name = value;
            IsModified = true;
         }
      }
      public PublisherBO[] WrapAsArray
      {
         get
         {
            PublisherBO[] pubArray = {
               this
            };
            return pubArray;
         }
      }
   }
}
