/// <inheritdoc/>
    public async Task <ResponseModel> ExecuteRequestAsync()
    {
        var requestLogger            = _requestLoggerFactory.GetRequestLogger();
        var foundStubs               = new List <(StubModel, IEnumerable <ConditionCheckResultModel>)>();
        var stubs                    = (await _stubContainer.GetStubsAsync()).Where(s => s.Stub.Enabled).ToArray();
        var orderedConditionCheckers = _conditionCheckers.OrderByDescending(c => c.Priority).ToArray();

        foreach (var fullStub in stubs)
        {
            var stub = fullStub.Stub;
            try
            {
                var validationResults = new List <ConditionCheckResultModel>();
                foreach (var checker in orderedConditionCheckers)
                {
                    var validationResult = checker.Validate(stub);
                    validationResult.CheckerName = checker.GetType().Name;
                    validationResults.Add(validationResult);
                    if (validationResult.ConditionValidation == ConditionValidationType.Invalid)
                    {
                        // If any condition is invalid, skip the rest.
                        break;
                    }
                }

                var passed = (validationResults.All(r =>
                                                    r.ConditionValidation != ConditionValidationType.Invalid) &&
                              validationResults.Any(r =>
                                                    r.ConditionValidation != ConditionValidationType.NotExecuted &&
                                                    r.ConditionValidation != ConditionValidationType.NotSet)) ||
                             validationResults.All(
                    r => r.ConditionValidation == ConditionValidationType.NotExecuted);
                if (passed)
                {
                    foundStubs.Add((stub, validationResults));
                }

                requestLogger.SetStubExecutionResult(stub.Id, passed, validationResults);
            }
            catch (Exception e)
            {
                _logger.LogWarning($"Exception thrown while executing checks for stub '{stub.Id}': {e}");
            }
        }

        if (!foundStubs.Any())
        {
            // If the resulting list is not null, but empty, the condition did not pass and the response should be returned prematurely.
            throw new RequestValidationException(
                      $"The '{nameof(foundStubs)}' array for condition was empty, which means the condition was configured and the request did not pass or no conditions are configured at all.");
        }

        var finalStub = _finalStubDeterminer.DetermineFinalStub(foundStubs);

        _scenarioService.IncreaseHitCount(finalStub.Scenario);
        requestLogger.SetExecutingStubId(finalStub.Id);
        var response = await _stubResponseGenerator.GenerateResponseAsync(finalStub);

        return(response);
    }
        public async Task <ResponseModel> ExecuteRequestAsync()
        {
            var requestLogger = _requestLoggerFactory.GetRequestLogger();

            var foundStubs = new List <(StubModel, IEnumerable <ConditionCheckResultModel>)>();
            var stubs      = await _stubContainer.GetStubsAsync();

            foreach (var fullStub in stubs)
            {
                var stub = fullStub.Stub;
                try
                {
                    var passed                    = false;
                    var validationResults         = new List <ConditionCheckResultModel>();
                    var negativeValidationResults = new List <ConditionCheckResultModel>();
                    foreach (var checker in _conditionCheckers)
                    {
                        var result = CheckConditions(stub.Id, checker, stub.Conditions, false);
                        validationResults.Add(result);
                        if (result.ConditionValidation == ConditionValidationType.Invalid)
                        {
                            // If any condition is invalid, skip the rest.
                            break;
                        }

                        // Then check the "negative" conditions. These conditions are the "not" scenarios.
                        result = CheckConditions(stub.Id, checker, stub.NegativeConditions, true);
                        negativeValidationResults.Add(result);
                        if (result.ConditionValidation == ConditionValidationType.Invalid)
                        {
                            // If any condition is invalid, skip the rest.
                            break;
                        }
                    }

                    var allValidationResults       = validationResults.Concat(negativeValidationResults);
                    var conditionCheckResultModels = allValidationResults as ConditionCheckResultModel[] ??
                                                     allValidationResults.ToArray();
                    if ((conditionCheckResultModels.All(r =>
                                                        r.ConditionValidation != ConditionValidationType.Invalid) &&
                         validationResults.Any(r =>
                                               r.ConditionValidation != ConditionValidationType.NotExecuted &&
                                               r.ConditionValidation != ConditionValidationType.NotSet)) ||
                        conditionCheckResultModels.All(
                            r => r.ConditionValidation == ConditionValidationType.NotExecuted))
                    {
                        passed = true;
                        foundStubs.Add((stub, conditionCheckResultModels));
                    }

                    requestLogger.SetStubExecutionResult(stub.Id, passed, validationResults, negativeValidationResults);
                }
                catch (Exception e)
                {
                    _logger.LogWarning($"Exception thrown while executing checks for stub '{stub.Id}': {e}");
                }
            }

            if (!foundStubs.Any())
            {
                // If the resulting list is not null, but empty, the condition did not pass and the response should be returned prematurely.
                throw new RequestValidationException(
                          $"The '{nameof(foundStubs)}' array for condition was empty, which means the condition was configured and the request did not pass or no conditions are configured at all.");
            }

            var finalStub = _finalStubDeterminer.DetermineFinalStub(foundStubs);

            requestLogger.SetExecutingStubId(finalStub.Id);
            var response = await _stubResponseGenerator.GenerateResponseAsync(finalStub);

            return(response);
        }