/// <summary>
        /// Delete a document from the queue. The document to be deleted must be in the 'Pending' state.
        /// </summary>
        /// <param name="id">Document ID</param>
        /// <returns></returns>
        public async Task DeleteDocumentFromQueue(int id)
        {
            // Get the document
            DocumentEntity documentToDelete = await _dataStore.GetDocument(id);

            if (documentToDelete == null)
            {
                throw new ArgumentException($"Document with ID '{id}' does not exist");
            }

            // Document can only be deleted in the pending state
            if (documentToDelete.Status != DocumentStatus.Pending)
            {
                throw new InvalidOperationException($"Document with ID '{documentToDelete.DocumentId}' must be in the '{DocumentStatus.Pending.ToString()}' state to be deleted but is in the '{documentToDelete.Status.ToString()}' state");
            }

            documentToDelete.Status = DocumentStatus.Removed;

            // Add the event
            documentToDelete.AddEvent(new EventEntity
            {
                Type      = EventType.Removed,
                EventDate = DateTime.Now
            });

            await _dataStore.UpdateDocument(documentToDelete);
        }
        /// <summary>
        /// Adds a document to the queue.
        /// </summary>
        /// <param name="queueDocumentData">Queue document data.</param>
        /// <returns>Created document entity.</returns>
        public async Task <DocumentEntity> AddDocumentToQueue(QueueDocumentData queueDocumentData)
        {
            // Validate the document
            await _queueDocumentDataValidator.ValidateAndThrowAsync(queueDocumentData);

            if (Log.IsEnabled(LogEventLevel.Verbose))
            {
                Log.Information("Queue document data {@queueDocumentData}", JsonConvert.SerializeObject(queueDocumentData));
            }

            // Get the metadata from the package
            CdaPackageData cdaPackageData = _cdaPackageService.ExtractPackageData(queueDocumentData.CdaPackage);

            // Check if the document already exists with the same ID
            DocumentEntity documentEntity = await _dataStore.GetDocument(cdaPackageData.DocumentId);

            if (documentEntity != null)
            {
                throw new ArgumentException($"Document with ID '{cdaPackageData.DocumentId}' already exists in the queue with the '{documentEntity.Status.ToString()}' state");
            }

            // Validate the replace
            if (!string.IsNullOrEmpty(queueDocumentData.DocumentIdToReplace))
            {
                // Check if the document to replace exists
                var documentToReplace = await _dataStore.GetDocument(queueDocumentData.DocumentIdToReplace);

                if (documentToReplace == null)
                {
                    throw new ArgumentException($"Document to replace with ID '{queueDocumentData.DocumentIdToReplace}' does not exist in the queue");
                }

                // Check the replace document status
                if (documentToReplace.Status == DocumentStatus.RetryLimitReached || documentToReplace.Status == DocumentStatus.Removed)
                {
                    throw new ArgumentException($"Document to replace cannot have a status of '{DocumentStatus.RetryLimitReached.ToString()}' or '{DocumentStatus.Removed.ToString()}' and is '{documentToReplace.Status.ToString()}'");
                }
            }

            DateTime addedDateTime = DateTime.Now;

            // Create the document
            DocumentEntity documentToQueue = new DocumentEntity
            {
                QueueDate           = addedDateTime,
                Status              = DocumentStatus.Pending,
                DocumentId          = cdaPackageData.DocumentId,
                DocumentIdToReplace = queueDocumentData.DocumentIdToReplace,
                FormatCodeName      = queueDocumentData.FormatCodeName,
                FormatCode          = queueDocumentData.FormatCode,
                DocumentData        = queueDocumentData.CdaPackage,
                Ihi = cdaPackageData.Ihi
            };

            // Add the create event
            documentToQueue.AddEvent(new EventEntity
            {
                Type      = EventType.Created,
                EventDate = addedDateTime
            });

            await _dataStore.AddDocument(documentToQueue);

            return(documentToQueue);
        }