/// <summary>
        /// Checking in an item
        /// </summary>
        /// <param name="assetId"></param>
        public void CheckInItem(int assetId)
        {
            DateTime now = DateTime.Now;

            CMSLibraryAsset item = _context.CMSLibraryAsset
                                   .FirstOrDefault(a => a.Id == assetId);

            _context.Update(item);

            RemoveExistingCheckout(assetId);

            CloseExistingCheckoutHistory(assetId, now);

            IEnumerable <Hold> currentHolds = GetCurrentHolds(assetId);

            // if there are current holds, check out the item to the earliest
            if (currentHolds.Any())
            {
                CheckoutToEarliestHold(assetId, currentHolds);
                return;
            }

            // otherwise, set item status to available
            UpdateStatus(assetId, "Available");

            _context.SaveChanges();
        }
        /// <summary>
        /// Util method updating the Status of the asset
        /// </summary>
        /// <param name="assetId"></param>
        /// <param name="v"></param>
        private void UpdateStatus(int assetId, string v)
        {
            CMSLibraryAsset item = _context.CMSLibraryAsset
                                   .FirstOrDefault(a => a.Id == assetId);

            _context.Update(item);
            item.Status = _context.Status.FirstOrDefault(a => a.Name == v);
        }
        /// <summary>
        /// Checks out an CMSLibraryAsset to a library card id and fills the entry in history
        /// </summary>
        /// <param name="assetId"></param>
        /// <param name="libraryCardId"></param>
        public string CheckoutItem(int assetId, int libraryCardId)
        {
            if (IsCheckedOut(assetId))
            {
                return("Double Checked Out!"); // don't double checkout
            }

            DateTime        now  = DateTime.Now;
            CMSLibraryAsset item = _context.CMSLibraryAsset
                                   .Include(a => a.Status)
                                   .FirstOrDefault(a => a.Id == assetId);

            CMSLibraryCard libraryCard = _context.CMSLibraryCard
                                         .Include(c => c.Checkouts)
                                         .FirstOrDefault(a => a.Id == libraryCardId);

            if (libraryCard == null)
            {
                return("Invalid card!"); // make sure the library card is valid
            }

            IEnumerable <Hold> currentHolds = GetCurrentHolds(assetId);

            if (!currentHolds.Any())
            {
                // Changes the status of the asset to "Checked Out" if the Hold queue is empty
                UpdateStatus(assetId, "Checked Out");
            }

            Checkout checkout = new Checkout // creating the checkout
            {
                LibraryAsset = item,
                LibraryCard  = libraryCard,
                Since        = now,
                Until        = GetDefaultCheckoutTime(now, assetId)
            };

            _context.Add(checkout);

            CheckoutHistory checkoutHistory = new CheckoutHistory // creating the checkout history
            {
                CheckedOut   = now,
                LibraryAsset = item,
                LibraryCard  = libraryCard
            };

            _context.Add(checkoutHistory);
            _context.SaveChanges();
            return(null);
        }
        /// <summary>
        /// Places a Hold to the item linked to a card id and subscriber
        /// </summary>
        /// <param name="assetId"></param>
        /// <param name="libraryCardId"></param>
        /// <returns></returns>
        public string PlaceHold(int assetId, int libraryCardId)
        {
            DateTime now = DateTime.Now;

            CMSLibraryAsset asset = _context.CMSLibraryAsset
                                    .Include(a => a.Status)
                                    .FirstOrDefault(a => a.Id == assetId);

            CMSLibraryCard libraryCard = _context.CMSLibraryCard
                                         .FirstOrDefault(a => a.Id == libraryCardId);

            if (libraryCard == null) // when the card is not valid
            {
                return("Invalid card!");
            }
            else if (GetLatestCheckout(assetId).LibraryCard.Id == libraryCardId) // when the checkouter is trying to place a hold
            {
                return("You cannot place a hold on an item which you have checked out!");
            }
            else if (GetCurrentHolds(assetId).Any(a => a.LibraryCard.Id == libraryCardId)) // when you are trying to place a second hold on an item
            {
                return("You have allready placed a hold on that item!");
            }

            _context.Update(asset);
            if (asset.Status.Name == "Checked Out")
            {
                UpdateStatus(assetId, "On Hold");
            }

            Hold hold = new Hold
            {
                HoldPlaced   = now,
                LibraryAsset = asset,
                LibraryCard  = libraryCard
            };

            _context.Add(hold);
            _context.SaveChanges();
            return(null);
        }