using Amazon.Sns.Wrapper.Implementations;
using Amazon.Sns.Wrapper.Models;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace Amazon.Sns.Wrapper.Interfaces
{
    /// 
    /// Interface for NotificationTopic class
    /// 
    public interface INotificationTopic
    {
        /// 
        /// Gets Arn of SNS Topic
        /// 
        string Arn { get; }
        /// 
        /// Gets Name of SNS Topic
        /// 
        string Name { get; }
        /// 
        /// Adds a statement to a topic's access control policy, granting access for the
        ///     specified accounts to the specified actions.
        /// 
        ///  A unique identifier for the new policy statement.
        /// The account IDs of the users (principals) who will be given access to the specified
        ///     actions. The users must have account, but do not need to be signed up for this
        ///     service.
        /// The action you want to allow for the specified principal(s). Valid values: Any
        ///     Amazon SNS action name, for example
        ///     Publish
        ///  A cancellation token that can be used by other objects or threads to receive
        ///     notice of cancellation.
        /// Returns true if the HTTP Response Status is OK
        Task AddPermissionAsync(string label, List awsAccountId, List actionName, CancellationToken cancellationToken = default);
        /// 
        /// Removes a statement from a topic's access control policy.
        /// 
        ///  The unique label of the statement you want to remove.
        ///  A cancellation token that can be used by other objects or threads to receive
        ///     notice of cancellation.
        /// Returns true if the HTTP Response Status is OK
        Task RemovePermissionAsync(string label, CancellationToken cancellationToken = default);
        /// 
        /// -Returns all of the properties of a topic. Topic properties returned might differ
        ///     based on the authorization of the user.
        /// 
        ///  A cancellation token that can be used by other objects or threads to receive
        ///     notice of cancellation.
        /// Properties/Atributes of SNS Topic
        Task> GetAttributesAsync(CancellationToken cancellationToken = default);
        /// 
        ///     Subscribes an endpoint to an Amazon SNS topic. If the endpoint type is HTTP/S
        ///     or email, or if the endpoint and the topic are not in the same account, the endpoint
        ///     owner must run the
        ///     ConfirmSubscription
        ///     action to confirm the subscription.
        ///     You call the
        ///     ConfirmSubscription
        ///     action with the token from the subscription response. Confirmation tokens are
        ///     valid for three days.
        ///    This action is throttled at 100 transactions per second (TPS).
        /// 
        /// The protocol that you want to use. Supported protocols include:
        ///     http
        ///     – delivery of JSON-encoded message via HTTP POST
        ///     https
        ///     – delivery of JSON-encoded message via HTTPS POST
        ///     email
        ///     – delivery of message via SMTP
        ///     email-json
        ///     – delivery of JSON-encoded message via SMTP
        ///     sms
        ///     – delivery of message via SMS
        ///     sqs
        ///     – delivery of JSON-encoded message to an Amazon SQS queue
        ///     application
        ///     – delivery of JSON-encoded message to an EndpointArn for a mobile app and device
        ///     lambda
        ///     – delivery of JSON-encoded message to an Lambda function
        ///     firehose
        ///     – delivery of JSON-encoded message to an Amazon Kinesis Data Firehose delivery
        ///     stream.
        /// The endpoint that you want to receive notifications. Endpoints vary by protocol:
        ///     For the
        ///     http
        ///     protocol, the (public) endpoint is a URL beginning with
        ///     http://
        ///     . For the
        ///     https
        ///     protocol, the (public) endpoint is a URL beginning with
        ///     https://
        ///     . For the
        ///     email
        ///     protocol, the endpoint is an email address. For the
        ///    email-json
        ///     protocol, the endpoint is an email address. For the
        ///     sms
        ///     protocol, the endpoint is a phone number of an SMS-enabled device. For the
        ///     sqs
        ///     protocol, the endpoint is the ARN of an Amazon SQS queue. For the
        ///     application
        ///     protocol, the endpoint is the EndpointArn of a mobile app and device. For the
        ///     lambda
        ///     protocol, the endpoint is the ARN of an Lambda function. For the
        ///     firehose
        ///     protocol, the endpoint is the ARN of an Amazon Kinesis Data Firehose delivery
        ///     stream.
        ///  A cancellation token that can be used by other objects or threads to receive
        ///     notice of cancellation.
        /// Returns INotificationSubscription instance of newly created SNS Subscription
        Task SubscribeAsync(NotificationProtocol protocol, string endpoint, CancellationToken cancellationToken = default);
        /// 
        ///    Verifies an endpoint owner's intent to receive messages by validating the token
        ///     sent to the endpoint by an earlier
        ///     Subscribe
        ///     action. If the token is valid, the action creates a new subscription and returns
        ///     its Amazon Resource Name (ARN). This call requires an AWS signature only when
        ///     the
        ///     AuthenticateOnUnsubscribe
        ///     flag is set to "true".
        /// 
        /// Short-lived token sent to an endpoint during the Subscribe action.
        ///  A cancellation token that can be used by other objects or threads to receive
        ///     notice of cancellation.
        /// Returns INotificationSubscription instance of confirmed SNS Subscription
        Task ConfirmSubscriptionAsync(string token, CancellationToken cancellationToken = default);
        /// 
        ///    Returns a list of the subscriptions to a specific topic. Each call returns a
        ///     limited list of subscriptions, up to 100. If there are more subscriptions, a
        ///     NextToken is also returned. Use the
        ///     MaxRecords parameter to get further results using tokens returned.
        ///     This action is throttled at 30 transactions per second (TPS).
        /// 
        /// Maximum records to be returned (default 100)
        ///  A cancellation token that can be used by other objects or threads to receive
        ///     notice of cancellation.
        /// List of INotificationSubscription instances of a given SNS Topic
        Task> ListSubscriptionsAsync(int maxRecords = 100, CancellationToken cancellationToken = default);
        /// 
        ///     Sends a message to an Amazon SNS topic, a text message (SMS message) directly
        ///     to a phone number, or a message to a mobile platform endpoint (when you specify
        ///     the
        ///     TargetArn
        ///     ).
        ///     If you send a message to a topic, Amazon SNS delivers the message to each endpoint
        ///     that is subscribed to the topic. The format of the message depends on the notification
        ///     protocol for each subscribed endpoint.
        ///     When a
        ///     messageId
        ///     is returned, the message has been saved and Amazon SNS will attempt to deliver
        ///     it shortly.
        ///     To use the
        ///     Publish
        ///     action for sending a message to a mobile endpoint, such as an app on a Kindle
        ///     device or mobile phone, you must specify the EndpointArn for the TargetArn parameter.
        ///     The EndpointArn is returned when making a call with the
        ///     CreatePlatformEndpoint
        ///     action.
        ///     For more information about formatting messages, see Send Custom Platform-Specific
        ///     Payloads in Messages to Mobile Devices.
        ///     You can publish messages only to topics and endpoints in the same Region.
        /// 
        /// Type of Message
        ///  The message you want to send. If you are publishing to a topic and you want to
        ///     send the same message to all transport protocols, include the text of the message
        ///     as a String value. If you want to send different messages for each transport
        ///     protocol, set the value of the
        ///     MessageStructure
        ///     parameter to
        ///     json
        ///     and use a JSON object for the
        ///     Message
        ///     parameter. Constraints: With the exception of SMS, messages must be UTF-8 encoded
        ///     strings and at most 256 KB in size (262,144 bytes, not 262,144 characters). For
        ///     SMS, each message can contain up to 140 characters. This character limit depends
        ///     on the encoding schema. For example, an SMS message can contain 160 GSM characters,
        ///     140 ASCII characters, or 70 UCS-2 characters. If you publish a message that exceeds
        ///     this size limit, Amazon SNS sends the message as multiple messages, each fitting
        ///     within the size limit. Messages aren't truncated mid-word but are cut off at
        ///     whole-word boundaries. The total size limit for a single SMS
        ///     Publish
        ///     action is 1,600 characters. JSON-specific constraints: Keys in the JSON object
        ///     that correspond to supported transport protocols must have simple JSON string
        ///     values. The values will be parsed (unescaped) before they are used in outgoing
        ///     messages. Outbound notifications are JSON encoded (meaning that the characters
        ///     will be reescaped for sending). Values have a minimum length of 0 (the empty
        ///     string, "", is allowed). Values have a maximum length bounded by the overall
        ///     message size (so, including multiple protocols may limit message sizes). Non-string
        ///     values will cause the key to be ignored. Keys that do not correspond to supported
        ///     transport protocols are ignored. Duplicate keys are not allowed. Failure to parse
        ///     or validate any key or value in the message will cause the
        ///     Publish
        ///     call to return an error (no partial delivery).
        ///  A cancellation token that can be used by other objects or threads to receive
        ///     notice of cancellation.
        /// Returns SNS messageId for the message published
        Task PublishAsync(T message, CancellationToken cancellationToken = default) where T : class;
        /// 
        /// Deletes a topic and all its subscriptions. Deleting a topic might prevent some
        ///     messages previously sent to the topic from being delivered to subscribers. This
        ///     action is idempotent, so deleting a topic that does not exist does not result
        ///     in an error.
        /// 
        ///  A cancellation token that can be used by other objects or threads to receive
        ///     notice of cancellation.
        /// returns true if the Topic is deleted sucessfully
        Task DeleteAsync(CancellationToken cancellationToken = default);
        /// 
        /// Allows a topic owner to set an attribute of the topic to a new value.
        /// 
        /// A map of attributes with their corresponding values. The following lists the
        ///     names, descriptions, and values of the special request parameters that the
        ///     SetTopicAttributes
        ///     action uses:
        ///     DeliveryPolicy
        ///     – The policy that defines how Amazon SNS retries failed deliveries to HTTP/S
        ///     endpoints.
        ///     DisplayName
        ///     – The display name to use for a topic with SMS subscriptions.
        ///     Policy
        ///     – The policy that defines who can access your topic. By default, only the topic
        ///     owner can publish or subscribe to the topic. The following attribute applies
        ///     only to server-side-encryption:
        ///     KmsMasterKeyId
        ///     – The ID of an Amazon Web Services managed customer master key (CMK) for Amazon
        ///     SNS or a custom CMK. For more information, see Key Terms. For more examples,
        ///     see KeyId in the Key Management Service API Reference. The following attribute
        ///     applies only to FIFO topics:
        ///     ContentBasedDeduplication
        ///     – Enables content-based deduplication for FIFO topics. By default,
        ///     ContentBasedDeduplication
        ///     is set to
        ///     false
        ///     . If you create a FIFO topic and this attribute is
        ///     false
        ///     , you must specify a value for the
        ///     MessageDeduplicationId
        ///     parameter for the Publish action. When you set
        ///     ContentBasedDeduplication
        ///     to
        ///     true
        ///     , Amazon SNS uses a SHA-256 hash to generate the
        ///     MessageDeduplicationId
        ///     using the body of the message (but not the attributes of the message). (Optional)
        ///     To override the generated value, you can specify a value for the
        ///     MessageDeduplicationId
        ///     parameter for the Publish action.
        /// The new value for the attribute.
        ///  A cancellation token that can be used by other objects or threads to receive
        ///     notice of cancellation.
        /// 
        Task AddAttributeAsync(string attributeName, string attributeValue, CancellationToken cancellationToken = default);
    }
}