/**
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: Apache-2.0.
 */

#pragma once
#include <aws/securitylake/SecurityLake_EXPORTS.h>
#include <aws/core/client/ClientConfiguration.h>
#include <aws/core/client/AWSClient.h>
#include <aws/core/client/AWSClientAsyncCRTP.h>
#include <aws/core/utils/json/JsonSerializer.h>
#include <aws/securitylake/SecurityLakeServiceClientModel.h>

namespace Aws
{
namespace SecurityLake
{
  /**
   * <p>Amazon Security Lake is a fully managed security data lake service. You can
   * use Security Lake to automatically centralize security data from cloud,
   * on-premises, and custom sources into a data lake that's stored in your Amazon
   * Web Services account. Amazon Web Services Organizations is an account management
   * service that lets you consolidate multiple Amazon Web Services accounts into an
   * organization that you create and centrally manage. With Organizations, you can
   * create member accounts and invite existing accounts to join your organization.
   * Security Lake helps you analyze security data for a more complete understanding
   * of your security posture across the entire organization. It can also help you
   * improve the protection of your workloads, applications, and data.</p> <p>The
   * data lake is backed by Amazon Simple Storage Service (Amazon S3) buckets, and
   * you retain ownership over your data.</p> <p>Amazon Security Lake integrates with
   * CloudTrail, a service that provides a record of actions taken by a user, role,
   * or an Amazon Web Services service. In Security Lake, CloudTrail captures API
   * calls for Security Lake as events. The calls captured include calls from the
   * Security Lake console and code calls to the Security Lake API operations. If you
   * create a trail, you can enable continuous delivery of CloudTrail events to an
   * Amazon S3 bucket, including events for Security Lake. If you don't configure a
   * trail, you can still view the most recent events in the CloudTrail console in
   * Event history. Using the information collected by CloudTrail you can determine
   * the request that was made to Security Lake, the IP address from which the
   * request was made, who made the request, when it was made, and additional
   * details. To learn more about Security Lake information in CloudTrail, see the <a
   * href="https://docs.aws.amazon.com/security-lake/latest/userguide/securitylake-cloudtrail.html">Amazon
   * Security Lake User Guide</a>.</p> <p>Security Lake automates the collection of
   * security-related log and event data from integrated Amazon Web Services and
   * third-party services. It also helps you manage the lifecycle of data with
   * customizable retention and replication settings. Security Lake converts ingested
   * data into Apache Parquet format and a standard open-source schema called the
   * Open Cybersecurity Schema Framework (OCSF).</p> <p>Other Amazon Web Services and
   * third-party services can subscribe to the data that's stored in Security Lake
   * for incident response and security data analytics.</p>
   */
  class AWS_SECURITYLAKE_API SecurityLakeClient : public Aws::Client::AWSJsonClient, public Aws::Client::ClientWithAsyncTemplateMethods<SecurityLakeClient>
  {
    public:
      typedef Aws::Client::AWSJsonClient BASECLASS;
      static const char* SERVICE_NAME;
      static const char* ALLOCATION_TAG;

      typedef SecurityLakeClientConfiguration ClientConfigurationType;
      typedef SecurityLakeEndpointProvider EndpointProviderType;

       /**
        * Initializes client to use DefaultCredentialProviderChain, with default http client factory, and optional client config. If client config
        * is not specified, it will be initialized to default values.
        */
        SecurityLakeClient(const Aws::SecurityLake::SecurityLakeClientConfiguration& clientConfiguration = Aws::SecurityLake::SecurityLakeClientConfiguration(),
                           std::shared_ptr<SecurityLakeEndpointProviderBase> endpointProvider = Aws::MakeShared<SecurityLakeEndpointProvider>(ALLOCATION_TAG));

       /**
        * Initializes client to use SimpleAWSCredentialsProvider, with default http client factory, and optional client config. If client config
        * is not specified, it will be initialized to default values.
        */
        SecurityLakeClient(const Aws::Auth::AWSCredentials& credentials,
                           std::shared_ptr<SecurityLakeEndpointProviderBase> endpointProvider = Aws::MakeShared<SecurityLakeEndpointProvider>(ALLOCATION_TAG),
                           const Aws::SecurityLake::SecurityLakeClientConfiguration& clientConfiguration = Aws::SecurityLake::SecurityLakeClientConfiguration());

       /**
        * Initializes client to use specified credentials provider with specified client config. If http client factory is not supplied,
        * the default http client factory will be used
        */
        SecurityLakeClient(const std::shared_ptr<Aws::Auth::AWSCredentialsProvider>& credentialsProvider,
                           std::shared_ptr<SecurityLakeEndpointProviderBase> endpointProvider = Aws::MakeShared<SecurityLakeEndpointProvider>(ALLOCATION_TAG),
                           const Aws::SecurityLake::SecurityLakeClientConfiguration& clientConfiguration = Aws::SecurityLake::SecurityLakeClientConfiguration());


        /* Legacy constructors due deprecation */
       /**
        * Initializes client to use DefaultCredentialProviderChain, with default http client factory, and optional client config. If client config
        * is not specified, it will be initialized to default values.
        */
        SecurityLakeClient(const Aws::Client::ClientConfiguration& clientConfiguration);

       /**
        * Initializes client to use SimpleAWSCredentialsProvider, with default http client factory, and optional client config. If client config
        * is not specified, it will be initialized to default values.
        */
        SecurityLakeClient(const Aws::Auth::AWSCredentials& credentials,
                           const Aws::Client::ClientConfiguration& clientConfiguration);

       /**
        * Initializes client to use specified credentials provider with specified client config. If http client factory is not supplied,
        * the default http client factory will be used
        */
        SecurityLakeClient(const std::shared_ptr<Aws::Auth::AWSCredentialsProvider>& credentialsProvider,
                           const Aws::Client::ClientConfiguration& clientConfiguration);

        /* End of legacy constructors due deprecation */
        virtual ~SecurityLakeClient();

        /**
         * <p>Adds a natively supported Amazon Web Service as an Amazon Security Lake
         * source. Enables source types for member accounts in required Amazon Web Services
         * Regions, based on the parameters you specify. You can choose any source type in
         * any Region for either accounts that are part of a trusted organization or
         * standalone accounts. Once you add an Amazon Web Service as a source, Security
         * Lake starts collecting logs and events from it.</p> <p>You can use this API only
         * to enable natively supported Amazon Web Services as a source. Use
         * <code>CreateCustomLogSource</code> to enable data collection from a custom
         * source.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/CreateAwsLogSource">AWS
         * API Reference</a></p>
         */
        virtual Model::CreateAwsLogSourceOutcome CreateAwsLogSource(const Model::CreateAwsLogSourceRequest& request) const;

        /**
         * A Callable wrapper for CreateAwsLogSource that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename CreateAwsLogSourceRequestT = Model::CreateAwsLogSourceRequest>
        Model::CreateAwsLogSourceOutcomeCallable CreateAwsLogSourceCallable(const CreateAwsLogSourceRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::CreateAwsLogSource, request);
        }

        /**
         * An Async wrapper for CreateAwsLogSource that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename CreateAwsLogSourceRequestT = Model::CreateAwsLogSourceRequest>
        void CreateAwsLogSourceAsync(const CreateAwsLogSourceRequestT& request, const CreateAwsLogSourceResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::CreateAwsLogSource, request, handler, context);
        }

        /**
         * <p>Adds a third-party custom source in Amazon Security Lake, from the Amazon Web
         * Services Region where you want to create a custom source. Security Lake can
         * collect logs and events from third-party custom sources. After creating the
         * appropriate IAM role to invoke Glue crawler, use this API to add a custom source
         * name in Security Lake. This operation creates a partition in the Amazon S3
         * bucket for Security Lake as the target location for log files from the custom
         * source. In addition, this operation also creates an associated Glue table and an
         * Glue crawler.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/CreateCustomLogSource">AWS
         * API Reference</a></p>
         */
        virtual Model::CreateCustomLogSourceOutcome CreateCustomLogSource(const Model::CreateCustomLogSourceRequest& request) const;

        /**
         * A Callable wrapper for CreateCustomLogSource that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename CreateCustomLogSourceRequestT = Model::CreateCustomLogSourceRequest>
        Model::CreateCustomLogSourceOutcomeCallable CreateCustomLogSourceCallable(const CreateCustomLogSourceRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::CreateCustomLogSource, request);
        }

        /**
         * An Async wrapper for CreateCustomLogSource that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename CreateCustomLogSourceRequestT = Model::CreateCustomLogSourceRequest>
        void CreateCustomLogSourceAsync(const CreateCustomLogSourceRequestT& request, const CreateCustomLogSourceResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::CreateCustomLogSource, request, handler, context);
        }

        /**
         * <p>Initializes an Amazon Security Lake instance with the provided (or default)
         * configuration. You can enable Security Lake in Amazon Web Services Regions with
         * customized settings before enabling log collection in Regions. To specify
         * particular Regions, configure these Regions using the
         * <code>configurations</code> parameter. If you have already enabled Security Lake
         * in a Region when you call this command, the command will update the Region if
         * you provide new configuration parameters. If you have not already enabled
         * Security Lake in the Region when you call this API, it will set up the data lake
         * in the Region with the specified configurations.</p> <p>When you enable Security
         * Lake, it starts ingesting security data after the
         * <code>CreateAwsLogSource</code> call. This includes ingesting security data from
         * sources, storing data, and making data accessible to subscribers. Security Lake
         * also enables all the existing settings and resources that it stores or maintains
         * for your Amazon Web Services account in the current Region, including security
         * log and event data. For more information, see the <a
         * href="https://docs.aws.amazon.com/security-lake/latest/userguide/what-is-security-lake.html">Amazon
         * Security Lake User Guide</a>.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/CreateDataLake">AWS
         * API Reference</a></p>
         */
        virtual Model::CreateDataLakeOutcome CreateDataLake(const Model::CreateDataLakeRequest& request) const;

        /**
         * A Callable wrapper for CreateDataLake that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename CreateDataLakeRequestT = Model::CreateDataLakeRequest>
        Model::CreateDataLakeOutcomeCallable CreateDataLakeCallable(const CreateDataLakeRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::CreateDataLake, request);
        }

        /**
         * An Async wrapper for CreateDataLake that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename CreateDataLakeRequestT = Model::CreateDataLakeRequest>
        void CreateDataLakeAsync(const CreateDataLakeRequestT& request, const CreateDataLakeResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::CreateDataLake, request, handler, context);
        }

        /**
         * <p>Creates the specified notification subscription in Amazon Security Lake for
         * the organization you specify.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/CreateDataLakeExceptionSubscription">AWS
         * API Reference</a></p>
         */
        virtual Model::CreateDataLakeExceptionSubscriptionOutcome CreateDataLakeExceptionSubscription(const Model::CreateDataLakeExceptionSubscriptionRequest& request) const;

        /**
         * A Callable wrapper for CreateDataLakeExceptionSubscription that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename CreateDataLakeExceptionSubscriptionRequestT = Model::CreateDataLakeExceptionSubscriptionRequest>
        Model::CreateDataLakeExceptionSubscriptionOutcomeCallable CreateDataLakeExceptionSubscriptionCallable(const CreateDataLakeExceptionSubscriptionRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::CreateDataLakeExceptionSubscription, request);
        }

        /**
         * An Async wrapper for CreateDataLakeExceptionSubscription that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename CreateDataLakeExceptionSubscriptionRequestT = Model::CreateDataLakeExceptionSubscriptionRequest>
        void CreateDataLakeExceptionSubscriptionAsync(const CreateDataLakeExceptionSubscriptionRequestT& request, const CreateDataLakeExceptionSubscriptionResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::CreateDataLakeExceptionSubscription, request, handler, context);
        }

        /**
         * <p>Automatically enables Amazon Security Lake for new member accounts in your
         * organization. Security Lake is not automatically enabled for any existing member
         * accounts in your organization.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/CreateDataLakeOrganizationConfiguration">AWS
         * API Reference</a></p>
         */
        virtual Model::CreateDataLakeOrganizationConfigurationOutcome CreateDataLakeOrganizationConfiguration(const Model::CreateDataLakeOrganizationConfigurationRequest& request) const;

        /**
         * A Callable wrapper for CreateDataLakeOrganizationConfiguration that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename CreateDataLakeOrganizationConfigurationRequestT = Model::CreateDataLakeOrganizationConfigurationRequest>
        Model::CreateDataLakeOrganizationConfigurationOutcomeCallable CreateDataLakeOrganizationConfigurationCallable(const CreateDataLakeOrganizationConfigurationRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::CreateDataLakeOrganizationConfiguration, request);
        }

        /**
         * An Async wrapper for CreateDataLakeOrganizationConfiguration that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename CreateDataLakeOrganizationConfigurationRequestT = Model::CreateDataLakeOrganizationConfigurationRequest>
        void CreateDataLakeOrganizationConfigurationAsync(const CreateDataLakeOrganizationConfigurationRequestT& request, const CreateDataLakeOrganizationConfigurationResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::CreateDataLakeOrganizationConfiguration, request, handler, context);
        }

        /**
         * <p>Creates a subscription permission for accounts that are already enabled in
         * Amazon Security Lake. You can create a subscriber with access to data in the
         * current Amazon Web Services Region.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/CreateSubscriber">AWS
         * API Reference</a></p>
         */
        virtual Model::CreateSubscriberOutcome CreateSubscriber(const Model::CreateSubscriberRequest& request) const;

        /**
         * A Callable wrapper for CreateSubscriber that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename CreateSubscriberRequestT = Model::CreateSubscriberRequest>
        Model::CreateSubscriberOutcomeCallable CreateSubscriberCallable(const CreateSubscriberRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::CreateSubscriber, request);
        }

        /**
         * An Async wrapper for CreateSubscriber that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename CreateSubscriberRequestT = Model::CreateSubscriberRequest>
        void CreateSubscriberAsync(const CreateSubscriberRequestT& request, const CreateSubscriberResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::CreateSubscriber, request, handler, context);
        }

        /**
         * <p>Notifies the subscriber when new data is written to the data lake for the
         * sources that the subscriber consumes in Security Lake. You can create only one
         * subscriber notification per subscriber.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/CreateSubscriberNotification">AWS
         * API Reference</a></p>
         */
        virtual Model::CreateSubscriberNotificationOutcome CreateSubscriberNotification(const Model::CreateSubscriberNotificationRequest& request) const;

        /**
         * A Callable wrapper for CreateSubscriberNotification that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename CreateSubscriberNotificationRequestT = Model::CreateSubscriberNotificationRequest>
        Model::CreateSubscriberNotificationOutcomeCallable CreateSubscriberNotificationCallable(const CreateSubscriberNotificationRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::CreateSubscriberNotification, request);
        }

        /**
         * An Async wrapper for CreateSubscriberNotification that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename CreateSubscriberNotificationRequestT = Model::CreateSubscriberNotificationRequest>
        void CreateSubscriberNotificationAsync(const CreateSubscriberNotificationRequestT& request, const CreateSubscriberNotificationResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::CreateSubscriberNotification, request, handler, context);
        }

        /**
         * <p>Removes a natively supported Amazon Web Service as an Amazon Security Lake
         * source. You can remove a source for one or more Regions. When you remove the
         * source, Security Lake stops collecting data from that source in the specified
         * Regions and accounts, and subscribers can no longer consume new data from the
         * source. However, subscribers can still consume data that Security Lake collected
         * from the source before removal.</p> <p>You can choose any source type in any
         * Amazon Web Services Region for either accounts that are part of a trusted
         * organization or standalone accounts. </p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/DeleteAwsLogSource">AWS
         * API Reference</a></p>
         */
        virtual Model::DeleteAwsLogSourceOutcome DeleteAwsLogSource(const Model::DeleteAwsLogSourceRequest& request) const;

        /**
         * A Callable wrapper for DeleteAwsLogSource that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename DeleteAwsLogSourceRequestT = Model::DeleteAwsLogSourceRequest>
        Model::DeleteAwsLogSourceOutcomeCallable DeleteAwsLogSourceCallable(const DeleteAwsLogSourceRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::DeleteAwsLogSource, request);
        }

        /**
         * An Async wrapper for DeleteAwsLogSource that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename DeleteAwsLogSourceRequestT = Model::DeleteAwsLogSourceRequest>
        void DeleteAwsLogSourceAsync(const DeleteAwsLogSourceRequestT& request, const DeleteAwsLogSourceResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::DeleteAwsLogSource, request, handler, context);
        }

        /**
         * <p>Removes a custom log source from Amazon Security Lake, to stop sending data
         * from the custom source to Security Lake.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/DeleteCustomLogSource">AWS
         * API Reference</a></p>
         */
        virtual Model::DeleteCustomLogSourceOutcome DeleteCustomLogSource(const Model::DeleteCustomLogSourceRequest& request) const;

        /**
         * A Callable wrapper for DeleteCustomLogSource that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename DeleteCustomLogSourceRequestT = Model::DeleteCustomLogSourceRequest>
        Model::DeleteCustomLogSourceOutcomeCallable DeleteCustomLogSourceCallable(const DeleteCustomLogSourceRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::DeleteCustomLogSource, request);
        }

        /**
         * An Async wrapper for DeleteCustomLogSource that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename DeleteCustomLogSourceRequestT = Model::DeleteCustomLogSourceRequest>
        void DeleteCustomLogSourceAsync(const DeleteCustomLogSourceRequestT& request, const DeleteCustomLogSourceResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::DeleteCustomLogSource, request, handler, context);
        }

        /**
         * <p>When you disable Amazon Security Lake from your account, Security Lake is
         * disabled in all Amazon Web Services Regions and it stops collecting data from
         * your sources. Also, this API automatically takes steps to remove the account
         * from Security Lake. However, Security Lake retains all of your existing settings
         * and the resources that it created in your Amazon Web Services account in the
         * current Amazon Web Services Region.</p> <p>The <code>DeleteDataLake</code>
         * operation does not delete the data that is stored in your Amazon S3 bucket,
         * which is owned by your Amazon Web Services account. For more information, see
         * the <a
         * href="https://docs.aws.amazon.com/security-lake/latest/userguide/disable-security-lake.html">Amazon
         * Security Lake User Guide</a>.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/DeleteDataLake">AWS
         * API Reference</a></p>
         */
        virtual Model::DeleteDataLakeOutcome DeleteDataLake(const Model::DeleteDataLakeRequest& request) const;

        /**
         * A Callable wrapper for DeleteDataLake that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename DeleteDataLakeRequestT = Model::DeleteDataLakeRequest>
        Model::DeleteDataLakeOutcomeCallable DeleteDataLakeCallable(const DeleteDataLakeRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::DeleteDataLake, request);
        }

        /**
         * An Async wrapper for DeleteDataLake that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename DeleteDataLakeRequestT = Model::DeleteDataLakeRequest>
        void DeleteDataLakeAsync(const DeleteDataLakeRequestT& request, const DeleteDataLakeResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::DeleteDataLake, request, handler, context);
        }

        /**
         * <p>Deletes the specified notification subscription in Amazon Security Lake for
         * the organization you specify.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/DeleteDataLakeExceptionSubscription">AWS
         * API Reference</a></p>
         */
        virtual Model::DeleteDataLakeExceptionSubscriptionOutcome DeleteDataLakeExceptionSubscription(const Model::DeleteDataLakeExceptionSubscriptionRequest& request) const;

        /**
         * A Callable wrapper for DeleteDataLakeExceptionSubscription that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename DeleteDataLakeExceptionSubscriptionRequestT = Model::DeleteDataLakeExceptionSubscriptionRequest>
        Model::DeleteDataLakeExceptionSubscriptionOutcomeCallable DeleteDataLakeExceptionSubscriptionCallable(const DeleteDataLakeExceptionSubscriptionRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::DeleteDataLakeExceptionSubscription, request);
        }

        /**
         * An Async wrapper for DeleteDataLakeExceptionSubscription that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename DeleteDataLakeExceptionSubscriptionRequestT = Model::DeleteDataLakeExceptionSubscriptionRequest>
        void DeleteDataLakeExceptionSubscriptionAsync(const DeleteDataLakeExceptionSubscriptionRequestT& request, const DeleteDataLakeExceptionSubscriptionResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::DeleteDataLakeExceptionSubscription, request, handler, context);
        }

        /**
         * <p>Turns off automatic enablement of Amazon Security Lake for member accounts
         * that are added to an organization in Organizations. Only the delegated Security
         * Lake administrator for an organization can perform this operation. If the
         * delegated Security Lake administrator performs this operation, new member
         * accounts won't automatically contribute data to the data lake.</p><p><h3>See
         * Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/DeleteDataLakeOrganizationConfiguration">AWS
         * API Reference</a></p>
         */
        virtual Model::DeleteDataLakeOrganizationConfigurationOutcome DeleteDataLakeOrganizationConfiguration(const Model::DeleteDataLakeOrganizationConfigurationRequest& request) const;

        /**
         * A Callable wrapper for DeleteDataLakeOrganizationConfiguration that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename DeleteDataLakeOrganizationConfigurationRequestT = Model::DeleteDataLakeOrganizationConfigurationRequest>
        Model::DeleteDataLakeOrganizationConfigurationOutcomeCallable DeleteDataLakeOrganizationConfigurationCallable(const DeleteDataLakeOrganizationConfigurationRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::DeleteDataLakeOrganizationConfiguration, request);
        }

        /**
         * An Async wrapper for DeleteDataLakeOrganizationConfiguration that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename DeleteDataLakeOrganizationConfigurationRequestT = Model::DeleteDataLakeOrganizationConfigurationRequest>
        void DeleteDataLakeOrganizationConfigurationAsync(const DeleteDataLakeOrganizationConfigurationRequestT& request, const DeleteDataLakeOrganizationConfigurationResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::DeleteDataLakeOrganizationConfiguration, request, handler, context);
        }

        /**
         * <p>Deletes the subscription permission and all notification settings for
         * accounts that are already enabled in Amazon Security Lake. When you run
         * <code>DeleteSubscriber</code>, the subscriber will no longer consume data from
         * Security Lake and the subscriber is removed. This operation deletes the
         * subscriber and removes access to data in the current Amazon Web Services
         * Region.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/DeleteSubscriber">AWS
         * API Reference</a></p>
         */
        virtual Model::DeleteSubscriberOutcome DeleteSubscriber(const Model::DeleteSubscriberRequest& request) const;

        /**
         * A Callable wrapper for DeleteSubscriber that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename DeleteSubscriberRequestT = Model::DeleteSubscriberRequest>
        Model::DeleteSubscriberOutcomeCallable DeleteSubscriberCallable(const DeleteSubscriberRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::DeleteSubscriber, request);
        }

        /**
         * An Async wrapper for DeleteSubscriber that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename DeleteSubscriberRequestT = Model::DeleteSubscriberRequest>
        void DeleteSubscriberAsync(const DeleteSubscriberRequestT& request, const DeleteSubscriberResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::DeleteSubscriber, request, handler, context);
        }

        /**
         * <p>Deletes the specified notification subscription in Amazon Security Lake for
         * the organization you specify.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/DeleteSubscriberNotification">AWS
         * API Reference</a></p>
         */
        virtual Model::DeleteSubscriberNotificationOutcome DeleteSubscriberNotification(const Model::DeleteSubscriberNotificationRequest& request) const;

        /**
         * A Callable wrapper for DeleteSubscriberNotification that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename DeleteSubscriberNotificationRequestT = Model::DeleteSubscriberNotificationRequest>
        Model::DeleteSubscriberNotificationOutcomeCallable DeleteSubscriberNotificationCallable(const DeleteSubscriberNotificationRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::DeleteSubscriberNotification, request);
        }

        /**
         * An Async wrapper for DeleteSubscriberNotification that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename DeleteSubscriberNotificationRequestT = Model::DeleteSubscriberNotificationRequest>
        void DeleteSubscriberNotificationAsync(const DeleteSubscriberNotificationRequestT& request, const DeleteSubscriberNotificationResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::DeleteSubscriberNotification, request, handler, context);
        }

        /**
         * <p>Deletes the Amazon Security Lake delegated administrator account for the
         * organization. This API can only be called by the organization management
         * account. The organization management account cannot be the delegated
         * administrator account.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/DeregisterDataLakeDelegatedAdministrator">AWS
         * API Reference</a></p>
         */
        virtual Model::DeregisterDataLakeDelegatedAdministratorOutcome DeregisterDataLakeDelegatedAdministrator(const Model::DeregisterDataLakeDelegatedAdministratorRequest& request) const;

        /**
         * A Callable wrapper for DeregisterDataLakeDelegatedAdministrator that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename DeregisterDataLakeDelegatedAdministratorRequestT = Model::DeregisterDataLakeDelegatedAdministratorRequest>
        Model::DeregisterDataLakeDelegatedAdministratorOutcomeCallable DeregisterDataLakeDelegatedAdministratorCallable(const DeregisterDataLakeDelegatedAdministratorRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::DeregisterDataLakeDelegatedAdministrator, request);
        }

        /**
         * An Async wrapper for DeregisterDataLakeDelegatedAdministrator that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename DeregisterDataLakeDelegatedAdministratorRequestT = Model::DeregisterDataLakeDelegatedAdministratorRequest>
        void DeregisterDataLakeDelegatedAdministratorAsync(const DeregisterDataLakeDelegatedAdministratorRequestT& request, const DeregisterDataLakeDelegatedAdministratorResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::DeregisterDataLakeDelegatedAdministrator, request, handler, context);
        }

        /**
         * <p>Retrieves the details of exception notifications for the account in Amazon
         * Security Lake.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/GetDataLakeExceptionSubscription">AWS
         * API Reference</a></p>
         */
        virtual Model::GetDataLakeExceptionSubscriptionOutcome GetDataLakeExceptionSubscription(const Model::GetDataLakeExceptionSubscriptionRequest& request) const;

        /**
         * A Callable wrapper for GetDataLakeExceptionSubscription that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename GetDataLakeExceptionSubscriptionRequestT = Model::GetDataLakeExceptionSubscriptionRequest>
        Model::GetDataLakeExceptionSubscriptionOutcomeCallable GetDataLakeExceptionSubscriptionCallable(const GetDataLakeExceptionSubscriptionRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::GetDataLakeExceptionSubscription, request);
        }

        /**
         * An Async wrapper for GetDataLakeExceptionSubscription that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename GetDataLakeExceptionSubscriptionRequestT = Model::GetDataLakeExceptionSubscriptionRequest>
        void GetDataLakeExceptionSubscriptionAsync(const GetDataLakeExceptionSubscriptionRequestT& request, const GetDataLakeExceptionSubscriptionResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::GetDataLakeExceptionSubscription, request, handler, context);
        }

        /**
         * <p>Retrieves the configuration that will be automatically set up for accounts
         * added to the organization after the organization has onboarded to Amazon
         * Security Lake. This API does not take input parameters.</p><p><h3>See Also:</h3>
         * <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/GetDataLakeOrganizationConfiguration">AWS
         * API Reference</a></p>
         */
        virtual Model::GetDataLakeOrganizationConfigurationOutcome GetDataLakeOrganizationConfiguration(const Model::GetDataLakeOrganizationConfigurationRequest& request) const;

        /**
         * A Callable wrapper for GetDataLakeOrganizationConfiguration that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename GetDataLakeOrganizationConfigurationRequestT = Model::GetDataLakeOrganizationConfigurationRequest>
        Model::GetDataLakeOrganizationConfigurationOutcomeCallable GetDataLakeOrganizationConfigurationCallable(const GetDataLakeOrganizationConfigurationRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::GetDataLakeOrganizationConfiguration, request);
        }

        /**
         * An Async wrapper for GetDataLakeOrganizationConfiguration that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename GetDataLakeOrganizationConfigurationRequestT = Model::GetDataLakeOrganizationConfigurationRequest>
        void GetDataLakeOrganizationConfigurationAsync(const GetDataLakeOrganizationConfigurationRequestT& request, const GetDataLakeOrganizationConfigurationResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::GetDataLakeOrganizationConfiguration, request, handler, context);
        }

        /**
         * <p>Retrieves a snapshot of the current Region, including whether Amazon Security
         * Lake is enabled for those accounts and which sources Security Lake is collecting
         * data from.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/GetDataLakeSources">AWS
         * API Reference</a></p>
         */
        virtual Model::GetDataLakeSourcesOutcome GetDataLakeSources(const Model::GetDataLakeSourcesRequest& request) const;

        /**
         * A Callable wrapper for GetDataLakeSources that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename GetDataLakeSourcesRequestT = Model::GetDataLakeSourcesRequest>
        Model::GetDataLakeSourcesOutcomeCallable GetDataLakeSourcesCallable(const GetDataLakeSourcesRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::GetDataLakeSources, request);
        }

        /**
         * An Async wrapper for GetDataLakeSources that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename GetDataLakeSourcesRequestT = Model::GetDataLakeSourcesRequest>
        void GetDataLakeSourcesAsync(const GetDataLakeSourcesRequestT& request, const GetDataLakeSourcesResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::GetDataLakeSources, request, handler, context);
        }

        /**
         * <p>Retrieves the subscription information for the specified subscription ID. You
         * can get information about a specific subscriber.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/GetSubscriber">AWS
         * API Reference</a></p>
         */
        virtual Model::GetSubscriberOutcome GetSubscriber(const Model::GetSubscriberRequest& request) const;

        /**
         * A Callable wrapper for GetSubscriber that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename GetSubscriberRequestT = Model::GetSubscriberRequest>
        Model::GetSubscriberOutcomeCallable GetSubscriberCallable(const GetSubscriberRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::GetSubscriber, request);
        }

        /**
         * An Async wrapper for GetSubscriber that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename GetSubscriberRequestT = Model::GetSubscriberRequest>
        void GetSubscriberAsync(const GetSubscriberRequestT& request, const GetSubscriberResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::GetSubscriber, request, handler, context);
        }

        /**
         * <p>Lists the Amazon Security Lake exceptions that you can use to find the source
         * of problems and fix them.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/ListDataLakeExceptions">AWS
         * API Reference</a></p>
         */
        virtual Model::ListDataLakeExceptionsOutcome ListDataLakeExceptions(const Model::ListDataLakeExceptionsRequest& request) const;

        /**
         * A Callable wrapper for ListDataLakeExceptions that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename ListDataLakeExceptionsRequestT = Model::ListDataLakeExceptionsRequest>
        Model::ListDataLakeExceptionsOutcomeCallable ListDataLakeExceptionsCallable(const ListDataLakeExceptionsRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::ListDataLakeExceptions, request);
        }

        /**
         * An Async wrapper for ListDataLakeExceptions that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename ListDataLakeExceptionsRequestT = Model::ListDataLakeExceptionsRequest>
        void ListDataLakeExceptionsAsync(const ListDataLakeExceptionsRequestT& request, const ListDataLakeExceptionsResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::ListDataLakeExceptions, request, handler, context);
        }

        /**
         * <p>Retrieves the Amazon Security Lake configuration object for the specified
         * Amazon Web Services Regions. You can use this operation to determine whether
         * Security Lake is enabled for a Region.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/ListDataLakes">AWS
         * API Reference</a></p>
         */
        virtual Model::ListDataLakesOutcome ListDataLakes(const Model::ListDataLakesRequest& request) const;

        /**
         * A Callable wrapper for ListDataLakes that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename ListDataLakesRequestT = Model::ListDataLakesRequest>
        Model::ListDataLakesOutcomeCallable ListDataLakesCallable(const ListDataLakesRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::ListDataLakes, request);
        }

        /**
         * An Async wrapper for ListDataLakes that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename ListDataLakesRequestT = Model::ListDataLakesRequest>
        void ListDataLakesAsync(const ListDataLakesRequestT& request, const ListDataLakesResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::ListDataLakes, request, handler, context);
        }

        /**
         * <p>Retrieves the log sources in the current Amazon Web Services
         * Region.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/ListLogSources">AWS
         * API Reference</a></p>
         */
        virtual Model::ListLogSourcesOutcome ListLogSources(const Model::ListLogSourcesRequest& request) const;

        /**
         * A Callable wrapper for ListLogSources that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename ListLogSourcesRequestT = Model::ListLogSourcesRequest>
        Model::ListLogSourcesOutcomeCallable ListLogSourcesCallable(const ListLogSourcesRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::ListLogSources, request);
        }

        /**
         * An Async wrapper for ListLogSources that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename ListLogSourcesRequestT = Model::ListLogSourcesRequest>
        void ListLogSourcesAsync(const ListLogSourcesRequestT& request, const ListLogSourcesResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::ListLogSources, request, handler, context);
        }

        /**
         * <p>List all subscribers for the specific Amazon Security Lake account ID. You
         * can retrieve a list of subscriptions associated with a specific organization or
         * Amazon Web Services account.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/ListSubscribers">AWS
         * API Reference</a></p>
         */
        virtual Model::ListSubscribersOutcome ListSubscribers(const Model::ListSubscribersRequest& request) const;

        /**
         * A Callable wrapper for ListSubscribers that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename ListSubscribersRequestT = Model::ListSubscribersRequest>
        Model::ListSubscribersOutcomeCallable ListSubscribersCallable(const ListSubscribersRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::ListSubscribers, request);
        }

        /**
         * An Async wrapper for ListSubscribers that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename ListSubscribersRequestT = Model::ListSubscribersRequest>
        void ListSubscribersAsync(const ListSubscribersRequestT& request, const ListSubscribersResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::ListSubscribers, request, handler, context);
        }

        /**
         * <p>Retrieves the tags (keys and values) that are associated with an Amazon
         * Security Lake resource: a subscriber, or the data lake configuration for your
         * Amazon Web Services account in a particular Amazon Web Services
         * Region.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/ListTagsForResource">AWS
         * API Reference</a></p>
         */
        virtual Model::ListTagsForResourceOutcome ListTagsForResource(const Model::ListTagsForResourceRequest& request) const;

        /**
         * A Callable wrapper for ListTagsForResource that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename ListTagsForResourceRequestT = Model::ListTagsForResourceRequest>
        Model::ListTagsForResourceOutcomeCallable ListTagsForResourceCallable(const ListTagsForResourceRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::ListTagsForResource, request);
        }

        /**
         * An Async wrapper for ListTagsForResource that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename ListTagsForResourceRequestT = Model::ListTagsForResourceRequest>
        void ListTagsForResourceAsync(const ListTagsForResourceRequestT& request, const ListTagsForResourceResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::ListTagsForResource, request, handler, context);
        }

        /**
         * <p>Designates the Amazon Security Lake delegated administrator account for the
         * organization. This API can only be called by the organization management
         * account. The organization management account cannot be the delegated
         * administrator account.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/RegisterDataLakeDelegatedAdministrator">AWS
         * API Reference</a></p>
         */
        virtual Model::RegisterDataLakeDelegatedAdministratorOutcome RegisterDataLakeDelegatedAdministrator(const Model::RegisterDataLakeDelegatedAdministratorRequest& request) const;

        /**
         * A Callable wrapper for RegisterDataLakeDelegatedAdministrator that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename RegisterDataLakeDelegatedAdministratorRequestT = Model::RegisterDataLakeDelegatedAdministratorRequest>
        Model::RegisterDataLakeDelegatedAdministratorOutcomeCallable RegisterDataLakeDelegatedAdministratorCallable(const RegisterDataLakeDelegatedAdministratorRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::RegisterDataLakeDelegatedAdministrator, request);
        }

        /**
         * An Async wrapper for RegisterDataLakeDelegatedAdministrator that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename RegisterDataLakeDelegatedAdministratorRequestT = Model::RegisterDataLakeDelegatedAdministratorRequest>
        void RegisterDataLakeDelegatedAdministratorAsync(const RegisterDataLakeDelegatedAdministratorRequestT& request, const RegisterDataLakeDelegatedAdministratorResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::RegisterDataLakeDelegatedAdministrator, request, handler, context);
        }

        /**
         * <p>Adds or updates one or more tags that are associated with an Amazon Security
         * Lake resource: a subscriber, or the data lake configuration for your Amazon Web
         * Services account in a particular Amazon Web Services Region. A <i>tag</i> is a
         * label that you can define and associate with Amazon Web Services resources. Each
         * tag consists of a required <i>tag key</i> and an associated <i>tag value</i>. A
         * <i>tag key</i> is a general label that acts as a category for a more specific
         * tag value. A <i>tag value</i> acts as a descriptor for a tag key. Tags can help
         * you identify, categorize, and manage resources in different ways, such as by
         * owner, environment, or other criteria. For more information, see <a
         * href="https://docs.aws.amazon.com/security-lake/latest/userguide/tagging-resources.html">Tagging
         * Amazon Security Lake resources</a> in the <i>Amazon Security Lake User
         * Guide</i>.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/TagResource">AWS
         * API Reference</a></p>
         */
        virtual Model::TagResourceOutcome TagResource(const Model::TagResourceRequest& request) const;

        /**
         * A Callable wrapper for TagResource that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename TagResourceRequestT = Model::TagResourceRequest>
        Model::TagResourceOutcomeCallable TagResourceCallable(const TagResourceRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::TagResource, request);
        }

        /**
         * An Async wrapper for TagResource that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename TagResourceRequestT = Model::TagResourceRequest>
        void TagResourceAsync(const TagResourceRequestT& request, const TagResourceResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::TagResource, request, handler, context);
        }

        /**
         * <p>Removes one or more tags (keys and values) from an Amazon Security Lake
         * resource: a subscriber, or the data lake configuration for your Amazon Web
         * Services account in a particular Amazon Web Services Region.</p><p><h3>See
         * Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/UntagResource">AWS
         * API Reference</a></p>
         */
        virtual Model::UntagResourceOutcome UntagResource(const Model::UntagResourceRequest& request) const;

        /**
         * A Callable wrapper for UntagResource that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename UntagResourceRequestT = Model::UntagResourceRequest>
        Model::UntagResourceOutcomeCallable UntagResourceCallable(const UntagResourceRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::UntagResource, request);
        }

        /**
         * An Async wrapper for UntagResource that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename UntagResourceRequestT = Model::UntagResourceRequest>
        void UntagResourceAsync(const UntagResourceRequestT& request, const UntagResourceResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::UntagResource, request, handler, context);
        }

        /**
         * <p>Specifies where to store your security data and for how long. You can add a
         * rollup Region to consolidate data from multiple Amazon Web Services
         * Regions.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/UpdateDataLake">AWS
         * API Reference</a></p>
         */
        virtual Model::UpdateDataLakeOutcome UpdateDataLake(const Model::UpdateDataLakeRequest& request) const;

        /**
         * A Callable wrapper for UpdateDataLake that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename UpdateDataLakeRequestT = Model::UpdateDataLakeRequest>
        Model::UpdateDataLakeOutcomeCallable UpdateDataLakeCallable(const UpdateDataLakeRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::UpdateDataLake, request);
        }

        /**
         * An Async wrapper for UpdateDataLake that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename UpdateDataLakeRequestT = Model::UpdateDataLakeRequest>
        void UpdateDataLakeAsync(const UpdateDataLakeRequestT& request, const UpdateDataLakeResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::UpdateDataLake, request, handler, context);
        }

        /**
         * <p>Updates the specified notification subscription in Amazon Security Lake for
         * the organization you specify.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/UpdateDataLakeExceptionSubscription">AWS
         * API Reference</a></p>
         */
        virtual Model::UpdateDataLakeExceptionSubscriptionOutcome UpdateDataLakeExceptionSubscription(const Model::UpdateDataLakeExceptionSubscriptionRequest& request) const;

        /**
         * A Callable wrapper for UpdateDataLakeExceptionSubscription that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename UpdateDataLakeExceptionSubscriptionRequestT = Model::UpdateDataLakeExceptionSubscriptionRequest>
        Model::UpdateDataLakeExceptionSubscriptionOutcomeCallable UpdateDataLakeExceptionSubscriptionCallable(const UpdateDataLakeExceptionSubscriptionRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::UpdateDataLakeExceptionSubscription, request);
        }

        /**
         * An Async wrapper for UpdateDataLakeExceptionSubscription that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename UpdateDataLakeExceptionSubscriptionRequestT = Model::UpdateDataLakeExceptionSubscriptionRequest>
        void UpdateDataLakeExceptionSubscriptionAsync(const UpdateDataLakeExceptionSubscriptionRequestT& request, const UpdateDataLakeExceptionSubscriptionResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::UpdateDataLakeExceptionSubscription, request, handler, context);
        }

        /**
         * <p>Updates an existing subscription for the given Amazon Security Lake account
         * ID. You can update a subscriber by changing the sources that the subscriber
         * consumes data from.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/UpdateSubscriber">AWS
         * API Reference</a></p>
         */
        virtual Model::UpdateSubscriberOutcome UpdateSubscriber(const Model::UpdateSubscriberRequest& request) const;

        /**
         * A Callable wrapper for UpdateSubscriber that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename UpdateSubscriberRequestT = Model::UpdateSubscriberRequest>
        Model::UpdateSubscriberOutcomeCallable UpdateSubscriberCallable(const UpdateSubscriberRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::UpdateSubscriber, request);
        }

        /**
         * An Async wrapper for UpdateSubscriber that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename UpdateSubscriberRequestT = Model::UpdateSubscriberRequest>
        void UpdateSubscriberAsync(const UpdateSubscriberRequestT& request, const UpdateSubscriberResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::UpdateSubscriber, request, handler, context);
        }

        /**
         * <p>Updates an existing notification method for the subscription (SQS or HTTPs
         * endpoint) or switches the notification subscription endpoint for a
         * subscriber.</p><p><h3>See Also:</h3>   <a
         * href="http://docs.aws.amazon.com/goto/WebAPI/securitylake-2018-05-10/UpdateSubscriberNotification">AWS
         * API Reference</a></p>
         */
        virtual Model::UpdateSubscriberNotificationOutcome UpdateSubscriberNotification(const Model::UpdateSubscriberNotificationRequest& request) const;

        /**
         * A Callable wrapper for UpdateSubscriberNotification that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template<typename UpdateSubscriberNotificationRequestT = Model::UpdateSubscriberNotificationRequest>
        Model::UpdateSubscriberNotificationOutcomeCallable UpdateSubscriberNotificationCallable(const UpdateSubscriberNotificationRequestT& request) const
        {
            return SubmitCallable(&SecurityLakeClient::UpdateSubscriberNotification, request);
        }

        /**
         * An Async wrapper for UpdateSubscriberNotification that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template<typename UpdateSubscriberNotificationRequestT = Model::UpdateSubscriberNotificationRequest>
        void UpdateSubscriberNotificationAsync(const UpdateSubscriberNotificationRequestT& request, const UpdateSubscriberNotificationResponseReceivedHandler& handler, const std::shared_ptr<const Aws::Client::AsyncCallerContext>& context = nullptr) const
        {
            return SubmitAsync(&SecurityLakeClient::UpdateSubscriberNotification, request, handler, context);
        }


      void OverrideEndpoint(const Aws::String& endpoint);
      std::shared_ptr<SecurityLakeEndpointProviderBase>& accessEndpointProvider();
    private:
      friend class Aws::Client::ClientWithAsyncTemplateMethods<SecurityLakeClient>;
      void init(const SecurityLakeClientConfiguration& clientConfiguration);

      SecurityLakeClientConfiguration m_clientConfiguration;
      std::shared_ptr<Aws::Utils::Threading::Executor> m_executor;
      std::shared_ptr<SecurityLakeEndpointProviderBase> m_endpointProvider;
  };

} // namespace SecurityLake
} // namespace Aws