private AppliedBuy ApplyBuy(PromoModels.Buy buy, Dictionary <string, List <PromoModels.MarkedItem> > groupedItems, PromoModels.Promo promo)
        {
            if (!groupedItems.TryGetValue(buy.Category, out List <PromoModels.MarkedItem> value))
            {
                return(new AppliedBuy {
                    Applied = false, GroupItems = groupedItems
                });
            }

            var matchedItems = new List <PromoModels.MarkedItem>();

            foreach (var item in groupedItems[buy.Category])
            {
                var isMarkedBuy = item.MarkedBuys.TryGetValue(promo.Id, out bool val1);
                var isMarkedGet = item.MarkedGets.TryGetValue(promo.Id, out float val2);

                if (!isMarkedBuy && !isMarkedGet)
                {
                    matchedItems.Add(item);
                }
            }

            if (matchedItems.Count < buy.Count)
            {
                return(new AppliedBuy {
                    Applied = false, GroupItems = groupedItems
                });
            }

            groupedItems = MarkBuyItems(groupedItems, buy, promo);

            return(new AppliedBuy {
                Applied = true, GroupItems = groupedItems
            });
        }
        private Dictionary <string, List <PromoModels.MarkedItem> > MarkBuyItems(Dictionary <string, List <PromoModels.MarkedItem> > groupedItems, PromoModels.Buy buy, PromoModels.Promo promo)
        {
            var markCount = 0;

            for (int i = 0; i < groupedItems[buy.Category].Count; i++)
            {
                var item = groupedItems[buy.Category][i];

                if (markCount == buy.Count)
                {
                    break;
                }

                var isMarkedBuy = item.MarkedBuys.TryGetValue(promo.Id, out bool val1);
                var isMarkedGet = item.MarkedGets.TryGetValue(promo.Id, out float val2);

                if (!isMarkedBuy && !isMarkedGet)
                {
                    groupedItems[buy.Category][i].MarkedBuys[promo.Id] = true;
                    markCount += 1;
                }
            }

            return(groupedItems);
        }