private void PairCheck(GameCard firstCard, GameCard secondCard, GameCard[] cardsOnTable, IPlayer player)
        {
            int firstCardPairCount = cardsOnTable.Count(card => firstCard.Rank == card.Rank);
            int secondCardPairCount = cardsOnTable.Count(card => secondCard.Rank == card.Rank);

            int pairsOnTableCount = cardsOnTable
                .GroupBy(card => card.Rank)
                .Select(group => new { Count = @group.Count() })
                .Count(group => @group.Count == 2);


            if ((firstCardPairCount == 1 ^ secondCardPairCount == 1) &&
                firstCard.Rank == secondCard.Rank)
            {
                if (pairsOnTableCount != 1)
                {
                    return;
                }
            }

            if (firstCardPairCount == 1)
            {
                player.PokerHandMultiplier = 0;
                player.CardPower = firstCard.Rank * 4 + player.PokerHandMultiplier * 100;
            }

            if (secondCardPairCount == 1)
            {
                player.PokerHandMultiplier = 0;
                player.CardPower = secondCard.Rank * 4 + player.PokerHandMultiplier * 100;
            }

            var pairOnTableRank = cardsOnTable
                .GroupBy(card => card.Rank)
                .Select(group => new
                {
                    Rank = @group.Key,
                    Count = @group.Count()
                })
                .Where(group => @group.Count == 1)
                .Select(newGroup => newGroup.Rank)
                .First();

            player.PokerHandMultiplier = 0;
            player.CardPower = pairOnTableRank * 4 + player.PokerHandMultiplier * 100;
        }
        private void TwoPairCheck(GameCard firstCard, GameCard secondCard, GameCard[] cardsOnTable, IPlayer player)
        {
            int firstCardPairCount = cardsOnTable.Count(card => firstCard.Rank == card.Rank);
            int secondCardPairCount = cardsOnTable.Count(card => secondCard.Rank == card.Rank);

            if (firstCardPairCount > 1 || secondCardPairCount > 1)
            {
                return;
            }

            if (firstCardPairCount == 1 && secondCardPairCount == 1 && firstCard.Rank == secondCard.Rank)
            {
                return;
            }

            int pairsOnTable = 0;
            int highestTablePairRank = 0;

            for (int startCardIndex = 0; startCardIndex < cardsOnTable.Length - 1; startCardIndex++)
            {
                int pairCount = 0;

                for (int endCardIndex = cardsOnTable.Length - 1; endCardIndex > 0; endCardIndex--)
                {
                    if (endCardIndex == startCardIndex)
                    {
                        continue;
                    }

                    if (cardsOnTable[startCardIndex].Rank != cardsOnTable[endCardIndex].Rank)
                    {
                        continue;
                    }

                    pairCount++;

                    if (highestTablePairRank < cardsOnTable[startCardIndex].Rank)
                    {
                        highestTablePairRank = cardsOnTable[startCardIndex].Rank;
                    }
                }

                if (pairCount > 1)
                {
                    return;
                }

                if (pairCount == 1)
                {
                    pairsOnTable++;
                }
            }

            switch (pairsOnTable)
            {
                case 0:
                    if (firstCardPairCount == 1 && secondCardPairCount == 1)
                    {
                        player.PokerHandMultiplier = 2;
                        player.CardPower = firstCard.Rank * 2 + secondCard.Rank * 2 + player.PokerHandMultiplier * 100;
                    }

                    break;
                case 1:
                    if (firstCard.Rank == secondCard.Rank)
                    {
                        player.PokerHandMultiplier = 2;
                        player.CardPower = firstCard.Rank * 2 + highestTablePairRank * 2 + player.PokerHandMultiplier * 100;
                    }
                    else if (firstCardPairCount == 1 && secondCardPairCount != 1)
                    {
                        player.PokerHandMultiplier = 2;
                        player.CardPower = firstCard.Rank * 2 + highestTablePairRank * 2 + player.PokerHandMultiplier * 100;
                    }
                    else if (secondCardPairCount == 1 && firstCardPairCount != 1)
                    {
                        player.PokerHandMultiplier = 2;
                        player.CardPower = secondCard.Rank * 2 + highestTablePairRank * 2 + player.PokerHandMultiplier * 100;
                    }
                    else if (secondCardPairCount == 1 && firstCardPairCount == 1)
                    {
                        int highestRank;
                        int secondHighestRank;

                        if (firstCard.Rank > secondCard.Rank)
                        {
                            highestRank = firstCard.Rank;
                            secondHighestRank = secondCard.Rank;
                        }
                        else
                        {
                            highestRank = secondCard.Rank;
                            secondHighestRank = firstCard.Rank;
                        }

                        if (secondHighestRank < highestTablePairRank)
                        {
                            secondHighestRank = highestTablePairRank;
                        }

                        player.PokerHandMultiplier = 2;
                        player.CardPower = highestRank * 2 + secondHighestRank * 2 +  player.PokerHandMultiplier * 100;
                    }

                    break;
                case 2:
                    if (firstCard.Rank == secondCard.Rank)
                    {
                        int highestCardHandOrTable = Math.Max(highestTablePairRank, Math.Max(firstCard.Rank, secondCard.Rank));
                        player.PokerHandMultiplier = 2;
                        player.CardPower = highestCardHandOrTable * 4 + player.PokerHandMultiplier * 100;
                    }
                    else if (firstCardPairCount == 1)
                    {
                        int highestCardHandOrTable = firstCard.Rank > highestTablePairRank ? firstCard.Rank : highestTablePairRank;
                        player.PokerHandMultiplier = 2;
                        player.CardPower = highestCardHandOrTable * 4 + player.PokerHandMultiplier * 100;
                    }
                    else if (secondCardPairCount == 1)
                    {
                        int highestCardHandOrTable = secondCard.Rank > highestTablePairRank ? secondCard.Rank : highestTablePairRank;
                        player.PokerHandMultiplier = 2;
                        player.CardPower = highestCardHandOrTable * 4 + player.PokerHandMultiplier * 100;
                    }
                    else
                    {
                        player.PokerHandMultiplier = 2;
                        player.CardPower = highestTablePairRank * 4 + player.PokerHandMultiplier * 100;
                    }

                    break;
            }
        }
        private void StraightCheck(GameCard firstCard, GameCard secondCard, GameCard[] cardsOnTable, IPlayer player)
        {
            int firstCardPairs = cardsOnTable.Count(card => firstCard.Rank == card.Rank);
            int secondCardPairs = cardsOnTable.Count(card => secondCard.Rank == card.Rank);
            List<int> allCards = new List<int>();

            if (firstCardPairs == 0)
            {
                if (firstCard.Rank == 14)
                {
                    allCards.Add(firstCard.Rank);
                    allCards.Add(1);
                }
                else
                {
                    allCards.Add(firstCard.Rank);
                }
            }

            if (secondCardPairs == 0)
            {
                if (secondCard.Rank == 14)
                {
                    allCards.Add(secondCard.Rank);
                    allCards.Add(1);
                }
                else
                {
                    allCards.Add(firstCard.Rank);
                }
            }

            if (cardsOnTable.Any(card => card.Rank == 14))
            {
                allCards.Add(1);
            }

            allCards.AddRange(cardsOnTable.Select(card => card.Rank));

            allCards.Sort();

            int countConsecutives = 0;
            int highestCardRankInStreight = 0;

            for (int startCard = 0; startCard < allCards.Count - 1; startCard++)
            {
                if (allCards[startCard] + 1 == allCards[startCard + 1])
                {
                    countConsecutives++;
                    if (countConsecutives >= 5)
                    {
                        highestCardRankInStreight = allCards[startCard + 1];
                    }
                }
            }

            if (countConsecutives < 5)
            {
                return;
            }

            player.PokerHandMultiplier = 4;
            player.CardPower = highestCardRankInStreight * 4 + player.PokerHandMultiplier * 100;
        }
        private void ThreeOfAKindCheck(GameCard firstCard, GameCard secondCard, GameCard[] cardsOnTable, IPlayer player)
        {
            int firstCardThreeOfAKindCount = cardsOnTable.Count(card => firstCard.Rank == card.Rank);
            int secondCardThreeOfAKindCount = cardsOnTable.Count(card => secondCard.Rank == card.Rank);

            if (firstCardThreeOfAKindCount > 2 || secondCardThreeOfAKindCount > 2)
            {
                return;
            }

            if (firstCardThreeOfAKindCount == 2 && secondCardThreeOfAKindCount == 2 && firstCard.Rank == secondCard.Rank)
            {
                return;
            }

            GameCard highestCard = this.GetHighestCardInHand(firstCard, secondCard);

            if (firstCardThreeOfAKindCount == 2 || secondCardThreeOfAKindCount == 2)
            {
                player.PokerHandMultiplier = 3;
                if (firstCardThreeOfAKindCount == 2 && secondCardThreeOfAKindCount != 2)
                {
                    player.CardPower = firstCard.Rank * 4 + player.PokerHandMultiplier * 100;
                }
                else if (firstCardThreeOfAKindCount != 2 && secondCardThreeOfAKindCount == 2)
                {
                    player.CardPower = secondCard.Rank * 4 + player.PokerHandMultiplier * 100;
                }
                else
                {
                    player.CardPower = highestCard.Rank * 4 + player.PokerHandMultiplier * 100;
                }
            }

            if (firstCardThreeOfAKindCount == 1 &&
                secondCardThreeOfAKindCount == 1 &&
                firstCard.Rank == secondCard.Rank)
            {
                player.PokerHandMultiplier = 3;
                player.CardPower = firstCard.Rank * 4 + player.PokerHandMultiplier * 100;
            }

            var tableCardsTreeOfAKind = cardsOnTable
                .GroupBy(card => card.Rank)
                .Select(group => new { Rank = @group.Key, Count = @group.Count() })
                .OrderByDescending(group => @group.Count)
                .First();

            if (tableCardsTreeOfAKind.Count != 3)
            {
                return;
            }

            if (firstCardThreeOfAKindCount == 1 &&
                secondCardThreeOfAKindCount == 1 &&
                firstCard.Rank == secondCard.Rank)
            {
                int highestCardHandOrTable = tableCardsTreeOfAKind.Rank > firstCard.Rank ? tableCardsTreeOfAKind.Rank : firstCard.Rank;
                player.PokerHandMultiplier = 3;
                player.CardPower = highestCardHandOrTable * 4 + player.PokerHandMultiplier * 100;
            }

            if (firstCardThreeOfAKindCount == 0 &&
                secondCardThreeOfAKindCount == 0)
            {
                player.PokerHandMultiplier = 3;
                player.CardPower = tableCardsTreeOfAKind.Rank * 4 + player.PokerHandMultiplier * 100;
            }
        }
        private void StraightFlushCheck(GameCard firstCard, GameCard secondCard, GameCard[] cardsOnTable, IPlayer player)
        {
            int firstCardPairs = cardsOnTable.Count(card => firstCard.Rank == card.Rank);
            int secondCardPairs = cardsOnTable.Count(card => secondCard.Rank == card.Rank);

            SortedDictionary<int, CardSuit> allCards = new SortedDictionary<int, CardSuit>();

            if (firstCard.Rank == 14)
            {
                allCards[firstCard.Rank] = firstCard.Suit;
                allCards[1] = firstCard.Suit;
            }
            else
            {
                allCards[firstCard.Rank] = firstCard.Suit;
            }

            if (secondCard.Rank == 14)
            {
                allCards[secondCard.Rank] = secondCard.Suit;
                allCards[1] = secondCard.Suit;
            }
            else
            {
                allCards[secondCard.Rank] = secondCard.Suit;
            }

            foreach (GameCard card in cardsOnTable)
            {
                if (card.Rank == 14)
                {
                    allCards[card.Rank] = card.Suit;
                    allCards[1] = card.Suit;
                }
                else
                {
                    allCards[card.Rank] = card.Suit;
                }
            }

            List<int> allCardsKeys = new List<int>(allCards.Keys);

            int streightFlushCardsCount = 0;
            int streightFlushCardsHighestRank = 0;

            for (int index = 0; index < allCardsKeys.Count - 1; index++)
            {
                if (allCardsKeys[index] + 1 == allCardsKeys[index + 1] && allCards[allCardsKeys[index]] == allCards[allCardsKeys[index + 1]])
                {
                    streightFlushCardsCount++;

                    if (streightFlushCardsCount >= 5)
                    {
                        streightFlushCardsHighestRank = allCardsKeys[index + 1];
                    }
                }
            }

            if (streightFlushCardsCount < 5)
            {
                return;
            }

            player.PokerHandMultiplier = 8;
            player.CardPower = streightFlushCardsHighestRank * 4 + player.PokerHandMultiplier * 100;
        }