private static MoveInfo GetCardChoice(CrazyEightDeckManager deckManager, CrazyEightsHand hand, CardSuit wildSuit)
        {
            // super simple rules here
            // 1. Check top card of table
            // 2. Check for Crazy 8
            // 3. Find number of rank matches
            // 4. Find number of suit matches
            // 5. if( have crazy eight ) then
            //      play crazy eight
            //    else if( rank matches > suit matches ) then
            //      play matching rank
            //    else if( suit matches > rank matches ) then
            //      play matching suit
            //    else
            //      play random matching suit or rank
            MoveInfo info = new MoveInfo();

            info.DrawCard = false;
            info.WildCardUsed = false;
            info.SelectedCard = null;

            Card topCard = deckManager.Table[deckManager.Table.Count - 1];

            CardSuit matchSuit = wildSuit == CardSuit.None ? topCard.Suit : wildSuit;
            Card eightCard = hand.FindEight();
            Card duece = hand.FindRank(CardRank.Two);

            // rules change if top card is an eight
            if (topCard.Rank == CardRank.Eight)
            {
                // if we can match rank, do so
                // that will force a play of an eight
                if (eightCard != null)
                {
                    info.SelectedCard = eightCard;
                }
                else if (hand.GetSuitCount(matchSuit) > 0)
                {
                    // get matching suit (order by rank)
                    info.SelectedCard = hand.Cards.Where(c => c.Suit == matchSuit).OrderBy(c1 => c1.Rank).FirstOrDefault();
                }
                else
                {
                    info.DrawCard = true;
                }
            }
            else if (topCard.Rank == CardRank.Two && duece != null)
            {
                // play the duece on a draw two
                info.SelectedCard = duece;
            }
            else
            {
                // get suit count, without eights
                var suitCount = hand.Cards.Count(c => c.Suit == matchSuit && c.Rank != CardRank.Eight);
                var rankCount = hand.Cards.Count(c => c.Rank == topCard.Rank);

                // no eight, free to play as you wish
                if (suitCount > rankCount)
                {
                    // get matching suit (order by rank)
                    info.SelectedCard =
                        hand.Cards
                        .Where(c => c.Suit == matchSuit && c.Rank != CardRank.Eight)
                        .OrderBy(c1 => c1.Rank)
                        .FirstOrDefault();
                }
                else if (rankCount > 0)
                {
                    // get matching rank
                    info.SelectedCard =
                        hand.Cards
                        .Where(c => c.Rank == topCard.Rank)
                        .FirstOrDefault();
                }
                else
                {
                    // no matches above
                    // see if we have an eight
                    if (hand.Cards.Count(c => c.Rank == CardRank.Eight) > 0)
                    {
                        // get first eight
                        info.SelectedCard = hand.Cards.Where(c => c.Rank == CardRank.Eight).FirstOrDefault();
                    }
                    else
                    {
                        info.DrawCard = true;
                    }
                }
            }

            if (info.SelectedCard != null)
            {
                if (info.SelectedCard.Rank == CardRank.Eight)
                {
                    info.WildCardUsed = true;
                    info.OverrideSuit = SelectOverrideSuit(hand);
                }
            }

            return info;
        }
        private static CardSuit SelectOverrideSuit(CrazyEightsHand hand)
        {
            CardSuit overrideSuit = CardSuit.Diamonds;

            int clubCount = hand.GetSuitCount(CardSuit.Clubs);
            int heartCount = hand.GetSuitCount(CardSuit.Hearts);
            int spadeCount = hand.GetSuitCount(CardSuit.Spades);
            int diamondCount = hand.GetSuitCount(CardSuit.Diamonds);

            if (clubCount >= heartCount && clubCount >= spadeCount && clubCount >= diamondCount)
            {
                overrideSuit = CardSuit.Clubs;
            }
            else if (heartCount >= clubCount && heartCount >= spadeCount && heartCount >= diamondCount)
            {
                overrideSuit = CardSuit.Hearts;
            }
            else if (spadeCount >= clubCount && spadeCount >= heartCount && spadeCount >= diamondCount)
            {
                overrideSuit = CardSuit.Spades;
            }
            else if (diamondCount >= clubCount && diamondCount >= heartCount && diamondCount >= spadeCount)
            {
                overrideSuit = CardSuit.Diamonds;
            }

            return overrideSuit;
        }