/// <summary>
        /// Sends a message to the AWS Simple Queue Service
        /// </summary>
        /// <param name="input">Message data</param>
        /// <param name="options">Message options</param>
        /// <param name="awsOptions">AWS options</param>
        /// <param name="cancellationToken"></param>
        /// <returns>{SendMessageResponse} </returns>
        public static async Task <dynamic> SendMessage([PropertyTab] SendParameters input, [PropertyTab] SendOptions options, [PropertyTab] AWSOptions awsOptions, CancellationToken cancellationToken)
        {
            var sqsClient = GetAmazonSQSClient(awsOptions.UseDefaultCredentials, awsOptions.AWSCredentials, awsOptions.Region);

            var request = new SendMessageRequest
            {
                //MessageAttributes = new Dictionary<string, MessageAttributeValue>
                //{
                //    {
                //        "CustomAttribute", new MessageAttributeValue
                //        { DataType = "String", StringValue = "Esan testi" }
                //    }
                //},
                MessageBody  = input.Message,
                QueueUrl     = input.QueueUrl,
                DelaySeconds = options.DelaySeconds,
            };

            // FIFO only
            if (!string.IsNullOrEmpty(options.MessageGroupId))
            {
                request.MessageGroupId = options.MessageGroupId;
            }

            // FIFO only
            if (!string.IsNullOrEmpty(options.MessageDeduplicationId))
            {
                request.MessageDeduplicationId = options.MessageDeduplicationId;
            }

            // https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/SQS/TSendMessageResponse.html
            return(await sqsClient.SendMessageAsync(request, cancellationToken));
        }
        /// <summary>
        /// Receives message(s) from the AWS Simple Queue Service
        /// </summary>
        /// <param name="input">Receive parameters</param>
        /// <param name="options">Receive options</param>
        /// <param name="awsOptions">AWS options</param>
        /// <param name="cancellationToken"></param>
        /// <returns>ReceiveMessageResponse</returns>
        public static async Task <dynamic> ReceiveMessage([PropertyTab] ReceiveParameters input, [PropertyTab] ReceiveOptions options, [PropertyTab] AWSOptions awsOptions, CancellationToken cancellationToken)
        {
            var sqsClient = GetAmazonSQSClient(awsOptions.UseDefaultCredentials, awsOptions.AWSCredentials, awsOptions.Region);

            var request = new ReceiveMessageRequest
            {
                AttributeNames = new List <string>()
                {
                    "All"
                },
                MaxNumberOfMessages = input.MaxNumberOfMessages,
                QueueUrl            = input.QueueUrl,
                VisibilityTimeout   = options.VisibilityTimeout,
                WaitTimeSeconds     = options.WaitTimeSeconds
            };

            // https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/SQS/TReceiveMessageResponse.html
            var response = await sqsClient.ReceiveMessageAsync(request, cancellationToken);

            // Remove messages after receiving?
            if (response.Messages.Count > 0 && options.DeleteMessageAfterReceiving)
            {
                foreach (var message in response.Messages)
                {
                    var deleteMessageRequest = new DeleteMessageRequest()
                    {
                        QueueUrl      = input.QueueUrl,
                        ReceiptHandle = message.ReceiptHandle
                    };
                    // https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/SQS/TDeleteMessageResponse.html
                    await sqsClient.DeleteMessageAsync(deleteMessageRequest);
                }
            }

            return(response);
        }
        /// <summary>
        /// Delete message using ReceiptHandle
        /// </summary>
        /// <param name="input">Delete parameters</param>
        /// <param name="awsOptions">AWS options</param>
        /// <param name="cancellationToken"></param>
        /// <returns>DeleteMessageResponse</returns>
        public static async Task <dynamic> DeleteMessage([PropertyTab] DeleteParameters input, [PropertyTab] AWSOptions awsOptions, CancellationToken cancellationToken)
        {
            var sqsClient = GetAmazonSQSClient(awsOptions.UseDefaultCredentials, awsOptions.AWSCredentials, awsOptions.Region);

            var delRequest = new DeleteMessageRequest
            {
                QueueUrl      = input.QueueUrl,
                ReceiptHandle = input.ReceiptHandle
            };

            return(await sqsClient.DeleteMessageAsync(delRequest, cancellationToken));
        }