public async Task <Result <Shelf> > MoveToShelf(ShelfManagerRequest request)
        {
            Shelf target = (
                from menuItem in _db.MenuItems
                from shelf in _db.Shelves
                from restaurant in _db.Restaurants
                where menuItem.MenuItemId == request.MenuItemId &&
                menuItem.TemperatureId == shelf.TemperatureId &&
                shelf.RestaurantId == request.RestaurantId
                select MapEntity(shelf))
                           .FirstOrDefault();

            if (!IsShelfAvailable(target))
            {
                return new Result <Shelf> {
                           Value = null, IsSuccessful = false
                }
            }
            ;

            var orderItem = await _db.OrderItems.FindAsync(request.OrderItemId);

            if (orderItem == null)
            {
                return new Result <Shelf> {
                           Value = null, IsSuccessful = false
                }
            }
            ;

            orderItem.ShelfId = target.ShelfId;

            await _db.SaveChangesAsync();

            return(new Result <Shelf> {
                Value = target, IsSuccessful = true
            });
        }
        public async Task <Result <Shelf> > MoveToOverflow(ShelfManagerRequest request)
        {
            Shelf target = (
                from shelf in _db.Shelves
                where shelf.RestaurantId == request.RestaurantId
                select MapEntity(shelf))
                           .FirstOrDefault(x => x.IsOverflow);

            if (target == null)
            {
                return new Result <Shelf> {
                           Value = null, IsSuccessful = false
                }
            }
            ;

            if (!IsShelfAvailable(target))
            {
                return new Result <Shelf> {
                           Value = null, IsSuccessful = false
                }
            }
            ;

            var orderItem = await _db.OrderItems.FindAsync(request.OrderItemId);

            if (orderItem == null)
            {
                return new Result <Shelf> {
                           Value = null, IsSuccessful = false
                }
            }
            ;

            orderItem.ShelfId = target.ShelfId;

            await _db.SaveChangesAsync();

            return(new Result <Shelf> {
                Value = target, IsSuccessful = true
            });
        }

        Shelf MapEntity(ShelfEntity entity) =>
        new()
        {
            ShelfId       = entity.ShelfId,
            RestaurantId  = entity.RestaurantId,
            Name          = entity.Name,
            DecayRate     = entity.DecayRate,
            IsOverflow    = entity.IsOverflow,
            TemperatureId = entity.TemperatureId,
            Capacity      = entity.Capacity
        };

        Shelf GetShelf(Guid menuItemId)
        {
            Shelf result = (from menuItem in _db.MenuItems
                            from shelf in _db.Shelves
                            where menuItem.MenuItemId == menuItemId &&
                            menuItem.TemperatureId == shelf.TemperatureId
                            select new Shelf
            {
                ShelfId = shelf.ShelfId,
                Name = shelf.Name,
                TemperatureId = shelf.TemperatureId,
                Capacity = shelf.Capacity
            })
                           .FirstOrDefault();

            return(result);
        }

        bool IsShelfAvailable(Shelf shelf)
        {
            if (shelf == null)
            {
                return(false);
            }

            var orderItems =
                from orderItem in _db.OrderItems
                where orderItem.Status == (int)OrderItemStatus.Prepared && orderItem.ShelfId == shelf.ShelfId
                select orderItem;

            return(orderItems.Count() < shelf.Capacity);
        }
    }
}