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

#pragma once
#include <aws/emr-containers/EMRContainers_EXPORTS.h>
#include <aws/core/utils/memory/stl/AWSString.h>
#include <aws/emr-containers/model/ParametricConfigurationOverrides.h>
#include <aws/emr-containers/model/JobDriver.h>
#include <aws/core/utils/memory/stl/AWSMap.h>
#include <aws/emr-containers/model/TemplateParameterConfiguration.h>
#include <utility>

namespace Aws
{
namespace Utils
{
namespace Json
{
  class JsonValue;
  class JsonView;
} // namespace Json
} // namespace Utils
namespace EMRContainers
{
namespace Model
{

  /**
   * <p>The values of StartJobRun API requests used in job runs started using the job
   * template.</p><p><h3>See Also:</h3>   <a
   * href="http://docs.aws.amazon.com/goto/WebAPI/emr-containers-2020-10-01/JobTemplateData">AWS
   * API Reference</a></p>
   */
  class JobTemplateData
  {
  public:
    AWS_EMRCONTAINERS_API JobTemplateData();
    AWS_EMRCONTAINERS_API JobTemplateData(Aws::Utils::Json::JsonView jsonValue);
    AWS_EMRCONTAINERS_API JobTemplateData& operator=(Aws::Utils::Json::JsonView jsonValue);
    AWS_EMRCONTAINERS_API Aws::Utils::Json::JsonValue Jsonize() const;


    /**
     * <p>The execution role ARN of the job run.</p>
     */
    inline const Aws::String& GetExecutionRoleArn() const{ return m_executionRoleArn; }

    /**
     * <p>The execution role ARN of the job run.</p>
     */
    inline bool ExecutionRoleArnHasBeenSet() const { return m_executionRoleArnHasBeenSet; }

    /**
     * <p>The execution role ARN of the job run.</p>
     */
    inline void SetExecutionRoleArn(const Aws::String& value) { m_executionRoleArnHasBeenSet = true; m_executionRoleArn = value; }

    /**
     * <p>The execution role ARN of the job run.</p>
     */
    inline void SetExecutionRoleArn(Aws::String&& value) { m_executionRoleArnHasBeenSet = true; m_executionRoleArn = std::move(value); }

    /**
     * <p>The execution role ARN of the job run.</p>
     */
    inline void SetExecutionRoleArn(const char* value) { m_executionRoleArnHasBeenSet = true; m_executionRoleArn.assign(value); }

    /**
     * <p>The execution role ARN of the job run.</p>
     */
    inline JobTemplateData& WithExecutionRoleArn(const Aws::String& value) { SetExecutionRoleArn(value); return *this;}

    /**
     * <p>The execution role ARN of the job run.</p>
     */
    inline JobTemplateData& WithExecutionRoleArn(Aws::String&& value) { SetExecutionRoleArn(std::move(value)); return *this;}

    /**
     * <p>The execution role ARN of the job run.</p>
     */
    inline JobTemplateData& WithExecutionRoleArn(const char* value) { SetExecutionRoleArn(value); return *this;}


    /**
     * <p> The release version of Amazon EMR.</p>
     */
    inline const Aws::String& GetReleaseLabel() const{ return m_releaseLabel; }

    /**
     * <p> The release version of Amazon EMR.</p>
     */
    inline bool ReleaseLabelHasBeenSet() const { return m_releaseLabelHasBeenSet; }

    /**
     * <p> The release version of Amazon EMR.</p>
     */
    inline void SetReleaseLabel(const Aws::String& value) { m_releaseLabelHasBeenSet = true; m_releaseLabel = value; }

    /**
     * <p> The release version of Amazon EMR.</p>
     */
    inline void SetReleaseLabel(Aws::String&& value) { m_releaseLabelHasBeenSet = true; m_releaseLabel = std::move(value); }

    /**
     * <p> The release version of Amazon EMR.</p>
     */
    inline void SetReleaseLabel(const char* value) { m_releaseLabelHasBeenSet = true; m_releaseLabel.assign(value); }

    /**
     * <p> The release version of Amazon EMR.</p>
     */
    inline JobTemplateData& WithReleaseLabel(const Aws::String& value) { SetReleaseLabel(value); return *this;}

    /**
     * <p> The release version of Amazon EMR.</p>
     */
    inline JobTemplateData& WithReleaseLabel(Aws::String&& value) { SetReleaseLabel(std::move(value)); return *this;}

    /**
     * <p> The release version of Amazon EMR.</p>
     */
    inline JobTemplateData& WithReleaseLabel(const char* value) { SetReleaseLabel(value); return *this;}


    /**
     * <p> The configuration settings that are used to override defaults
     * configuration.</p>
     */
    inline const ParametricConfigurationOverrides& GetConfigurationOverrides() const{ return m_configurationOverrides; }

    /**
     * <p> The configuration settings that are used to override defaults
     * configuration.</p>
     */
    inline bool ConfigurationOverridesHasBeenSet() const { return m_configurationOverridesHasBeenSet; }

    /**
     * <p> The configuration settings that are used to override defaults
     * configuration.</p>
     */
    inline void SetConfigurationOverrides(const ParametricConfigurationOverrides& value) { m_configurationOverridesHasBeenSet = true; m_configurationOverrides = value; }

    /**
     * <p> The configuration settings that are used to override defaults
     * configuration.</p>
     */
    inline void SetConfigurationOverrides(ParametricConfigurationOverrides&& value) { m_configurationOverridesHasBeenSet = true; m_configurationOverrides = std::move(value); }

    /**
     * <p> The configuration settings that are used to override defaults
     * configuration.</p>
     */
    inline JobTemplateData& WithConfigurationOverrides(const ParametricConfigurationOverrides& value) { SetConfigurationOverrides(value); return *this;}

    /**
     * <p> The configuration settings that are used to override defaults
     * configuration.</p>
     */
    inline JobTemplateData& WithConfigurationOverrides(ParametricConfigurationOverrides&& value) { SetConfigurationOverrides(std::move(value)); return *this;}


    
    inline const JobDriver& GetJobDriver() const{ return m_jobDriver; }

    
    inline bool JobDriverHasBeenSet() const { return m_jobDriverHasBeenSet; }

    
    inline void SetJobDriver(const JobDriver& value) { m_jobDriverHasBeenSet = true; m_jobDriver = value; }

    
    inline void SetJobDriver(JobDriver&& value) { m_jobDriverHasBeenSet = true; m_jobDriver = std::move(value); }

    
    inline JobTemplateData& WithJobDriver(const JobDriver& value) { SetJobDriver(value); return *this;}

    
    inline JobTemplateData& WithJobDriver(JobDriver&& value) { SetJobDriver(std::move(value)); return *this;}


    /**
     * <p>The configuration of parameters existing in the job template.</p>
     */
    inline const Aws::Map<Aws::String, TemplateParameterConfiguration>& GetParameterConfiguration() const{ return m_parameterConfiguration; }

    /**
     * <p>The configuration of parameters existing in the job template.</p>
     */
    inline bool ParameterConfigurationHasBeenSet() const { return m_parameterConfigurationHasBeenSet; }

    /**
     * <p>The configuration of parameters existing in the job template.</p>
     */
    inline void SetParameterConfiguration(const Aws::Map<Aws::String, TemplateParameterConfiguration>& value) { m_parameterConfigurationHasBeenSet = true; m_parameterConfiguration = value; }

    /**
     * <p>The configuration of parameters existing in the job template.</p>
     */
    inline void SetParameterConfiguration(Aws::Map<Aws::String, TemplateParameterConfiguration>&& value) { m_parameterConfigurationHasBeenSet = true; m_parameterConfiguration = std::move(value); }

    /**
     * <p>The configuration of parameters existing in the job template.</p>
     */
    inline JobTemplateData& WithParameterConfiguration(const Aws::Map<Aws::String, TemplateParameterConfiguration>& value) { SetParameterConfiguration(value); return *this;}

    /**
     * <p>The configuration of parameters existing in the job template.</p>
     */
    inline JobTemplateData& WithParameterConfiguration(Aws::Map<Aws::String, TemplateParameterConfiguration>&& value) { SetParameterConfiguration(std::move(value)); return *this;}

    /**
     * <p>The configuration of parameters existing in the job template.</p>
     */
    inline JobTemplateData& AddParameterConfiguration(const Aws::String& key, const TemplateParameterConfiguration& value) { m_parameterConfigurationHasBeenSet = true; m_parameterConfiguration.emplace(key, value); return *this; }

    /**
     * <p>The configuration of parameters existing in the job template.</p>
     */
    inline JobTemplateData& AddParameterConfiguration(Aws::String&& key, const TemplateParameterConfiguration& value) { m_parameterConfigurationHasBeenSet = true; m_parameterConfiguration.emplace(std::move(key), value); return *this; }

    /**
     * <p>The configuration of parameters existing in the job template.</p>
     */
    inline JobTemplateData& AddParameterConfiguration(const Aws::String& key, TemplateParameterConfiguration&& value) { m_parameterConfigurationHasBeenSet = true; m_parameterConfiguration.emplace(key, std::move(value)); return *this; }

    /**
     * <p>The configuration of parameters existing in the job template.</p>
     */
    inline JobTemplateData& AddParameterConfiguration(Aws::String&& key, TemplateParameterConfiguration&& value) { m_parameterConfigurationHasBeenSet = true; m_parameterConfiguration.emplace(std::move(key), std::move(value)); return *this; }

    /**
     * <p>The configuration of parameters existing in the job template.</p>
     */
    inline JobTemplateData& AddParameterConfiguration(const char* key, TemplateParameterConfiguration&& value) { m_parameterConfigurationHasBeenSet = true; m_parameterConfiguration.emplace(key, std::move(value)); return *this; }

    /**
     * <p>The configuration of parameters existing in the job template.</p>
     */
    inline JobTemplateData& AddParameterConfiguration(const char* key, const TemplateParameterConfiguration& value) { m_parameterConfigurationHasBeenSet = true; m_parameterConfiguration.emplace(key, value); return *this; }


    /**
     * <p>The tags assigned to jobs started using the job template.</p>
     */
    inline const Aws::Map<Aws::String, Aws::String>& GetJobTags() const{ return m_jobTags; }

    /**
     * <p>The tags assigned to jobs started using the job template.</p>
     */
    inline bool JobTagsHasBeenSet() const { return m_jobTagsHasBeenSet; }

    /**
     * <p>The tags assigned to jobs started using the job template.</p>
     */
    inline void SetJobTags(const Aws::Map<Aws::String, Aws::String>& value) { m_jobTagsHasBeenSet = true; m_jobTags = value; }

    /**
     * <p>The tags assigned to jobs started using the job template.</p>
     */
    inline void SetJobTags(Aws::Map<Aws::String, Aws::String>&& value) { m_jobTagsHasBeenSet = true; m_jobTags = std::move(value); }

    /**
     * <p>The tags assigned to jobs started using the job template.</p>
     */
    inline JobTemplateData& WithJobTags(const Aws::Map<Aws::String, Aws::String>& value) { SetJobTags(value); return *this;}

    /**
     * <p>The tags assigned to jobs started using the job template.</p>
     */
    inline JobTemplateData& WithJobTags(Aws::Map<Aws::String, Aws::String>&& value) { SetJobTags(std::move(value)); return *this;}

    /**
     * <p>The tags assigned to jobs started using the job template.</p>
     */
    inline JobTemplateData& AddJobTags(const Aws::String& key, const Aws::String& value) { m_jobTagsHasBeenSet = true; m_jobTags.emplace(key, value); return *this; }

    /**
     * <p>The tags assigned to jobs started using the job template.</p>
     */
    inline JobTemplateData& AddJobTags(Aws::String&& key, const Aws::String& value) { m_jobTagsHasBeenSet = true; m_jobTags.emplace(std::move(key), value); return *this; }

    /**
     * <p>The tags assigned to jobs started using the job template.</p>
     */
    inline JobTemplateData& AddJobTags(const Aws::String& key, Aws::String&& value) { m_jobTagsHasBeenSet = true; m_jobTags.emplace(key, std::move(value)); return *this; }

    /**
     * <p>The tags assigned to jobs started using the job template.</p>
     */
    inline JobTemplateData& AddJobTags(Aws::String&& key, Aws::String&& value) { m_jobTagsHasBeenSet = true; m_jobTags.emplace(std::move(key), std::move(value)); return *this; }

    /**
     * <p>The tags assigned to jobs started using the job template.</p>
     */
    inline JobTemplateData& AddJobTags(const char* key, Aws::String&& value) { m_jobTagsHasBeenSet = true; m_jobTags.emplace(key, std::move(value)); return *this; }

    /**
     * <p>The tags assigned to jobs started using the job template.</p>
     */
    inline JobTemplateData& AddJobTags(Aws::String&& key, const char* value) { m_jobTagsHasBeenSet = true; m_jobTags.emplace(std::move(key), value); return *this; }

    /**
     * <p>The tags assigned to jobs started using the job template.</p>
     */
    inline JobTemplateData& AddJobTags(const char* key, const char* value) { m_jobTagsHasBeenSet = true; m_jobTags.emplace(key, value); return *this; }

  private:

    Aws::String m_executionRoleArn;
    bool m_executionRoleArnHasBeenSet = false;

    Aws::String m_releaseLabel;
    bool m_releaseLabelHasBeenSet = false;

    ParametricConfigurationOverrides m_configurationOverrides;
    bool m_configurationOverridesHasBeenSet = false;

    JobDriver m_jobDriver;
    bool m_jobDriverHasBeenSet = false;

    Aws::Map<Aws::String, TemplateParameterConfiguration> m_parameterConfiguration;
    bool m_parameterConfigurationHasBeenSet = false;

    Aws::Map<Aws::String, Aws::String> m_jobTags;
    bool m_jobTagsHasBeenSet = false;
  };

} // namespace Model
} // namespace EMRContainers
} // namespace Aws