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

using FourLayer.BusinessEntity;
using FourLayer.DataAccessObject;

namespace FourLayer.ApplicationLogic
{
   public enum CustomerServiceCardErrors
   {
      NoError, CardCancelled, CardExpired, CardNotFound, InsufficientCredit, NameMismatch,
   }
   /// <summary>
   /// Obsługuje całość logiki aplikacji katalogu
   /// </summary>
   public class CustomerServiceLogic
   {
      /*
      * CustomerCard
      */
      public EntityCollection<CustomerCard> GetAllCards()
      {
         CustomerCardDAO dao = new CustomerCardDAO();
         return dao.GetAll();
      }
      public CustomerCard GetCardByNumber(string cardNumber)
      {
         if (cardNumber == null)
            return null;

         CustomerCardDAO dao = new CustomerCardDAO();
         return dao.GetByKey(cardNumber);
      }
      public CustomerServiceCardErrors Purchase(string cardNumber, string cardName, decimal amount)
      {
         // najpierw spróbuj pobrać kartę
         CustomerCard card = GetCardByNumber(cardNumber);
         if (card == null)
            return CustomerServiceCardErrors.CardNotFound;

         // sprawdź, czy nazwa karty i numer są zgodne
         if (cardName != card.CardName)
            return CustomerServiceCardErrors.NameMismatch;

         // sprawdź, czy karta została anulowana
         if (card.IsCancelled)
            return CustomerServiceCardErrors.CardCancelled;

         // sprawdź, czy karta wygasła
         if (card.IsExpired)
            return CustomerServiceCardErrors.CardExpired;

         // sprawdź, czy nie przekroczono limitu kredytowego
         if (card.IsOverCreditLimit)
            return CustomerServiceCardErrors.InsufficientCredit;

         // wszystko w porządku, a zatem spróbuj dokonać zakupu
         CustomerCardErrors purchaseError = card.Purchase(amount);
         if (purchaseError == CustomerCardErrors.OverCreditLimit)
            return CustomerServiceCardErrors.InsufficientCredit;
         else
         {
            // zapisz dokonany zakup
            CustomerCardDAO dao = new CustomerCardDAO();
            dao.UpdateBalanceHold(card);
            return CustomerServiceCardErrors.NoError;
         }
      }
   }
}