private async Task <List <SlotEntrySummary> > PopulateSearchResultsMulti(List <SpineList> providerGpConnectDetails, List <OrganisationList> providerOrganisationDetails,
                                                                                 List <SpineList> consumerGpConnectDetails, List <OrganisationList> consumerOrganisationDetails, string consumerOrganisationType = "")
        {
            var createdSearchGroup = _applicationService.AddSearchGroup(new DTO.Request.Application.SearchGroup
            {
                UserSessionId      = User.GetClaimValue("UserSessionId").StringToInteger(),
                ProviderOdsTextbox = ProviderOdsCode,
                ConsumerOdsTextbox = ConsumerOdsCode,
                SearchDateRange    = SelectedDateRange,
                ConsumerOrganisationTypeDropdown = SelectedOrganisationType
            });

            _logger.LogInformation("Executing PopulateSearchResultsMulti - generating Request Parameters");

            SearchGroupId = createdSearchGroup.SearchGroupId;

            var slotEntrySummary = new List <SlotEntrySummary>();

            var requestParameters = await _tokenService.ConstructRequestParameters(_contextAccessor.HttpContext.GetAbsoluteUri(), providerGpConnectDetails, providerOrganisationDetails,
                                                                                   consumerGpConnectDetails, consumerOrganisationDetails, (int)SpineMessageTypes.GpConnectSearchFreeSlots, consumerOrganisationType);

            var startDate = Convert.ToDateTime(SelectedDateRange.Split(":")[0]);
            var endDate   = Convert.ToDateTime(SelectedDateRange.Split(":")[1]);

            var providerOdsCount = ProviderOdsCodeAsList.Count;
            var consumerOdsCount = ConsumerOdsCodeAsList.Count;
            List <SlotEntrySummaryCount>                slotSearchSummaryList                = new List <SlotEntrySummaryCount>();
            List <OrganisationErrorCodeOrDetail>        organisationErrorCodeOrDetail        = new List <OrganisationErrorCodeOrDetail>();
            List <CapabilityStatementErrorCodeOrDetail> capabilityStatementErrorCodeOrDetail = new List <CapabilityStatementErrorCodeOrDetail>();

            if (providerOdsCount > consumerOdsCount)
            {
                _logger.LogInformation("Executing PopulateSearchResultsMulti - Getting capability statement list");

                var consumerCode            = ConsumerOdsCodeAsList.Count == 0 ? null : ConsumerOdsCodeAsList[0];
                var capabilityStatementList = await _queryExecutionService.ExecuteFhirCapabilityStatement(requestParameters);

                for (var i = 0; i < providerOdsCount; i++)
                {
                    _stopwatch.Start();
                    var errorCodeOrDetail = GetOrganisationErrorCodeOrDetail(ProviderOdsCodeAsList[i], consumerCode, providerGpConnectDetails, providerOrganisationDetails, consumerGpConnectDetails, consumerOrganisationDetails, consumerOrganisationType);
                    organisationErrorCodeOrDetail.Add(errorCodeOrDetail);

                    var capabilityStatementResult = GetCapabilityStatementErrorCodeOrDetail(ProviderOdsCodeAsList[i], capabilityStatementList);
                    capabilityStatementErrorCodeOrDetail.Add(capabilityStatementResult);
                }

                var slotCount = 0;

                if (requestParameters != null && organisationErrorCodeOrDetail != null && capabilityStatementErrorCodeOrDetail != null)
                {
                    slotSearchSummaryList = await _queryExecutionService.ExecuteFreeSlotSearchSummary(organisationErrorCodeOrDetail, requestParameters, startDate, endDate, SearchType.Provider);

                    for (var i = 0; i < providerOdsCount; i++)
                    {
                        var organisationErrorCodeOrDetailForCode        = organisationErrorCodeOrDetail.FirstOrDefault(x => x.SuppliedProviderOdsCode == ProviderOdsCodeAsList[i]);
                        var capabilityStatementErrorCodeOrDetailForCode = capabilityStatementErrorCodeOrDetail.FirstOrDefault(x => x.SuppliedProviderOdsCode == ProviderOdsCodeAsList[i]);

                        if (organisationErrorCodeOrDetailForCode.errorSource == ErrorCode.None)
                        {
                            var slotSearchErrorCodeOrDetail = GetSlotSearchErrorCodeOrDetail(ProviderOdsCodeAsList[i], slotSearchSummaryList);
                            organisationErrorCodeOrDetailForCode.errorSource = slotSearchErrorCodeOrDetail.Item1;
                            organisationErrorCodeOrDetailForCode.details     = AppendAdditionalDetails(slotSearchErrorCodeOrDetail.Item2, organisationErrorCodeOrDetailForCode.additionalDetails);
                            slotCount = slotSearchErrorCodeOrDetail.Item3.GetValueOrDefault();
                        }
                        else if (organisationErrorCodeOrDetailForCode.errorSource == ErrorCode.None && capabilityStatementErrorCodeOrDetailForCode.errorSource != ErrorCode.None)
                        {
                            organisationErrorCodeOrDetailForCode.errorSource = capabilityStatementErrorCodeOrDetailForCode.errorSource;
                            organisationErrorCodeOrDetailForCode.details     = capabilityStatementErrorCodeOrDetailForCode.details;
                            slotCount = 0;
                        }

                        _stopwatch.Stop();

                        var searchResultToAdd = new SearchResult
                        {
                            SearchGroupId            = createdSearchGroup.SearchGroupId,
                            ProviderCode             = ProviderOdsCodeAsList[i],
                            ConsumerCode             = consumerCode,
                            ConsumerOrganisationType = OrganisationTypes.FirstOrDefault(x => x.Value == consumerOrganisationType).Text,
                            ErrorCode             = (int)organisationErrorCodeOrDetailForCode.errorSource,
                            Details               = organisationErrorCodeOrDetailForCode.details,
                            ProviderPublisher     = organisationErrorCodeOrDetailForCode.providerSpine?.ProductName,
                            SearchDurationSeconds = _stopwatch.Elapsed.TotalSeconds
                        };

                        _stopwatch.Reset();

                        if (slotSearchSummaryList != null)
                        {
                            var spineMessageId = slotSearchSummaryList.FirstOrDefault(x => x.OdsCode == ProviderOdsCodeAsList[i])?.SpineMessageId;
                            searchResultToAdd.SpineMessageId = spineMessageId;
                        }

                        var searchResult = _applicationService.AddSearchResult(searchResultToAdd);

                        slotEntrySummary.Add(new SlotEntrySummary
                        {
                            ProviderLocationName     = organisationErrorCodeOrDetailForCode.providerOrganisation?.OrganisationLocation,
                            ProviderOdsCode          = ProviderOdsCodeAsList[i],
                            ConsumerLocationName     = organisationErrorCodeOrDetailForCode.consumerOrganisation?.OrganisationLocation,
                            ConsumerOdsCode          = consumerCode,
                            ConsumerOrganisationType = OrganisationTypes.FirstOrDefault(x => x.Value == consumerOrganisationType).Text,
                            SearchSummaryDetail      = organisationErrorCodeOrDetailForCode.details,
                            ProviderPublisher        = organisationErrorCodeOrDetailForCode.providerSpine?.ProductName,
                            SearchResultId           = searchResult.SearchResultId,
                            SearchGroupId            = searchResultToAdd.SearchGroupId,
                            DetailsEnabled           = (organisationErrorCodeOrDetailForCode.errorSource == ErrorCode.None && slotCount > 0),
                            DisplayProvider          = organisationErrorCodeOrDetailForCode.providerOrganisation != null,
                            DisplayConsumer          = organisationErrorCodeOrDetailForCode.consumerOrganisation != null,
                            DisplayClass             = (organisationErrorCodeOrDetailForCode.errorSource != ErrorCode.None) ? "nhsuk-slot-summary-error" : "nhsuk-slot-summary"
                        });
                    }
                }
            }
            else if (consumerOdsCount > providerOdsCount)
            {
                for (var i = 0; i < consumerOdsCount; i++)
                {
                    _stopwatch.Start();
                    var errorCodeOrDetail = GetOrganisationErrorCodeOrDetail(ProviderOdsCodeAsList[0], ConsumerOdsCodeAsList[i], providerGpConnectDetails, providerOrganisationDetails, consumerGpConnectDetails, consumerOrganisationDetails, consumerOrganisationType);
                    organisationErrorCodeOrDetail.Add(errorCodeOrDetail);
                }

                var capabilityStatementList = await _queryExecutionService.ExecuteFhirCapabilityStatement(requestParameters);

                var capabilityStatementResult = GetCapabilityStatementErrorCodeOrDetail(ProviderOdsCodeAsList[0], capabilityStatementList);
                capabilityStatementErrorCodeOrDetail.Add(capabilityStatementResult);

                var slotCount = 0;

                if (requestParameters != null && organisationErrorCodeOrDetail != null && capabilityStatementErrorCodeOrDetail != null)
                {
                    slotSearchSummaryList = await _queryExecutionService.ExecuteFreeSlotSearchSummary(organisationErrorCodeOrDetail, requestParameters, startDate, endDate, SearchType.Consumer);

                    for (var i = 0; i < consumerOdsCount; i++)
                    {
                        var organisationErrorCodeOrDetailForCode        = organisationErrorCodeOrDetail.FirstOrDefault(x => x.SuppliedConsumerOdsCode == ConsumerOdsCodeAsList[i]);
                        var capabilityStatementErrorCodeOrDetailForCode = capabilityStatementErrorCodeOrDetail.FirstOrDefault(x => x.SuppliedConsumerOdsCode == ConsumerOdsCodeAsList[i]);

                        if (organisationErrorCodeOrDetailForCode.errorSource == ErrorCode.None)
                        {
                            var slotSearchErrorCodeOrDetail = GetSlotSearchErrorCodeOrDetail(ConsumerOdsCodeAsList[i], slotSearchSummaryList);
                            organisationErrorCodeOrDetailForCode.errorSource = slotSearchErrorCodeOrDetail.Item1;
                            organisationErrorCodeOrDetailForCode.details     = AppendAdditionalDetails(slotSearchErrorCodeOrDetail.Item2, organisationErrorCodeOrDetailForCode.additionalDetails);
                            slotCount = slotSearchErrorCodeOrDetail.Item3.GetValueOrDefault();
                        }
                        else if (organisationErrorCodeOrDetailForCode.errorSource == ErrorCode.None && capabilityStatementErrorCodeOrDetailForCode.errorSource != ErrorCode.None)
                        {
                            organisationErrorCodeOrDetailForCode.errorSource = capabilityStatementErrorCodeOrDetailForCode.errorSource;
                            organisationErrorCodeOrDetailForCode.details     = capabilityStatementErrorCodeOrDetailForCode.details;
                            slotCount = 0;
                        }

                        _stopwatch.Stop();

                        var searchResultToAdd = new SearchResult
                        {
                            SearchGroupId            = createdSearchGroup.SearchGroupId,
                            ProviderCode             = ProviderOdsCodeAsList[0],
                            ConsumerCode             = ConsumerOdsCodeAsList[i],
                            ConsumerOrganisationType = OrganisationTypes.FirstOrDefault(x => x.Value == consumerOrganisationType).Text,
                            ErrorCode             = (int)organisationErrorCodeOrDetailForCode.errorSource,
                            Details               = organisationErrorCodeOrDetailForCode.details,
                            ProviderPublisher     = organisationErrorCodeOrDetailForCode.providerSpine?.ProductName,
                            SearchDurationSeconds = _stopwatch.Elapsed.TotalSeconds,
                        };

                        _stopwatch.Reset();

                        if (slotSearchSummaryList != null)
                        {
                            var spineMessageId = slotSearchSummaryList.FirstOrDefault(x => x.OdsCode == ConsumerOdsCodeAsList[i])?.SpineMessageId;
                            searchResultToAdd.SpineMessageId = spineMessageId;
                        }

                        var searchResult = _applicationService.AddSearchResult(searchResultToAdd);

                        slotEntrySummary.Add(new SlotEntrySummary
                        {
                            ProviderLocationName     = organisationErrorCodeOrDetailForCode.providerOrganisation?.OrganisationLocation,
                            ProviderOdsCode          = ProviderOdsCodeAsList[0],
                            ConsumerLocationName     = organisationErrorCodeOrDetailForCode.consumerOrganisation?.OrganisationLocation,
                            ConsumerOdsCode          = ConsumerOdsCodeAsList[i],
                            ConsumerOrganisationType = OrganisationTypes.FirstOrDefault(x => x.Value == consumerOrganisationType).Text,
                            SearchSummaryDetail      = organisationErrorCodeOrDetailForCode.details,
                            ProviderPublisher        = organisationErrorCodeOrDetailForCode.providerSpine?.ProductName,
                            SearchResultId           = searchResult.SearchResultId,
                            DetailsEnabled           = (organisationErrorCodeOrDetailForCode.errorSource == ErrorCode.None && slotCount > 0),
                            DisplayProvider          = organisationErrorCodeOrDetailForCode.providerOrganisation != null,
                            DisplayConsumer          = organisationErrorCodeOrDetailForCode.consumerOrganisation != null,
                            DisplayClass             = (organisationErrorCodeOrDetailForCode.errorSource != ErrorCode.None) ? "nhsuk-slot-summary-error" : "nhsuk-slot-summary"
                        });
                    }
                }
            }

            _applicationService.UpdateSearchGroup(SearchGroupId);

            return(slotEntrySummary.OrderBy(x => x.SearchResultId).ToList());
        }