private Point ApplyOffset(Point position, AdjacentSeatDirection direction)
        {
            switch (direction)
            {
            case AdjacentSeatDirection.Down:
                position.Offset(0, 1);
                break;

            case AdjacentSeatDirection.Up:
                position.Offset(0, -1);
                break;

            case AdjacentSeatDirection.Left:
                position.Offset(-1, 0);
                break;

            case AdjacentSeatDirection.Right:
                position.Offset(1, 0);
                break;

            case AdjacentSeatDirection.BottomLeft:
                position.Offset(-1, 1);
                break;

            case AdjacentSeatDirection.BottomRight:
                position.Offset(1, 1);
                break;

            case AdjacentSeatDirection.TopLeft:
                position.Offset(-1, -1);
                break;

            case AdjacentSeatDirection.TopRight:
                position.Offset(1, -1);
                break;
            }

            return(position);
        }
        public bool CheckAdjacentSeatIsOccupied(Point position, IEnumerable <Seat> seatingMap, AdjacentSeatDirection direction)
        {
            var positionToCheck  = ApplyOffset(position, direction);
            var highestXPosition = seatingMap.Max(s => s.Position.X);
            var highestYPosition = seatingMap.Max(s => s.Position.Y);

            while (positionToCheck.X >= 0 && positionToCheck.X <= highestXPosition && positionToCheck.Y >= 0 && positionToCheck.Y <= highestYPosition)
            {
                var seatToCheck = seatingMap.SingleOrDefault(s => s.Position == positionToCheck);

                if (seatToCheck == null)
                {
                    positionToCheck = ApplyOffset(positionToCheck, direction);
                    continue;
                }

                if (seatToCheck.Status == SeatStatus.Empty)
                {
                    return(false);
                }

                if (seatToCheck.Status == SeatStatus.Occupied)
                {
                    return(true);
                }
            }

            return(false);
        }
        public bool CheckAdjacentSeatIsOccupied(Point position, IEnumerable <Seat> seatingMap, AdjacentSeatDirection direction)
        {
            switch (direction)
            {
            case AdjacentSeatDirection.Down:
                position.Offset(0, -1);
                break;

            case AdjacentSeatDirection.Up:
                position.Offset(0, 1);
                break;

            case AdjacentSeatDirection.Left:
                position.Offset(-1, 0);
                break;

            case AdjacentSeatDirection.Right:
                position.Offset(1, 0);
                break;

            case AdjacentSeatDirection.BottomLeft:
                position.Offset(-1, -1);
                break;

            case AdjacentSeatDirection.BottomRight:
                position.Offset(1, -1);
                break;

            case AdjacentSeatDirection.TopLeft:
                position.Offset(-1, 1);
                break;

            case AdjacentSeatDirection.TopRight:
                position.Offset(1, 1);
                break;
            }

            var seatToCheck = seatingMap.SingleOrDefault(s => s.Position == position);

            if (seatToCheck == null || seatToCheck.Status == SeatStatus.Empty)
            {
                return(false);
            }

            return(true);
        }