public CardPosition PurgeCardFromDeck(string id)
    {
        if (!TotalDeckList.Where(i => i.Id == id).Any())
        {
            throw new Exception("Could not find card with ID of " + id);
        }
        var card = TotalDeckList.Where(i => i.Id == id).Single();

        if (DrawPile.Contains(card))
        {
            DrawPile.Remove(card);
            return(CardPosition.DRAW);
        }
        if (DiscardPile.Contains(card))
        {
            DiscardPile.Remove(card);
            return(CardPosition.DISCARD);
        }
        if (Hand.Contains(card))
        {
            Hand.Remove(card);
            return(CardPosition.HAND);
        }
        throw new Exception("This should be impossible");
    }
 public void AddNewCardToDiscardPile(AbstractCard card)
 {
     if (TotalDeckList.Any(item => item.Id == card.Id))
     {
         throw new Exception("Attempted to add duplicate card to deck: " + card.Name);
     }
     DiscardPile.Add(card);
 }
    public void MoveCardToPile(AbstractCard card, CardPosition position, bool newCardsAllowed = false)
    {
        var fromPosition = GetCardPosition(card.Id);
        var fromPile     = GetPileForPosition(fromPosition);

        if (!newCardsAllowed && !TotalDeckList.Contains(card))
        {
            Log.Info("Card did not exist prior to pile move");
        }
        var toPile = GetPileForPosition(position);

        if (fromPile == null)
        {
            throw new Exception("Could not find card with name " + card.Name);
        }
        fromPile.RemoveAll((item) => item.Id == card.Id);
        toPile.Add(card);
    }
    public List <AbstractCard> DrawNextNCards(int n)
    {
        var cardsSoFar   = new List <AbstractCard>();
        int cardsToStart = TotalDeckList.Count();

        try
        {
            for (int i = 0; i < n; i++)
            {
                if (DrawPile.IsEmpty())
                {
                    ReshuffleDeck();
                    if (DrawPile.IsEmpty())
                    {
                        Debug.Log("Deck is empty, discard is empty, yet still we attempt to draw");
                        this.Hand.AddRange(cardsSoFar);

                        return(cardsSoFar);
                    }
                }
                cardsSoFar.Add(DrawPile.PopFirstElement());
            }

            this.Hand.AddRange(cardsSoFar);
        }
        finally
        {
            var cardsAfterShuffle = TotalDeckList.Count();

            if (cardsToStart != cardsAfterShuffle)
            {
                throw new Exception("Validation failure: after shuffle had " + cardsAfterShuffle + " and cards to start were " + cardsToStart);
            }
        }
        return(cardsSoFar);
    }