//Search results for events in selected date range in secondary event creation route
        public async Task <IActionResult> VenueSearchResults([Bind("StartDate,EndDate,TypeId,Type")] VenueSearchVM searchCriteria)
        {
            IEnumerable <EventTypeDto> eventTypes = await GetEventTypes();

            if (searchCriteria.TypeList == null)
            {
                searchCriteria.TypeList = new SelectList(eventTypes, "Id", "Title");
            }
            if (searchCriteria.Type == null || searchCriteria.TypeList == null)
            {
                searchCriteria.Type = eventTypes.First(e => e.Id == searchCriteria.TypeId).Title;
            }
            if (searchCriteria.TypeId == null)
            {
                searchCriteria.Message = "Please select an event type";
                return(View("SearchVenues", searchCriteria));
            }
            List <AvailabilitiesVM> availabilities = GetAvailability(searchCriteria.TypeId, searchCriteria.StartDate, searchCriteria.EndDate).Result.ToList();

            if (availabilities.Count == 0)
            {
                searchCriteria.Message = "No venues available on this date";
                return(View("SearchVenues", searchCriteria));
            }
            EventVM eventVM = new EventVM();

            eventVM.TypeId = searchCriteria.TypeId;
            EventVenueAvailabilityVM venueSelector = new EventVenueAvailabilityVM(eventVM, availabilities);

            return(View("SelectVenue", venueSelector));
        }
        // GET: Events/Select Venue
        //Second stage of create event process, displaying events available on date provided
        public async Task <IActionResult> SelectVenue(int day, int month, int year, int hour, int minute, int second, [Bind("Id,Title,Date,Duration,TypeId,VenueRef,Existing,VenueName,VenueDescription,VenueCapacity,VenueCost,OldRef")] EventVM @event)
        {
            // multiple if statements ensure correct braching and catching or errors simultaneously
            // instead of having one route through the entire system
            if (@event == null)
            {
                @event.Message = "Something went wrong.  Please ensure all fields are completed and try again.";
                return(RedirectToAction("SelectVenue", @event));
            }
            if (@event.Duration.HasValue && (@event.Duration).Value.TotalDays >= 1)
            {
                @event.Message = "Duration must be less than 24 hours.  Please enter as HH:MM or HH:MM:SS";
                return(RedirectToAction("Create", @event));
            }
            if (day != 0 && month != 0 && year != 0)
            {
                DateTime fixedDate = new DateTime(year, month, day, hour, minute, second);
                @event.Date = fixedDate;
            }
            if (@event.Type == null)
            {
                IEnumerable <EventTypeDto> eventTypes = await GetEventTypes();

                @event.Type = eventTypes.First(e => e.Id == @event.TypeId).Title;
            }

            if (@event.VenueName != null && @event.Existing == false)
            {
                return(RedirectToAction("ConfirmReservation", @event));
            }
            else
            {
                if (@event.Existing)
                {
                    // OldRef variable used to store the old referance when passinbg between views and actions
                    //a llowing new reference to be stored without losing old reference which may be needed when accessing Venues API later in process
                    @event.OldRef = @event.getBookingRef;
                }
                @event.OldRef = @event.getBookingRef;
                List <AvailabilitiesVM> availabilities = GetAvailability(@event.TypeId, @event.Date, @event.Date).Result.ToList();
                if (availabilities.Count == 0)
                {
                    @event.Message = "No venues available on this date";
                    if (@event.Existing == false)
                    {
                        return(RedirectToAction("Create", @event));
                    }
                    else
                    {
                        return(RedirectToAction("Edit", new { Id = @event.Id, Message = @event.Message }));
                    }
                }
                else
                {
                    EventVenueAvailabilityVM venueSelector = new EventVenueAvailabilityVM(@event, availabilities);
                    return(View(venueSelector));
                }
            }
        }