/// <summary>
        /// Create patients from CSV list
        /// </summary>
        /// <param name="patientsCsv">List of patients</param>
        /// <returns>Number of created patients</returns>
        public async Task <int> CreatePatientsAsync(IEnumerable <PatientCsv> patientsCsv)
        {
            var patientCsvs = patientsCsv.ToList();

            if (!patientCsvs.Any())
            {
                return(0);
            }
            var builder = new TransactionBuilder(_fhirClient.Endpoint, Bundle.BundleType.Transaction);

            foreach (var patientCsv in patientCsvs.Where(p => !string.IsNullOrWhiteSpace(p.Identifier)))
            {
                var patient = _patientCsvToPatientConverter.Convert(patientCsv);
                builder.Create(patient);
            }
            var response = await _fhirClient.TransactionAsync(builder.ToBundle()).ConfigureAwait(false);

            return(response.Entry.Count);
        }
        private static async System.Threading.Tasks.Task <Resource> UploadResourceAsync(Resource resource, FhirClient client, bool retry = true)
        {
            await semaphore.WaitAsync();

            try
            {
                if (resource is Bundle bundle)
                {
                    return(await client.TransactionAsync(bundle));
                }
                else
                {
                    return(await client.UpdateAsync(resource));
                }
            }
            catch (FhirOperationException fhirEx)
            {
                if (fhirEx.Status == System.Net.HttpStatusCode.TooManyRequests && retry == true)
                {
                    // Take a break and try again
                    Console.WriteLine($"Adding a 300ms delay: {fhirEx.Message}");
                    Thread.Sleep(300);
                    return(await UploadResourceAsync(resource, client, false));
                }
                else
                {
                    Console.WriteLine($"Error uploading resource to FHIR server: {fhirEx.Message}");
                    return(null);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error uploading resource to FHIR server: {ex.Message}");
                return(null);
            }
            finally
            {
                semaphore.Release();
            }
        }