/**
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: Apache-2.0.
 */
#pragma once
#include 
#include 
#include 
#include 
#include 
#include 
namespace Aws
{
namespace ElasticTranscoder
{
  /**
   * AWS Elastic Transcoder Service The AWS Elastic
   * Transcoder Service.
   */
  class AWS_ELASTICTRANSCODER_API ElasticTranscoderClient : public Aws::Client::AWSJsonClient, public Aws::Client::ClientWithAsyncTemplateMethods
  {
    public:
      typedef Aws::Client::AWSJsonClient BASECLASS;
      static const char* SERVICE_NAME;
      static const char* ALLOCATION_TAG;
      typedef ElasticTranscoderClientConfiguration ClientConfigurationType;
      typedef ElasticTranscoderEndpointProvider 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.
        */
        ElasticTranscoderClient(const Aws::ElasticTranscoder::ElasticTranscoderClientConfiguration& clientConfiguration = Aws::ElasticTranscoder::ElasticTranscoderClientConfiguration(),
                                std::shared_ptr endpointProvider = Aws::MakeShared(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.
        */
        ElasticTranscoderClient(const Aws::Auth::AWSCredentials& credentials,
                                std::shared_ptr endpointProvider = Aws::MakeShared(ALLOCATION_TAG),
                                const Aws::ElasticTranscoder::ElasticTranscoderClientConfiguration& clientConfiguration = Aws::ElasticTranscoder::ElasticTranscoderClientConfiguration());
       /**
        * 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
        */
        ElasticTranscoderClient(const std::shared_ptr& credentialsProvider,
                                std::shared_ptr endpointProvider = Aws::MakeShared(ALLOCATION_TAG),
                                const Aws::ElasticTranscoder::ElasticTranscoderClientConfiguration& clientConfiguration = Aws::ElasticTranscoder::ElasticTranscoderClientConfiguration());
        /* 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.
        */
        ElasticTranscoderClient(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.
        */
        ElasticTranscoderClient(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
        */
        ElasticTranscoderClient(const std::shared_ptr& credentialsProvider,
                                const Aws::Client::ClientConfiguration& clientConfiguration);
        /* End of legacy constructors due deprecation */
        virtual ~ElasticTranscoderClient();
        /**
         * The CancelJob operation cancels an unfinished job.
  You can only
         * cancel a job that has a status of Submitted. To prevent a pipeline
         * from starting to process a job while you're getting the job identifier, use
         * UpdatePipelineStatus to temporarily pause the pipeline.
         * See Also:
   AWS
         * API Reference
         */
        virtual Model::CancelJobOutcome CancelJob(const Model::CancelJobRequest& request) const;
        /**
         * A Callable wrapper for CancelJob that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template
        Model::CancelJobOutcomeCallable CancelJobCallable(const CancelJobRequestT& request) const
        {
            return SubmitCallable(&ElasticTranscoderClient::CancelJob, request);
        }
        /**
         * An Async wrapper for CancelJob that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template
        void CancelJobAsync(const CancelJobRequestT& request, const CancelJobResponseReceivedHandler& handler, const std::shared_ptr& context = nullptr) const
        {
            return SubmitAsync(&ElasticTranscoderClient::CancelJob, request, handler, context);
        }
        /**
         * When you create a job, Elastic Transcoder returns JSON data that includes the
         * values that you specified plus information about the job that is created.
         * If you have specified more than one output for your jobs (for example, one
         * output for the Kindle Fire and another output for the Apple iPhone 4s), you
         * currently must use the Elastic Transcoder API to list the jobs (as opposed to
         * the AWS Console).
See Also:
   AWS
         * API Reference
         */
        virtual Model::CreateJobOutcome CreateJob(const Model::CreateJobRequest& request) const;
        /**
         * A Callable wrapper for CreateJob that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template
        Model::CreateJobOutcomeCallable CreateJobCallable(const CreateJobRequestT& request) const
        {
            return SubmitCallable(&ElasticTranscoderClient::CreateJob, request);
        }
        /**
         * An Async wrapper for CreateJob that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template
        void CreateJobAsync(const CreateJobRequestT& request, const CreateJobResponseReceivedHandler& handler, const std::shared_ptr& context = nullptr) const
        {
            return SubmitAsync(&ElasticTranscoderClient::CreateJob, request, handler, context);
        }
        /**
         * The CreatePipeline operation creates a pipeline with settings that you
         * specify.
See Also:
   AWS
         * API Reference
         */
        virtual Model::CreatePipelineOutcome CreatePipeline(const Model::CreatePipelineRequest& request) const;
        /**
         * A Callable wrapper for CreatePipeline that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template
        Model::CreatePipelineOutcomeCallable CreatePipelineCallable(const CreatePipelineRequestT& request) const
        {
            return SubmitCallable(&ElasticTranscoderClient::CreatePipeline, request);
        }
        /**
         * An Async wrapper for CreatePipeline that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template
        void CreatePipelineAsync(const CreatePipelineRequestT& request, const CreatePipelineResponseReceivedHandler& handler, const std::shared_ptr& context = nullptr) const
        {
            return SubmitAsync(&ElasticTranscoderClient::CreatePipeline, request, handler, context);
        }
        /**
         * The CreatePreset operation creates a preset with settings that you
         * specify.
  Elastic Transcoder checks the CreatePreset settings
         * to ensure that they meet Elastic Transcoder requirements and to determine
         * whether they comply with H.264 standards. If your settings are not valid for
         * Elastic Transcoder, Elastic Transcoder returns an HTTP 400 response
         * (ValidationException) and does not create the preset. If the
         * settings are valid for Elastic Transcoder but aren't strictly compliant with the
         * H.264 standard, Elastic Transcoder creates the preset and returns a warning
         * message in the response. This helps you determine whether your settings comply
         * with the H.264 standard while giving you greater flexibility with respect to the
         * video that Elastic Transcoder produces.
  Elastic Transcoder
         * uses the H.264 video-compression format. For more information, see the
         * International Telecommunication Union publication Recommendation ITU-T H.264:
         * Advanced video coding for generic audiovisual services.
See
         * Also:
   AWS
         * API Reference
         */
        virtual Model::CreatePresetOutcome CreatePreset(const Model::CreatePresetRequest& request) const;
        /**
         * A Callable wrapper for CreatePreset that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template
        Model::CreatePresetOutcomeCallable CreatePresetCallable(const CreatePresetRequestT& request) const
        {
            return SubmitCallable(&ElasticTranscoderClient::CreatePreset, request);
        }
        /**
         * An Async wrapper for CreatePreset that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template
        void CreatePresetAsync(const CreatePresetRequestT& request, const CreatePresetResponseReceivedHandler& handler, const std::shared_ptr& context = nullptr) const
        {
            return SubmitAsync(&ElasticTranscoderClient::CreatePreset, request, handler, context);
        }
        /**
         * The DeletePipeline operation removes a pipeline.
  You can only delete
         * a pipeline that has never been used or that is not currently in use (doesn't
         * contain any active jobs). If the pipeline is currently in use,
         * DeletePipeline returns an error. 
See Also:
   AWS
         * API Reference
         */
        virtual Model::DeletePipelineOutcome DeletePipeline(const Model::DeletePipelineRequest& request) const;
        /**
         * A Callable wrapper for DeletePipeline that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template
        Model::DeletePipelineOutcomeCallable DeletePipelineCallable(const DeletePipelineRequestT& request) const
        {
            return SubmitCallable(&ElasticTranscoderClient::DeletePipeline, request);
        }
        /**
         * An Async wrapper for DeletePipeline that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template
        void DeletePipelineAsync(const DeletePipelineRequestT& request, const DeletePipelineResponseReceivedHandler& handler, const std::shared_ptr& context = nullptr) const
        {
            return SubmitAsync(&ElasticTranscoderClient::DeletePipeline, request, handler, context);
        }
        /**
         * The DeletePreset operation removes a preset that you've added in an AWS
         * region.
  You can't delete the default presets that are included
         * with Elastic Transcoder.
 See Also:
   AWS
         * API Reference
         */
        virtual Model::DeletePresetOutcome DeletePreset(const Model::DeletePresetRequest& request) const;
        /**
         * A Callable wrapper for DeletePreset that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template
        Model::DeletePresetOutcomeCallable DeletePresetCallable(const DeletePresetRequestT& request) const
        {
            return SubmitCallable(&ElasticTranscoderClient::DeletePreset, request);
        }
        /**
         * An Async wrapper for DeletePreset that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template
        void DeletePresetAsync(const DeletePresetRequestT& request, const DeletePresetResponseReceivedHandler& handler, const std::shared_ptr& context = nullptr) const
        {
            return SubmitAsync(&ElasticTranscoderClient::DeletePreset, request, handler, context);
        }
        /**
         * The ListJobsByPipeline operation gets a list of the jobs currently in a
         * pipeline.
 Elastic Transcoder returns all of the jobs currently in the
         * specified pipeline. The response body contains one element for each job that
         * satisfies the search criteria.
See Also:
   AWS
         * API Reference
         */
        virtual Model::ListJobsByPipelineOutcome ListJobsByPipeline(const Model::ListJobsByPipelineRequest& request) const;
        /**
         * A Callable wrapper for ListJobsByPipeline that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template
        Model::ListJobsByPipelineOutcomeCallable ListJobsByPipelineCallable(const ListJobsByPipelineRequestT& request) const
        {
            return SubmitCallable(&ElasticTranscoderClient::ListJobsByPipeline, request);
        }
        /**
         * An Async wrapper for ListJobsByPipeline that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template
        void ListJobsByPipelineAsync(const ListJobsByPipelineRequestT& request, const ListJobsByPipelineResponseReceivedHandler& handler, const std::shared_ptr& context = nullptr) const
        {
            return SubmitAsync(&ElasticTranscoderClient::ListJobsByPipeline, request, handler, context);
        }
        /**
         * The ListJobsByStatus operation gets a list of jobs that have a specified
         * status. The response body contains one element for each job that satisfies the
         * search criteria.
See Also:
   AWS
         * API Reference
         */
        virtual Model::ListJobsByStatusOutcome ListJobsByStatus(const Model::ListJobsByStatusRequest& request) const;
        /**
         * A Callable wrapper for ListJobsByStatus that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template
        Model::ListJobsByStatusOutcomeCallable ListJobsByStatusCallable(const ListJobsByStatusRequestT& request) const
        {
            return SubmitCallable(&ElasticTranscoderClient::ListJobsByStatus, request);
        }
        /**
         * An Async wrapper for ListJobsByStatus that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template
        void ListJobsByStatusAsync(const ListJobsByStatusRequestT& request, const ListJobsByStatusResponseReceivedHandler& handler, const std::shared_ptr& context = nullptr) const
        {
            return SubmitAsync(&ElasticTranscoderClient::ListJobsByStatus, request, handler, context);
        }
        /**
         * The ListPipelines operation gets a list of the pipelines associated with the
         * current AWS account.
See Also:
   AWS
         * API Reference
         */
        virtual Model::ListPipelinesOutcome ListPipelines(const Model::ListPipelinesRequest& request) const;
        /**
         * A Callable wrapper for ListPipelines that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template
        Model::ListPipelinesOutcomeCallable ListPipelinesCallable(const ListPipelinesRequestT& request) const
        {
            return SubmitCallable(&ElasticTranscoderClient::ListPipelines, request);
        }
        /**
         * An Async wrapper for ListPipelines that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template
        void ListPipelinesAsync(const ListPipelinesRequestT& request, const ListPipelinesResponseReceivedHandler& handler, const std::shared_ptr& context = nullptr) const
        {
            return SubmitAsync(&ElasticTranscoderClient::ListPipelines, request, handler, context);
        }
        /**
         * The ListPresets operation gets a list of the default presets included with
         * Elastic Transcoder and the presets that you've added in an AWS
         * region.
See Also:
   AWS
         * API Reference
         */
        virtual Model::ListPresetsOutcome ListPresets(const Model::ListPresetsRequest& request) const;
        /**
         * A Callable wrapper for ListPresets that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template
        Model::ListPresetsOutcomeCallable ListPresetsCallable(const ListPresetsRequestT& request) const
        {
            return SubmitCallable(&ElasticTranscoderClient::ListPresets, request);
        }
        /**
         * An Async wrapper for ListPresets that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template
        void ListPresetsAsync(const ListPresetsRequestT& request, const ListPresetsResponseReceivedHandler& handler, const std::shared_ptr& context = nullptr) const
        {
            return SubmitAsync(&ElasticTranscoderClient::ListPresets, request, handler, context);
        }
        /**
         * The ReadJob operation returns detailed information about a job.
See
         * Also:
   AWS
         * API Reference
         */
        virtual Model::ReadJobOutcome ReadJob(const Model::ReadJobRequest& request) const;
        /**
         * A Callable wrapper for ReadJob that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template
        Model::ReadJobOutcomeCallable ReadJobCallable(const ReadJobRequestT& request) const
        {
            return SubmitCallable(&ElasticTranscoderClient::ReadJob, request);
        }
        /**
         * An Async wrapper for ReadJob that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template
        void ReadJobAsync(const ReadJobRequestT& request, const ReadJobResponseReceivedHandler& handler, const std::shared_ptr& context = nullptr) const
        {
            return SubmitAsync(&ElasticTranscoderClient::ReadJob, request, handler, context);
        }
        /**
         * The ReadPipeline operation gets detailed information about a
         * pipeline.
See Also:
   AWS
         * API Reference
         */
        virtual Model::ReadPipelineOutcome ReadPipeline(const Model::ReadPipelineRequest& request) const;
        /**
         * A Callable wrapper for ReadPipeline that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template
        Model::ReadPipelineOutcomeCallable ReadPipelineCallable(const ReadPipelineRequestT& request) const
        {
            return SubmitCallable(&ElasticTranscoderClient::ReadPipeline, request);
        }
        /**
         * An Async wrapper for ReadPipeline that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template
        void ReadPipelineAsync(const ReadPipelineRequestT& request, const ReadPipelineResponseReceivedHandler& handler, const std::shared_ptr& context = nullptr) const
        {
            return SubmitAsync(&ElasticTranscoderClient::ReadPipeline, request, handler, context);
        }
        /**
         * The ReadPreset operation gets detailed information about a
         * preset.
See Also:
   AWS
         * API Reference
         */
        virtual Model::ReadPresetOutcome ReadPreset(const Model::ReadPresetRequest& request) const;
        /**
         * A Callable wrapper for ReadPreset that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template
        Model::ReadPresetOutcomeCallable ReadPresetCallable(const ReadPresetRequestT& request) const
        {
            return SubmitCallable(&ElasticTranscoderClient::ReadPreset, request);
        }
        /**
         * An Async wrapper for ReadPreset that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template
        void ReadPresetAsync(const ReadPresetRequestT& request, const ReadPresetResponseReceivedHandler& handler, const std::shared_ptr& context = nullptr) const
        {
            return SubmitAsync(&ElasticTranscoderClient::ReadPreset, request, handler, context);
        }
        /**
         *  Use the UpdatePipeline operation to update settings for a
         * pipeline.
  When you change pipeline settings, your changes
         * take effect immediately. Jobs that you have already submitted and that Elastic
         * Transcoder has not started to process are affected in addition to jobs that you
         * submit after you change settings. 
 See Also:
   AWS
         * API Reference
         */
        virtual Model::UpdatePipelineOutcome UpdatePipeline(const Model::UpdatePipelineRequest& request) const;
        /**
         * A Callable wrapper for UpdatePipeline that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template
        Model::UpdatePipelineOutcomeCallable UpdatePipelineCallable(const UpdatePipelineRequestT& request) const
        {
            return SubmitCallable(&ElasticTranscoderClient::UpdatePipeline, request);
        }
        /**
         * An Async wrapper for UpdatePipeline that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template
        void UpdatePipelineAsync(const UpdatePipelineRequestT& request, const UpdatePipelineResponseReceivedHandler& handler, const std::shared_ptr& context = nullptr) const
        {
            return SubmitAsync(&ElasticTranscoderClient::UpdatePipeline, request, handler, context);
        }
        /**
         * With the UpdatePipelineNotifications operation, you can update Amazon Simple
         * Notification Service (Amazon SNS) notifications for a pipeline.
 When you
         * update notifications for a pipeline, Elastic Transcoder returns the values that
         * you specified in the request.
See Also:
   AWS
         * API Reference
         */
        virtual Model::UpdatePipelineNotificationsOutcome UpdatePipelineNotifications(const Model::UpdatePipelineNotificationsRequest& request) const;
        /**
         * A Callable wrapper for UpdatePipelineNotifications that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template
        Model::UpdatePipelineNotificationsOutcomeCallable UpdatePipelineNotificationsCallable(const UpdatePipelineNotificationsRequestT& request) const
        {
            return SubmitCallable(&ElasticTranscoderClient::UpdatePipelineNotifications, request);
        }
        /**
         * An Async wrapper for UpdatePipelineNotifications that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template
        void UpdatePipelineNotificationsAsync(const UpdatePipelineNotificationsRequestT& request, const UpdatePipelineNotificationsResponseReceivedHandler& handler, const std::shared_ptr& context = nullptr) const
        {
            return SubmitAsync(&ElasticTranscoderClient::UpdatePipelineNotifications, request, handler, context);
        }
        /**
         * The UpdatePipelineStatus operation pauses or reactivates a pipeline, so that
         * the pipeline stops or restarts the processing of jobs.
 Changing the
         * pipeline status is useful if you want to cancel one or more jobs. You can't
         * cancel jobs after Elastic Transcoder has started processing them; if you pause
         * the pipeline to which you submitted the jobs, you have more time to get the job
         * IDs for the jobs that you want to cancel, and to send a CancelJob
         * request. 
See Also:
   AWS
         * API Reference
         */
        virtual Model::UpdatePipelineStatusOutcome UpdatePipelineStatus(const Model::UpdatePipelineStatusRequest& request) const;
        /**
         * A Callable wrapper for UpdatePipelineStatus that returns a future to the operation so that it can be executed in parallel to other requests.
         */
        template
        Model::UpdatePipelineStatusOutcomeCallable UpdatePipelineStatusCallable(const UpdatePipelineStatusRequestT& request) const
        {
            return SubmitCallable(&ElasticTranscoderClient::UpdatePipelineStatus, request);
        }
        /**
         * An Async wrapper for UpdatePipelineStatus that queues the request into a thread executor and triggers associated callback when operation has finished.
         */
        template
        void UpdatePipelineStatusAsync(const UpdatePipelineStatusRequestT& request, const UpdatePipelineStatusResponseReceivedHandler& handler, const std::shared_ptr& context = nullptr) const
        {
            return SubmitAsync(&ElasticTranscoderClient::UpdatePipelineStatus, request, handler, context);
        }
      void OverrideEndpoint(const Aws::String& endpoint);
      std::shared_ptr& accessEndpointProvider();
    private:
      friend class Aws::Client::ClientWithAsyncTemplateMethods;
      void init(const ElasticTranscoderClientConfiguration& clientConfiguration);
      ElasticTranscoderClientConfiguration m_clientConfiguration;
      std::shared_ptr m_executor;
      std::shared_ptr m_endpointProvider;
  };
} // namespace ElasticTranscoder
} // namespace Aws