private bool IsMultiMove(CribbageCombos thisCombo, IDeckDict <CribbageCard> thisCol)
        {
            var newCol = thisCol.ToRegularDeckDict();

            newCol.Add(StartCard());
            var whatNewRummy = _rummys !.WhatNewRummy(newCol, thisCombo.NumberInStraight, RummyProcesses <EnumSuitList, EnumColorList, CribbageCard> .EnumRummyType.Runs, false);

            if (whatNewRummy.Count == 0)
            {
                return(false);
            }
            if (whatNewRummy.Count > thisCombo.NumberInStraight)
            {
                return(false);
            }
            whatNewRummy.ForEach(thisCard => thisCard.HasUsed = true);
            EnumCardValueList firstNumber  = whatNewRummy.First().Value;
            EnumCardValueList secondNumber = whatNewRummy.Last().Value;
            var lastTemp = newCol.ToRegularDeckDict();

            lastTemp.KeepConditionalItems(items => items.Value >= firstNumber || items.Value <= secondNumber);
            newCol.Clear();
            newCol.AddRange(lastTemp);
            whatNewRummy = _rummys.WhatNewRummy(newCol, thisCombo.NumberForKind, RummyProcesses <EnumSuitList, EnumColorList, CribbageCard> .EnumRummyType.Sets, false);
            if (whatNewRummy.Count == 0 || whatNewRummy.Count > thisCombo.NumberForKind)
            {
                thisCol.ForEach(thisCard => thisCard.HasUsed = false);
                StartCard().HasUsed = false;
                return(false);
            }
            if (thisCombo.DoublePairNeeded == true)
            {
                lastTemp.KeepConditionalItems(items => items.Value != whatNewRummy.First().Value);
                newCol.Clear();
                newCol.AddRange(lastTemp);
                whatNewRummy = _rummys.WhatNewRummy(newCol, thisCombo.NumberForKind, RummyProcesses <EnumSuitList, EnumColorList, CribbageCard> .EnumRummyType.Sets, false);
                if (whatNewRummy.Count == 0 || whatNewRummy.Count > thisCombo.NumberForKind)
                {
                    thisCol.ForEach(thisCard => thisCard.HasUsed = false);
                    StartCard().HasUsed = false;
                    return(false);
                }
                whatNewRummy.ForEach(thisCard => thisCard.HasUsed = true);
            }
            return(true);
        }
        public bool HadProperKind(IDeckDict <CribbageCard> thisCol, CribbageCombos thisCombo)
        {
            var newCol = thisCol.ToRegularDeckDict();
            DeckRegularDict <CribbageCard> finals = new DeckRegularDict <CribbageCard>();

            newCol.Add(StartCard());
            finals.AddRange(newCol);
            finals.KeepConditionalItems(items => items.HasUsed == false);
            newCol.Clear();
            newCol.AddRange(finals);
            var whatNewRummy = _rummys !.WhatNewRummy(newCol, thisCombo.NumberForKind, RummyProcesses <EnumSuitList, EnumColorList, CribbageCard> .EnumRummyType.Sets, false);

            if (whatNewRummy.Count == 0)
            {
                return(false);
            }
            if (whatNewRummy.Count > thisCombo.NumberForKind)
            {
                return(false);
            }
            whatNewRummy.ForEach(thisCard => thisCard.HasUsed = true);
            return(true);
        }
        private CustomBasicCollection <CribbageCombos> ListCribbageCombos(IDeckDict <CribbageCard> thisCol, bool fromCrib)
        {
            CustomBasicCollection <CribbageCombos> output = new CustomBasicCollection <CribbageCombos>();
            var  mostSuits = thisCol.GroupOrderDescending(items => items.Suit);
            bool hadFourFlush;
            bool hadFiveFlush;
            var  startCard = StartCard();

            startCard.HasUsed = false;
            thisCol.ForEach(thisCard => thisCard.HasUsed = false);

            if (mostSuits.First().Count() == 4 && startCard.Suit == mostSuits.First().Key)
            {
                hadFiveFlush = true;
                hadFourFlush = false;
            }
            else if (mostSuits.First().Count() == 4 && fromCrib == false)
            {
                hadFourFlush = true;
                hadFiveFlush = false; //originally was true.
            }
            else
            {
                hadFourFlush = false;
                hadFiveFlush = false;
            }
            bool           hadMultiMove = false;
            int            pairss       = 0;
            bool           hadLongerRun = false;
            bool           hadStraight  = false;
            bool           hadKind      = false;
            int            fifs;
            CribbageCombos newCombo;

            ComboList.ForEach(thisCombo =>
            {
                if (thisCombo.NumberNeeded == 15)
                {
                    fifs = Find15Combos(thisCol);
                    if (fifs > 0)
                    {
                        newCombo             = new CribbageCombos();
                        newCombo.Description = "Fifteens";
                        newCombo.Points      = fifs * 2;
                        output.Add(newCombo);
                    }
                }
                else if (thisCombo.IsFlush == true)
                {
                    if (thisCombo.CardsToUse == 5 && hadFiveFlush == true)
                    {
                        output.Add(thisCombo);
                    }
                    else if (thisCombo.CardsToUse == 4 && hadFourFlush == true)
                    {
                        output.Add(thisCombo);
                    }
                }

                else if (thisCombo.JackStatus == EnumJackType.Nob)
                {
                    if (thisCol.Any(items => items.Value == EnumCardValueList.Jack && items.Suit == startCard.Suit && startCard.Value != EnumCardValueList.Jack))
                    {
                        output.Add(thisCombo);
                    }
                }
                else if (thisCombo.JackStatus == EnumJackType.Heels)
                {
                    if (thisCol.Any(items => items.Suit == startCard.Suit && startCard.Value == EnumCardValueList.Jack))
                    {
                        output.Add(thisCombo);
                    }
                }
                else if (thisCombo.IsFullHouse)
                {
                    if (HadFullHouse(thisCol))
                    {
                        output.Add(thisCombo);
                    }
                }

                else if (thisCombo.NumberForKind > 0 && thisCombo.NumberInStraight > 0)
                {
                    if (hadMultiMove == false)
                    {
                        hadMultiMove = IsMultiMove(thisCombo, thisCol);
                        if (hadMultiMove == true)
                        {
                            output.Add(thisCombo);
                        }
                    }
                }

                else if (thisCombo.NumberInStraight == 4 && hadLongerRun == true)
                {
                    output.Add(thisCombo);
                }
                else if (thisCombo.NumberInStraight > 0)
                {
                    hadStraight = HadProperStraight(thisCol, thisCombo);
                    if (hadStraight == true)
                    {
                        output.Add(thisCombo);
                    }
                }
                else if (thisCombo.NumberForKind > 2)
                {
                    hadKind = HadProperKind(thisCol, thisCombo);
                    if (hadKind == true)
                    {
                        output.Add(thisCombo);
                    }
                }
                else if (thisCombo.NumberForKind == 2)
                {
                    pairss = HowManyPairs(thisCol);
                    if (pairss > 0)
                    {
                        newCombo             = new CribbageCombos();
                        newCombo.Description = thisCombo.Description;
                        newCombo.Points      = pairss * thisCombo.Points;
                        output.Add(newCombo);
                    }
                }
                else
                {
                    throw new BasicBlankException("Combo Not Supported.  Rethink");
                }
            });
            if (output.Any(items => items.Points == 8))
            {
                if (output.Any(items => items.Points == 3 && items.NumberInStraight == 3))
                {
                    output.RemoveAllOnly(items => items.Points == 3 && items.NumberInStraight == 3); //because you got the double run of 3.
                }
            }
            return(output);
        }