public async Task <BulkResultResponse> ProcessAsync(BulkProcessRequest request)
        {
            var response = new BulkResultResponse();

            try
            {
                CsvResponseModel <ResultCsvRecordResponse> stage2Response = null;

                // Step 1:  Read file from Blob
                using (var fileStream = await _blobStorageService.DownloadFileAsync(new BlobStorageData
                {
                    ContainerName = request.DocumentType.ToString(),
                    BlobFileName = request.BlobFileName,
                    SourceFilePath = $"{request.AoUkprn}/{BulkProcessStatus.Processing}",
                    UserName = request.PerformedBy
                }))
                {
                    if (fileStream == null)
                    {
                        var blobReadError = $"No FileStream found to process bluk results. Method: DownloadFileAsync(ContainerName: {request.DocumentType}, BlobFileName = {request.BlobFileName}, SourceFilePath = {request.AoUkprn}/{BulkProcessStatus.Processing}, UserName = {request.PerformedBy}), User: {request.PerformedBy}";
                        _logger.LogInformation(LogEvent.FileStreamNotFound, blobReadError);
                        throw new Exception(blobReadError);
                    }

                    // Stage 2 validation
                    stage2Response = await _csvService.ReadAndParseFileAsync(new ResultCsvRecordRequest { FileStream = fileStream });

                    if (!stage2Response.IsDirty)
                    {
                        CheckUlnDuplicates(stage2Response.Rows);
                    }
                }

                // Step 2: Stage 2 validations
                if (stage2Response.IsDirty || !stage2Response.Rows.Any(x => x.IsValid))
                {
                    var validationErrors = ExtractAllValidationErrors(stage2Response);
                    return(await SaveErrorsAndUpdateResponse(request, response, validationErrors));
                }

                // Stage 3 valiation.
                var stage3Response = await _resultService.ValidateResultsAsync(request.AoUkprn, stage2Response.Rows.Where(x => x.IsValid));

                if (stage2Response.Rows.Any(x => !x.IsValid) || stage3Response.Any(x => !x.IsValid))
                {
                    var validationErrors = ExtractAllValidationErrors(stage2Response, stage3Response);
                    return(await SaveErrorsAndUpdateResponse(request, response, validationErrors));
                }

                // Step: Map data to DB model type.
                var results = _resultService.TransformResultsModel(stage3Response, request.PerformedBy);

                // Step: DB operation
                var resultsProcessResult = await _resultService.CompareAndProcessResultsAsync(results);

                // update total assessment records stats
                resultsProcessResult.BulkUploadStats = new BulkUploadStats {
                    TotalRecordsCount = stage3Response.Count
                };

                return(await ProcessResultsResponse(request, response, resultsProcessResult));
            }
            catch (Exception ex)
            {
                var errorMessage = $"Something went wrong while processing bluk results. Method: ProcessBulkResultsAsync(BulkProcessRequest : {JsonConvert.SerializeObject(request)}), User: {request.PerformedBy}";
                _logger.LogError(LogEvent.BulkResultProcessFailed, ex, errorMessage);
                await DeleteFileFromProcessingFolderAsync(request);
            }

            return(response);
        }