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

#pragma once
#include <aws/omics/Omics_EXPORTS.h>
#include <aws/omics/OmicsRequest.h>
#include <aws/core/utils/memory/stl/AWSString.h>
#include <aws/omics/model/WorkflowEngine.h>
#include <aws/core/utils/Array.h>
#include <aws/core/utils/memory/stl/AWSMap.h>
#include <aws/omics/model/Accelerators.h>
#include <aws/omics/model/WorkflowParameter.h>
#include <utility>
#include <aws/core/utils/UUID.h>

namespace Aws
{
namespace Omics
{
namespace Model
{

  /**
   */
  class CreateWorkflowRequest : public OmicsRequest
  {
  public:
    AWS_OMICS_API CreateWorkflowRequest();

    // Service request name is the Operation name which will send this request out,
    // each operation should has unique request name, so that we can get operation's name from this request.
    // Note: this is not true for response, multiple operations may have the same response name,
    // so we can not get operation's name from response.
    inline virtual const char* GetServiceRequestName() const override { return "CreateWorkflow"; }

    AWS_OMICS_API Aws::String SerializePayload() const override;


    /**
     * <p>A name for the workflow.</p>
     */
    inline const Aws::String& GetName() const{ return m_name; }

    /**
     * <p>A name for the workflow.</p>
     */
    inline bool NameHasBeenSet() const { return m_nameHasBeenSet; }

    /**
     * <p>A name for the workflow.</p>
     */
    inline void SetName(const Aws::String& value) { m_nameHasBeenSet = true; m_name = value; }

    /**
     * <p>A name for the workflow.</p>
     */
    inline void SetName(Aws::String&& value) { m_nameHasBeenSet = true; m_name = std::move(value); }

    /**
     * <p>A name for the workflow.</p>
     */
    inline void SetName(const char* value) { m_nameHasBeenSet = true; m_name.assign(value); }

    /**
     * <p>A name for the workflow.</p>
     */
    inline CreateWorkflowRequest& WithName(const Aws::String& value) { SetName(value); return *this;}

    /**
     * <p>A name for the workflow.</p>
     */
    inline CreateWorkflowRequest& WithName(Aws::String&& value) { SetName(std::move(value)); return *this;}

    /**
     * <p>A name for the workflow.</p>
     */
    inline CreateWorkflowRequest& WithName(const char* value) { SetName(value); return *this;}


    /**
     * <p>A description for the workflow.</p>
     */
    inline const Aws::String& GetDescription() const{ return m_description; }

    /**
     * <p>A description for the workflow.</p>
     */
    inline bool DescriptionHasBeenSet() const { return m_descriptionHasBeenSet; }

    /**
     * <p>A description for the workflow.</p>
     */
    inline void SetDescription(const Aws::String& value) { m_descriptionHasBeenSet = true; m_description = value; }

    /**
     * <p>A description for the workflow.</p>
     */
    inline void SetDescription(Aws::String&& value) { m_descriptionHasBeenSet = true; m_description = std::move(value); }

    /**
     * <p>A description for the workflow.</p>
     */
    inline void SetDescription(const char* value) { m_descriptionHasBeenSet = true; m_description.assign(value); }

    /**
     * <p>A description for the workflow.</p>
     */
    inline CreateWorkflowRequest& WithDescription(const Aws::String& value) { SetDescription(value); return *this;}

    /**
     * <p>A description for the workflow.</p>
     */
    inline CreateWorkflowRequest& WithDescription(Aws::String&& value) { SetDescription(std::move(value)); return *this;}

    /**
     * <p>A description for the workflow.</p>
     */
    inline CreateWorkflowRequest& WithDescription(const char* value) { SetDescription(value); return *this;}


    /**
     * <p>An engine for the workflow.</p>
     */
    inline const WorkflowEngine& GetEngine() const{ return m_engine; }

    /**
     * <p>An engine for the workflow.</p>
     */
    inline bool EngineHasBeenSet() const { return m_engineHasBeenSet; }

    /**
     * <p>An engine for the workflow.</p>
     */
    inline void SetEngine(const WorkflowEngine& value) { m_engineHasBeenSet = true; m_engine = value; }

    /**
     * <p>An engine for the workflow.</p>
     */
    inline void SetEngine(WorkflowEngine&& value) { m_engineHasBeenSet = true; m_engine = std::move(value); }

    /**
     * <p>An engine for the workflow.</p>
     */
    inline CreateWorkflowRequest& WithEngine(const WorkflowEngine& value) { SetEngine(value); return *this;}

    /**
     * <p>An engine for the workflow.</p>
     */
    inline CreateWorkflowRequest& WithEngine(WorkflowEngine&& value) { SetEngine(std::move(value)); return *this;}


    /**
     * <p>A ZIP archive for the workflow.</p>
     */
    inline const Aws::Utils::ByteBuffer& GetDefinitionZip() const{ return m_definitionZip; }

    /**
     * <p>A ZIP archive for the workflow.</p>
     */
    inline bool DefinitionZipHasBeenSet() const { return m_definitionZipHasBeenSet; }

    /**
     * <p>A ZIP archive for the workflow.</p>
     */
    inline void SetDefinitionZip(const Aws::Utils::ByteBuffer& value) { m_definitionZipHasBeenSet = true; m_definitionZip = value; }

    /**
     * <p>A ZIP archive for the workflow.</p>
     */
    inline void SetDefinitionZip(Aws::Utils::ByteBuffer&& value) { m_definitionZipHasBeenSet = true; m_definitionZip = std::move(value); }

    /**
     * <p>A ZIP archive for the workflow.</p>
     */
    inline CreateWorkflowRequest& WithDefinitionZip(const Aws::Utils::ByteBuffer& value) { SetDefinitionZip(value); return *this;}

    /**
     * <p>A ZIP archive for the workflow.</p>
     */
    inline CreateWorkflowRequest& WithDefinitionZip(Aws::Utils::ByteBuffer&& value) { SetDefinitionZip(std::move(value)); return *this;}


    /**
     * <p>The URI of a definition for the workflow.</p>
     */
    inline const Aws::String& GetDefinitionUri() const{ return m_definitionUri; }

    /**
     * <p>The URI of a definition for the workflow.</p>
     */
    inline bool DefinitionUriHasBeenSet() const { return m_definitionUriHasBeenSet; }

    /**
     * <p>The URI of a definition for the workflow.</p>
     */
    inline void SetDefinitionUri(const Aws::String& value) { m_definitionUriHasBeenSet = true; m_definitionUri = value; }

    /**
     * <p>The URI of a definition for the workflow.</p>
     */
    inline void SetDefinitionUri(Aws::String&& value) { m_definitionUriHasBeenSet = true; m_definitionUri = std::move(value); }

    /**
     * <p>The URI of a definition for the workflow.</p>
     */
    inline void SetDefinitionUri(const char* value) { m_definitionUriHasBeenSet = true; m_definitionUri.assign(value); }

    /**
     * <p>The URI of a definition for the workflow.</p>
     */
    inline CreateWorkflowRequest& WithDefinitionUri(const Aws::String& value) { SetDefinitionUri(value); return *this;}

    /**
     * <p>The URI of a definition for the workflow.</p>
     */
    inline CreateWorkflowRequest& WithDefinitionUri(Aws::String&& value) { SetDefinitionUri(std::move(value)); return *this;}

    /**
     * <p>The URI of a definition for the workflow.</p>
     */
    inline CreateWorkflowRequest& WithDefinitionUri(const char* value) { SetDefinitionUri(value); return *this;}


    /**
     * <p>The path of the main definition file for the workflow.</p>
     */
    inline const Aws::String& GetMain() const{ return m_main; }

    /**
     * <p>The path of the main definition file for the workflow.</p>
     */
    inline bool MainHasBeenSet() const { return m_mainHasBeenSet; }

    /**
     * <p>The path of the main definition file for the workflow.</p>
     */
    inline void SetMain(const Aws::String& value) { m_mainHasBeenSet = true; m_main = value; }

    /**
     * <p>The path of the main definition file for the workflow.</p>
     */
    inline void SetMain(Aws::String&& value) { m_mainHasBeenSet = true; m_main = std::move(value); }

    /**
     * <p>The path of the main definition file for the workflow.</p>
     */
    inline void SetMain(const char* value) { m_mainHasBeenSet = true; m_main.assign(value); }

    /**
     * <p>The path of the main definition file for the workflow.</p>
     */
    inline CreateWorkflowRequest& WithMain(const Aws::String& value) { SetMain(value); return *this;}

    /**
     * <p>The path of the main definition file for the workflow.</p>
     */
    inline CreateWorkflowRequest& WithMain(Aws::String&& value) { SetMain(std::move(value)); return *this;}

    /**
     * <p>The path of the main definition file for the workflow.</p>
     */
    inline CreateWorkflowRequest& WithMain(const char* value) { SetMain(value); return *this;}


    /**
     * <p>A parameter template for the workflow.</p>
     */
    inline const Aws::Map<Aws::String, WorkflowParameter>& GetParameterTemplate() const{ return m_parameterTemplate; }

    /**
     * <p>A parameter template for the workflow.</p>
     */
    inline bool ParameterTemplateHasBeenSet() const { return m_parameterTemplateHasBeenSet; }

    /**
     * <p>A parameter template for the workflow.</p>
     */
    inline void SetParameterTemplate(const Aws::Map<Aws::String, WorkflowParameter>& value) { m_parameterTemplateHasBeenSet = true; m_parameterTemplate = value; }

    /**
     * <p>A parameter template for the workflow.</p>
     */
    inline void SetParameterTemplate(Aws::Map<Aws::String, WorkflowParameter>&& value) { m_parameterTemplateHasBeenSet = true; m_parameterTemplate = std::move(value); }

    /**
     * <p>A parameter template for the workflow.</p>
     */
    inline CreateWorkflowRequest& WithParameterTemplate(const Aws::Map<Aws::String, WorkflowParameter>& value) { SetParameterTemplate(value); return *this;}

    /**
     * <p>A parameter template for the workflow.</p>
     */
    inline CreateWorkflowRequest& WithParameterTemplate(Aws::Map<Aws::String, WorkflowParameter>&& value) { SetParameterTemplate(std::move(value)); return *this;}

    /**
     * <p>A parameter template for the workflow.</p>
     */
    inline CreateWorkflowRequest& AddParameterTemplate(const Aws::String& key, const WorkflowParameter& value) { m_parameterTemplateHasBeenSet = true; m_parameterTemplate.emplace(key, value); return *this; }

    /**
     * <p>A parameter template for the workflow.</p>
     */
    inline CreateWorkflowRequest& AddParameterTemplate(Aws::String&& key, const WorkflowParameter& value) { m_parameterTemplateHasBeenSet = true; m_parameterTemplate.emplace(std::move(key), value); return *this; }

    /**
     * <p>A parameter template for the workflow.</p>
     */
    inline CreateWorkflowRequest& AddParameterTemplate(const Aws::String& key, WorkflowParameter&& value) { m_parameterTemplateHasBeenSet = true; m_parameterTemplate.emplace(key, std::move(value)); return *this; }

    /**
     * <p>A parameter template for the workflow.</p>
     */
    inline CreateWorkflowRequest& AddParameterTemplate(Aws::String&& key, WorkflowParameter&& value) { m_parameterTemplateHasBeenSet = true; m_parameterTemplate.emplace(std::move(key), std::move(value)); return *this; }

    /**
     * <p>A parameter template for the workflow.</p>
     */
    inline CreateWorkflowRequest& AddParameterTemplate(const char* key, WorkflowParameter&& value) { m_parameterTemplateHasBeenSet = true; m_parameterTemplate.emplace(key, std::move(value)); return *this; }

    /**
     * <p>A parameter template for the workflow.</p>
     */
    inline CreateWorkflowRequest& AddParameterTemplate(const char* key, const WorkflowParameter& value) { m_parameterTemplateHasBeenSet = true; m_parameterTemplate.emplace(key, value); return *this; }


    /**
     * <p>A storage capacity for the workflow in gigabytes.</p>
     */
    inline int GetStorageCapacity() const{ return m_storageCapacity; }

    /**
     * <p>A storage capacity for the workflow in gigabytes.</p>
     */
    inline bool StorageCapacityHasBeenSet() const { return m_storageCapacityHasBeenSet; }

    /**
     * <p>A storage capacity for the workflow in gigabytes.</p>
     */
    inline void SetStorageCapacity(int value) { m_storageCapacityHasBeenSet = true; m_storageCapacity = value; }

    /**
     * <p>A storage capacity for the workflow in gigabytes.</p>
     */
    inline CreateWorkflowRequest& WithStorageCapacity(int value) { SetStorageCapacity(value); return *this;}


    /**
     * <p>Tags for the workflow.</p>
     */
    inline const Aws::Map<Aws::String, Aws::String>& GetTags() const{ return m_tags; }

    /**
     * <p>Tags for the workflow.</p>
     */
    inline bool TagsHasBeenSet() const { return m_tagsHasBeenSet; }

    /**
     * <p>Tags for the workflow.</p>
     */
    inline void SetTags(const Aws::Map<Aws::String, Aws::String>& value) { m_tagsHasBeenSet = true; m_tags = value; }

    /**
     * <p>Tags for the workflow.</p>
     */
    inline void SetTags(Aws::Map<Aws::String, Aws::String>&& value) { m_tagsHasBeenSet = true; m_tags = std::move(value); }

    /**
     * <p>Tags for the workflow.</p>
     */
    inline CreateWorkflowRequest& WithTags(const Aws::Map<Aws::String, Aws::String>& value) { SetTags(value); return *this;}

    /**
     * <p>Tags for the workflow.</p>
     */
    inline CreateWorkflowRequest& WithTags(Aws::Map<Aws::String, Aws::String>&& value) { SetTags(std::move(value)); return *this;}

    /**
     * <p>Tags for the workflow.</p>
     */
    inline CreateWorkflowRequest& AddTags(const Aws::String& key, const Aws::String& value) { m_tagsHasBeenSet = true; m_tags.emplace(key, value); return *this; }

    /**
     * <p>Tags for the workflow.</p>
     */
    inline CreateWorkflowRequest& AddTags(Aws::String&& key, const Aws::String& value) { m_tagsHasBeenSet = true; m_tags.emplace(std::move(key), value); return *this; }

    /**
     * <p>Tags for the workflow.</p>
     */
    inline CreateWorkflowRequest& AddTags(const Aws::String& key, Aws::String&& value) { m_tagsHasBeenSet = true; m_tags.emplace(key, std::move(value)); return *this; }

    /**
     * <p>Tags for the workflow.</p>
     */
    inline CreateWorkflowRequest& AddTags(Aws::String&& key, Aws::String&& value) { m_tagsHasBeenSet = true; m_tags.emplace(std::move(key), std::move(value)); return *this; }

    /**
     * <p>Tags for the workflow.</p>
     */
    inline CreateWorkflowRequest& AddTags(const char* key, Aws::String&& value) { m_tagsHasBeenSet = true; m_tags.emplace(key, std::move(value)); return *this; }

    /**
     * <p>Tags for the workflow.</p>
     */
    inline CreateWorkflowRequest& AddTags(Aws::String&& key, const char* value) { m_tagsHasBeenSet = true; m_tags.emplace(std::move(key), value); return *this; }

    /**
     * <p>Tags for the workflow.</p>
     */
    inline CreateWorkflowRequest& AddTags(const char* key, const char* value) { m_tagsHasBeenSet = true; m_tags.emplace(key, value); return *this; }


    /**
     * <p>To ensure that requests don't run multiple times, specify a unique ID for
     * each request.</p>
     */
    inline const Aws::String& GetRequestId() const{ return m_requestId; }

    /**
     * <p>To ensure that requests don't run multiple times, specify a unique ID for
     * each request.</p>
     */
    inline bool RequestIdHasBeenSet() const { return m_requestIdHasBeenSet; }

    /**
     * <p>To ensure that requests don't run multiple times, specify a unique ID for
     * each request.</p>
     */
    inline void SetRequestId(const Aws::String& value) { m_requestIdHasBeenSet = true; m_requestId = value; }

    /**
     * <p>To ensure that requests don't run multiple times, specify a unique ID for
     * each request.</p>
     */
    inline void SetRequestId(Aws::String&& value) { m_requestIdHasBeenSet = true; m_requestId = std::move(value); }

    /**
     * <p>To ensure that requests don't run multiple times, specify a unique ID for
     * each request.</p>
     */
    inline void SetRequestId(const char* value) { m_requestIdHasBeenSet = true; m_requestId.assign(value); }

    /**
     * <p>To ensure that requests don't run multiple times, specify a unique ID for
     * each request.</p>
     */
    inline CreateWorkflowRequest& WithRequestId(const Aws::String& value) { SetRequestId(value); return *this;}

    /**
     * <p>To ensure that requests don't run multiple times, specify a unique ID for
     * each request.</p>
     */
    inline CreateWorkflowRequest& WithRequestId(Aws::String&& value) { SetRequestId(std::move(value)); return *this;}

    /**
     * <p>To ensure that requests don't run multiple times, specify a unique ID for
     * each request.</p>
     */
    inline CreateWorkflowRequest& WithRequestId(const char* value) { SetRequestId(value); return *this;}


    /**
     * <p> The computational accelerator specified to run the workflow. </p>
     */
    inline const Accelerators& GetAccelerators() const{ return m_accelerators; }

    /**
     * <p> The computational accelerator specified to run the workflow. </p>
     */
    inline bool AcceleratorsHasBeenSet() const { return m_acceleratorsHasBeenSet; }

    /**
     * <p> The computational accelerator specified to run the workflow. </p>
     */
    inline void SetAccelerators(const Accelerators& value) { m_acceleratorsHasBeenSet = true; m_accelerators = value; }

    /**
     * <p> The computational accelerator specified to run the workflow. </p>
     */
    inline void SetAccelerators(Accelerators&& value) { m_acceleratorsHasBeenSet = true; m_accelerators = std::move(value); }

    /**
     * <p> The computational accelerator specified to run the workflow. </p>
     */
    inline CreateWorkflowRequest& WithAccelerators(const Accelerators& value) { SetAccelerators(value); return *this;}

    /**
     * <p> The computational accelerator specified to run the workflow. </p>
     */
    inline CreateWorkflowRequest& WithAccelerators(Accelerators&& value) { SetAccelerators(std::move(value)); return *this;}

  private:

    Aws::String m_name;
    bool m_nameHasBeenSet = false;

    Aws::String m_description;
    bool m_descriptionHasBeenSet = false;

    WorkflowEngine m_engine;
    bool m_engineHasBeenSet = false;

    Aws::Utils::ByteBuffer m_definitionZip;
    bool m_definitionZipHasBeenSet = false;

    Aws::String m_definitionUri;
    bool m_definitionUriHasBeenSet = false;

    Aws::String m_main;
    bool m_mainHasBeenSet = false;

    Aws::Map<Aws::String, WorkflowParameter> m_parameterTemplate;
    bool m_parameterTemplateHasBeenSet = false;

    int m_storageCapacity;
    bool m_storageCapacityHasBeenSet = false;

    Aws::Map<Aws::String, Aws::String> m_tags;
    bool m_tagsHasBeenSet = false;

    Aws::String m_requestId;
    bool m_requestIdHasBeenSet = false;

    Accelerators m_accelerators;
    bool m_acceleratorsHasBeenSet = false;
  };

} // namespace Model
} // namespace Omics
} // namespace Aws