public async Task Execute(BehaviorContext <OrderState, OrderItemPrepared> context,
                                  Behavior <OrderState, OrderItemPrepared> next)
        {
            Log.Information($"Courier State Machine - {nameof(OrderItemsBeingPreparedActivity)}");

            var items = _db.ExpectedOrderItems
                        .Where(x => x.OrderId == context.Data.OrderId);

            var item = await items.FirstOrDefaultAsync(x => x.CorrelationId == context.Data.OrderItemId);

            if (item != null)
            {
                item.Status    = context.Data.Status;
                item.Timestamp = context.Data.Timestamp;

                _db.Update(item);
            }

            // for (int i = 0; i < items.Count; i++)
            // {
            //     if (items[i].CorrelationId != context.Data.OrderItemId)
            //         continue;
            //
            //     items[i].Status = context.Data.Status;
            //     items[i].Timestamp = context.Data.Timestamp;
            //     break;
            // }

            int changes = await _db.SaveChangesAsync();

            context.Instance.ActualItemCount = items
                                               .Count(x => x.Status == (int)OrderItemStatus.Prepared);

            await next.Execute(context).ConfigureAwait(false);
        }
        public async Task Execute(BehaviorContext <OrderState, PrepareOrder> context,
                                  Behavior <OrderState, PrepareOrder> next)
        {
            Log.Information($"Courier State Machine - {nameof(PrepareOrderRequestedActivity)}");

            context.Instance.CustomerId        = context.Data.CustomerId;
            context.Instance.RestaurantId      = context.Data.RestaurantId;
            context.Instance.ExpectedItemCount = context.Data.Items.Length;
            context.Instance.ActualItemCount   = 0;
            // context.Instance.Items = items;
            context.Instance.Timestamp = DateTime.Now;

            var items = context.Data.Items.MapExpectedOrderItems(context.Data.OrderId);

            await _db.ExpectedOrderItems.AddRangeAsync(items);

            int addCount = await _db.SaveChangesAsync();

            // fork each item in order to be prepared
            for (int i = 0; i < context.Data.Items.Length; i++)
            {
                await _context.Publish <PrepareOrderItemRequested>(new
                {
                    context.Data.OrderId,
                    context.Data.RestaurantId,
                    context.Data.Items[i].MenuItemId,
                    context.Data.Items[i].SpecialInstructions
                });
            }

            await next.Execute(context).ConfigureAwait(false);
        }
        public async Task Execute(BehaviorContext <OrderState, OrderCanceled> context,
                                  Behavior <OrderState, OrderCanceled> next)
        {
            var items = _db.ExpectedOrderItems
                        .Where(x => x.OrderId == context.Data.OrderId)
                        .ToList();

            foreach (var item in items)
            {
                item.Status = (int)OrderItemStatus.Canceled;
                _db.ExpectedOrderItems.Update(item);
            }

            int changes = await _db.SaveChangesAsync();

            context.Instance.Timestamp = DateTime.Now;

            await next.Execute(context).ConfigureAwait(false);
        }