public IOrder SuggestOrder(IUser user)
 {
     if (user is null)
     {
         throw new ArgumentNullException(paramName: nameof(user));
     }
     if (OrderHistory.TryGetValue(user, out Stack <IOrder> userHistory) && userHistory.Count > 0)
     {
         // suggest user's last order
         return(new Order(userHistory.Peek()));
     }
     return(new Order(pizzasByPrice: DefaultSuggestedOrderPizzas, location: this, user: user));
 }
        // returns any rejected orders
        public ICollection <IOrder> Order(IUser user, ICollection <IOrder> orders)
        {
            if (user is null)
            {
                throw new ArgumentNullException(paramName: nameof(user));
            }
            if (orders is null)
            {
                throw new ArgumentNullException(paramName: nameof(orders));
            }
            var attemptedOrderTime = TimeProvider.Current.UtcNow;

            if (orders.Count > user.MaxOrdersPerCall)
            {
                throw new ArgumentException(message: $"user should not exceed {user.MaxOrdersPerCall} orders per call.",
                                            paramName: nameof(orders));
            }
            if (LastOrderTime.TryGetValue(user, out DateTime userLastOrderTime) &&
                attemptedOrderTime - userLastOrderTime < MinOrderInterval)
            {
                // user cannot order from here within 2 hours of last order
                return(new List <IOrder>(orders));
            }
            ICollection <IOrder> rejectedOrders = new List <IOrder>();

            IPizzaStoreDBContext context = PSDBContextProvider.Current.NewPSDBContext;

            foreach (IOrder order in orders)
            {
                // reject if this order is for another location
                if (order.Location != this)
                {
                    rejectedOrders.Add(order);
                    continue;
                }
                // reject if this exact order has already been ordered
                if (order.Time != null)
                {
                    rejectedOrders.Add(order);
                    continue;
                }
                int piesRequired = order.PizzasByPrice.Sum(x => x.Value);
                // reject if there is not enough inventory for this order
                if (piesRequired > PieCount)
                {
                    rejectedOrders.Add(order);
                    continue;
                }
                if (!OrderHistory.TryGetValue(user, out Stack <IOrder> userOrderHistory))
                {
                    userOrderHistory   = new Stack <IOrder>();
                    OrderHistory[user] = userOrderHistory;
                }
                userOrderHistory.Push(order);
                LastOrderTime[user] = attemptedOrderTime;
                order.Time          = attemptedOrderTime;
                PieCount           -= piesRequired;

                Dao.Inventory = PieCount;
                context.Update(Dao);
                context.Update(order.Dao);
            }

            context.SaveChanges();
            context.Dispose();

            return(rejectedOrders);
        }