/// <summary>
        /// Builds a RoomTypesWithRatePlanForAvailableRooms for use in testing
        /// </summary>
        /// <param name="businessId">business Id to use</param>
        /// <param name="numberOfRatePlansPerRoomType">number of rate plans to have per room type</param>
        /// <param name="maxRoomTypeId">number of room types to use</param>
        /// <param name="numberOfRoomsPerRoomType">number of rooms to use per room type</param>
        /// <returns>a RoomTypesWithRatePlanForAvailableRooms object</returns>
        /// <remarks>Weekly availability not set up yet, prices for more than one night not set up yet</remarks>
        public static RoomTypesWithRatePlanForAvailableRooms Build(long businessId, int numberOfRatePlansPerRoomType = 1, int maxRoomTypeId = 1, int numberOfRoomsPerRoomType = 1)
        {
            // loop through the ids, creating rate plans, room types, prices, for rooms.
            
            // Set up some lists to use in loops below
            List<AvailabilityResultRoomType> roomTypes = new List<AvailabilityResultRoomType>();
            int currentRoomId = 1;
            int currentRatePlanId = 1;
            Random numberGenerator = new Random();
            for (int roomTypeId = 1; roomTypeId <= maxRoomTypeId; roomTypeId++)
            {
                // new room type, clear room ids and rate plans
                List<int> roomIds = new List<int>();
                List<AvailabilityResultRatePlan> ratePlans = new List<AvailabilityResultRatePlan>();

                // add some rooms for this room type
                for (int arbitraryId = 1; arbitraryId <= numberOfRoomsPerRoomType; arbitraryId++)
                {
                    roomIds.Add(currentRoomId);
                    currentRoomId++;
                }

                // set up rate plans
                for (int ratePlanId = 1; ratePlanId <= numberOfRatePlansPerRoomType; ratePlanId++)
                {
                    // Price might need to be a bit better for dates involved
                    decimal priceforRatePlan = new decimal(numberGenerator.Next(10, 200));
                    AvailabilityResultPrice additionalRatePlanPrice = new AvailabilityResultPrice()
                    {
                        BusinessId = businessId,
                        RatePlanId = currentRatePlanId,
                        RoomTypeId = roomTypeId,
                        TotalPrice = priceforRatePlan,
                        PriceCalculationBreakdowns =
                            new List<PriceCalculationBreakdown>()
                            {
                                new PriceCalculationBreakdown()
                                    {
                                        NightNumber = 1,
                                        Price = priceforRatePlan,
                                        RateType = new Model.Core.EnumEntity(){ Code = RateType.BEST_AVAILABLE_RATE }
                                    }
                            }
                    };

                    int maxAdult = ratePlanId + roomTypeId - 1; // so that it increases as we add more rate plans
                    int minAdult = maxAdult - 1 > 0 ? maxAdult - 1 : 1;
                    int maxChild = minAdult - 1;
                    int maxOccupancy = maxChild + maxAdult;

                    AvailabilityResultRatePlan additionalRatePlan = new AvailabilityResultRatePlan()
                    {
                        RoomTypeId = roomTypeId,
                        RatePlanId = currentRatePlanId,
                        IsBaseRatePlan = false,
                        MaxOccupancy = maxOccupancy,
                        MaxAdult = maxAdult,
                        MinAdult = minAdult,
                        MaxChild = maxChild,
                        PriceCandidates =
                            new List<AvailabilityResultPrice>() { additionalRatePlanPrice }
                    };

                    // so that each room type has different rate plan ids
                    currentRatePlanId++;
                    ratePlans.Add(additionalRatePlan);
                }

                roomTypes.Add(new AvailabilityResultRoomType()
                                  {
                                      BusinessId = businessId,
                                      RoomTypeId = roomTypeId,
                                      RatePlans = ratePlans,
                                      RoomIds = roomIds
                                  });
            }

            return new RoomTypesWithRatePlanForAvailableRooms()
                       {
                           RoomTypesWithRatePlans = roomTypes
                       };
        }
        /// <summary>
        /// Convert a AvailabilityResultPrice Model to Dto Object
        /// </summary>
        /// <param name="price">Price object to convert</param>
        /// <returns>AvailabilityResultPriceDto</returns>
        private static AvailabilityResultPriceDto ConvertAvailabilityResultPriceToDto(AvailabilityResultPrice price)
        {
            // Convert the main object
            var availabilityResultPriceDto = new AvailabilityResultPriceDto
            {
                BusinessId = price.BusinessId,
                RoomTypeId = price.RoomTypeId,
                TotalPrice = price.TotalPrice
            };

            // Convert the sub objects
            if (price.PriceCalculationBreakdowns != null)
            {
                availabilityResultPriceDto.PriceCalculationBreakdowns =
                    price.PriceCalculationBreakdowns.ConvertAll(ConvertPriceCalculationBreakdownToDto);
            }

            return availabilityResultPriceDto;
        }