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

#pragma once
#include <aws/elasticache/ElastiCache_EXPORTS.h>
#include <aws/core/utils/memory/stl/AWSStreamFwd.h>
#include <aws/core/utils/memory/stl/AWSString.h>
#include <aws/elasticache/model/NodeUpdateStatus.h>
#include <aws/core/utils/DateTime.h>
#include <aws/elasticache/model/NodeUpdateInitiatedBy.h>
#include <utility>

namespace Aws
{
namespace Utils
{
namespace Xml
{
  class XmlNode;
} // namespace Xml
} // namespace Utils
namespace ElastiCache
{
namespace Model
{

  /**
   * <p>The status of the service update on the node group member </p><p><h3>See
   * Also:</h3>   <a
   * href="http://docs.aws.amazon.com/goto/WebAPI/elasticache-2015-02-02/NodeGroupMemberUpdateStatus">AWS
   * API Reference</a></p>
   */
  class NodeGroupMemberUpdateStatus
  {
  public:
    AWS_ELASTICACHE_API NodeGroupMemberUpdateStatus();
    AWS_ELASTICACHE_API NodeGroupMemberUpdateStatus(const Aws::Utils::Xml::XmlNode& xmlNode);
    AWS_ELASTICACHE_API NodeGroupMemberUpdateStatus& operator=(const Aws::Utils::Xml::XmlNode& xmlNode);

    AWS_ELASTICACHE_API void OutputToStream(Aws::OStream& ostream, const char* location, unsigned index, const char* locationValue) const;
    AWS_ELASTICACHE_API void OutputToStream(Aws::OStream& oStream, const char* location) const;


    /**
     * <p>The cache cluster ID</p>
     */
    inline const Aws::String& GetCacheClusterId() const{ return m_cacheClusterId; }

    /**
     * <p>The cache cluster ID</p>
     */
    inline bool CacheClusterIdHasBeenSet() const { return m_cacheClusterIdHasBeenSet; }

    /**
     * <p>The cache cluster ID</p>
     */
    inline void SetCacheClusterId(const Aws::String& value) { m_cacheClusterIdHasBeenSet = true; m_cacheClusterId = value; }

    /**
     * <p>The cache cluster ID</p>
     */
    inline void SetCacheClusterId(Aws::String&& value) { m_cacheClusterIdHasBeenSet = true; m_cacheClusterId = std::move(value); }

    /**
     * <p>The cache cluster ID</p>
     */
    inline void SetCacheClusterId(const char* value) { m_cacheClusterIdHasBeenSet = true; m_cacheClusterId.assign(value); }

    /**
     * <p>The cache cluster ID</p>
     */
    inline NodeGroupMemberUpdateStatus& WithCacheClusterId(const Aws::String& value) { SetCacheClusterId(value); return *this;}

    /**
     * <p>The cache cluster ID</p>
     */
    inline NodeGroupMemberUpdateStatus& WithCacheClusterId(Aws::String&& value) { SetCacheClusterId(std::move(value)); return *this;}

    /**
     * <p>The cache cluster ID</p>
     */
    inline NodeGroupMemberUpdateStatus& WithCacheClusterId(const char* value) { SetCacheClusterId(value); return *this;}


    /**
     * <p>The node ID of the cache cluster</p>
     */
    inline const Aws::String& GetCacheNodeId() const{ return m_cacheNodeId; }

    /**
     * <p>The node ID of the cache cluster</p>
     */
    inline bool CacheNodeIdHasBeenSet() const { return m_cacheNodeIdHasBeenSet; }

    /**
     * <p>The node ID of the cache cluster</p>
     */
    inline void SetCacheNodeId(const Aws::String& value) { m_cacheNodeIdHasBeenSet = true; m_cacheNodeId = value; }

    /**
     * <p>The node ID of the cache cluster</p>
     */
    inline void SetCacheNodeId(Aws::String&& value) { m_cacheNodeIdHasBeenSet = true; m_cacheNodeId = std::move(value); }

    /**
     * <p>The node ID of the cache cluster</p>
     */
    inline void SetCacheNodeId(const char* value) { m_cacheNodeIdHasBeenSet = true; m_cacheNodeId.assign(value); }

    /**
     * <p>The node ID of the cache cluster</p>
     */
    inline NodeGroupMemberUpdateStatus& WithCacheNodeId(const Aws::String& value) { SetCacheNodeId(value); return *this;}

    /**
     * <p>The node ID of the cache cluster</p>
     */
    inline NodeGroupMemberUpdateStatus& WithCacheNodeId(Aws::String&& value) { SetCacheNodeId(std::move(value)); return *this;}

    /**
     * <p>The node ID of the cache cluster</p>
     */
    inline NodeGroupMemberUpdateStatus& WithCacheNodeId(const char* value) { SetCacheNodeId(value); return *this;}


    /**
     * <p>The update status of the node</p>
     */
    inline const NodeUpdateStatus& GetNodeUpdateStatus() const{ return m_nodeUpdateStatus; }

    /**
     * <p>The update status of the node</p>
     */
    inline bool NodeUpdateStatusHasBeenSet() const { return m_nodeUpdateStatusHasBeenSet; }

    /**
     * <p>The update status of the node</p>
     */
    inline void SetNodeUpdateStatus(const NodeUpdateStatus& value) { m_nodeUpdateStatusHasBeenSet = true; m_nodeUpdateStatus = value; }

    /**
     * <p>The update status of the node</p>
     */
    inline void SetNodeUpdateStatus(NodeUpdateStatus&& value) { m_nodeUpdateStatusHasBeenSet = true; m_nodeUpdateStatus = std::move(value); }

    /**
     * <p>The update status of the node</p>
     */
    inline NodeGroupMemberUpdateStatus& WithNodeUpdateStatus(const NodeUpdateStatus& value) { SetNodeUpdateStatus(value); return *this;}

    /**
     * <p>The update status of the node</p>
     */
    inline NodeGroupMemberUpdateStatus& WithNodeUpdateStatus(NodeUpdateStatus&& value) { SetNodeUpdateStatus(std::move(value)); return *this;}


    /**
     * <p>The deletion date of the node</p>
     */
    inline const Aws::Utils::DateTime& GetNodeDeletionDate() const{ return m_nodeDeletionDate; }

    /**
     * <p>The deletion date of the node</p>
     */
    inline bool NodeDeletionDateHasBeenSet() const { return m_nodeDeletionDateHasBeenSet; }

    /**
     * <p>The deletion date of the node</p>
     */
    inline void SetNodeDeletionDate(const Aws::Utils::DateTime& value) { m_nodeDeletionDateHasBeenSet = true; m_nodeDeletionDate = value; }

    /**
     * <p>The deletion date of the node</p>
     */
    inline void SetNodeDeletionDate(Aws::Utils::DateTime&& value) { m_nodeDeletionDateHasBeenSet = true; m_nodeDeletionDate = std::move(value); }

    /**
     * <p>The deletion date of the node</p>
     */
    inline NodeGroupMemberUpdateStatus& WithNodeDeletionDate(const Aws::Utils::DateTime& value) { SetNodeDeletionDate(value); return *this;}

    /**
     * <p>The deletion date of the node</p>
     */
    inline NodeGroupMemberUpdateStatus& WithNodeDeletionDate(Aws::Utils::DateTime&& value) { SetNodeDeletionDate(std::move(value)); return *this;}


    /**
     * <p>The start date of the update for a node</p>
     */
    inline const Aws::Utils::DateTime& GetNodeUpdateStartDate() const{ return m_nodeUpdateStartDate; }

    /**
     * <p>The start date of the update for a node</p>
     */
    inline bool NodeUpdateStartDateHasBeenSet() const { return m_nodeUpdateStartDateHasBeenSet; }

    /**
     * <p>The start date of the update for a node</p>
     */
    inline void SetNodeUpdateStartDate(const Aws::Utils::DateTime& value) { m_nodeUpdateStartDateHasBeenSet = true; m_nodeUpdateStartDate = value; }

    /**
     * <p>The start date of the update for a node</p>
     */
    inline void SetNodeUpdateStartDate(Aws::Utils::DateTime&& value) { m_nodeUpdateStartDateHasBeenSet = true; m_nodeUpdateStartDate = std::move(value); }

    /**
     * <p>The start date of the update for a node</p>
     */
    inline NodeGroupMemberUpdateStatus& WithNodeUpdateStartDate(const Aws::Utils::DateTime& value) { SetNodeUpdateStartDate(value); return *this;}

    /**
     * <p>The start date of the update for a node</p>
     */
    inline NodeGroupMemberUpdateStatus& WithNodeUpdateStartDate(Aws::Utils::DateTime&& value) { SetNodeUpdateStartDate(std::move(value)); return *this;}


    /**
     * <p>The end date of the update for a node</p>
     */
    inline const Aws::Utils::DateTime& GetNodeUpdateEndDate() const{ return m_nodeUpdateEndDate; }

    /**
     * <p>The end date of the update for a node</p>
     */
    inline bool NodeUpdateEndDateHasBeenSet() const { return m_nodeUpdateEndDateHasBeenSet; }

    /**
     * <p>The end date of the update for a node</p>
     */
    inline void SetNodeUpdateEndDate(const Aws::Utils::DateTime& value) { m_nodeUpdateEndDateHasBeenSet = true; m_nodeUpdateEndDate = value; }

    /**
     * <p>The end date of the update for a node</p>
     */
    inline void SetNodeUpdateEndDate(Aws::Utils::DateTime&& value) { m_nodeUpdateEndDateHasBeenSet = true; m_nodeUpdateEndDate = std::move(value); }

    /**
     * <p>The end date of the update for a node</p>
     */
    inline NodeGroupMemberUpdateStatus& WithNodeUpdateEndDate(const Aws::Utils::DateTime& value) { SetNodeUpdateEndDate(value); return *this;}

    /**
     * <p>The end date of the update for a node</p>
     */
    inline NodeGroupMemberUpdateStatus& WithNodeUpdateEndDate(Aws::Utils::DateTime&& value) { SetNodeUpdateEndDate(std::move(value)); return *this;}


    /**
     * <p>Reflects whether the update was initiated by the customer or automatically
     * applied</p>
     */
    inline const NodeUpdateInitiatedBy& GetNodeUpdateInitiatedBy() const{ return m_nodeUpdateInitiatedBy; }

    /**
     * <p>Reflects whether the update was initiated by the customer or automatically
     * applied</p>
     */
    inline bool NodeUpdateInitiatedByHasBeenSet() const { return m_nodeUpdateInitiatedByHasBeenSet; }

    /**
     * <p>Reflects whether the update was initiated by the customer or automatically
     * applied</p>
     */
    inline void SetNodeUpdateInitiatedBy(const NodeUpdateInitiatedBy& value) { m_nodeUpdateInitiatedByHasBeenSet = true; m_nodeUpdateInitiatedBy = value; }

    /**
     * <p>Reflects whether the update was initiated by the customer or automatically
     * applied</p>
     */
    inline void SetNodeUpdateInitiatedBy(NodeUpdateInitiatedBy&& value) { m_nodeUpdateInitiatedByHasBeenSet = true; m_nodeUpdateInitiatedBy = std::move(value); }

    /**
     * <p>Reflects whether the update was initiated by the customer or automatically
     * applied</p>
     */
    inline NodeGroupMemberUpdateStatus& WithNodeUpdateInitiatedBy(const NodeUpdateInitiatedBy& value) { SetNodeUpdateInitiatedBy(value); return *this;}

    /**
     * <p>Reflects whether the update was initiated by the customer or automatically
     * applied</p>
     */
    inline NodeGroupMemberUpdateStatus& WithNodeUpdateInitiatedBy(NodeUpdateInitiatedBy&& value) { SetNodeUpdateInitiatedBy(std::move(value)); return *this;}


    /**
     * <p>The date when the update is triggered</p>
     */
    inline const Aws::Utils::DateTime& GetNodeUpdateInitiatedDate() const{ return m_nodeUpdateInitiatedDate; }

    /**
     * <p>The date when the update is triggered</p>
     */
    inline bool NodeUpdateInitiatedDateHasBeenSet() const { return m_nodeUpdateInitiatedDateHasBeenSet; }

    /**
     * <p>The date when the update is triggered</p>
     */
    inline void SetNodeUpdateInitiatedDate(const Aws::Utils::DateTime& value) { m_nodeUpdateInitiatedDateHasBeenSet = true; m_nodeUpdateInitiatedDate = value; }

    /**
     * <p>The date when the update is triggered</p>
     */
    inline void SetNodeUpdateInitiatedDate(Aws::Utils::DateTime&& value) { m_nodeUpdateInitiatedDateHasBeenSet = true; m_nodeUpdateInitiatedDate = std::move(value); }

    /**
     * <p>The date when the update is triggered</p>
     */
    inline NodeGroupMemberUpdateStatus& WithNodeUpdateInitiatedDate(const Aws::Utils::DateTime& value) { SetNodeUpdateInitiatedDate(value); return *this;}

    /**
     * <p>The date when the update is triggered</p>
     */
    inline NodeGroupMemberUpdateStatus& WithNodeUpdateInitiatedDate(Aws::Utils::DateTime&& value) { SetNodeUpdateInitiatedDate(std::move(value)); return *this;}


    /**
     * <p>The date when the NodeUpdateStatus was last modified</p>
     */
    inline const Aws::Utils::DateTime& GetNodeUpdateStatusModifiedDate() const{ return m_nodeUpdateStatusModifiedDate; }

    /**
     * <p>The date when the NodeUpdateStatus was last modified</p>
     */
    inline bool NodeUpdateStatusModifiedDateHasBeenSet() const { return m_nodeUpdateStatusModifiedDateHasBeenSet; }

    /**
     * <p>The date when the NodeUpdateStatus was last modified</p>
     */
    inline void SetNodeUpdateStatusModifiedDate(const Aws::Utils::DateTime& value) { m_nodeUpdateStatusModifiedDateHasBeenSet = true; m_nodeUpdateStatusModifiedDate = value; }

    /**
     * <p>The date when the NodeUpdateStatus was last modified</p>
     */
    inline void SetNodeUpdateStatusModifiedDate(Aws::Utils::DateTime&& value) { m_nodeUpdateStatusModifiedDateHasBeenSet = true; m_nodeUpdateStatusModifiedDate = std::move(value); }

    /**
     * <p>The date when the NodeUpdateStatus was last modified</p>
     */
    inline NodeGroupMemberUpdateStatus& WithNodeUpdateStatusModifiedDate(const Aws::Utils::DateTime& value) { SetNodeUpdateStatusModifiedDate(value); return *this;}

    /**
     * <p>The date when the NodeUpdateStatus was last modified</p>
     */
    inline NodeGroupMemberUpdateStatus& WithNodeUpdateStatusModifiedDate(Aws::Utils::DateTime&& value) { SetNodeUpdateStatusModifiedDate(std::move(value)); return *this;}

  private:

    Aws::String m_cacheClusterId;
    bool m_cacheClusterIdHasBeenSet = false;

    Aws::String m_cacheNodeId;
    bool m_cacheNodeIdHasBeenSet = false;

    NodeUpdateStatus m_nodeUpdateStatus;
    bool m_nodeUpdateStatusHasBeenSet = false;

    Aws::Utils::DateTime m_nodeDeletionDate;
    bool m_nodeDeletionDateHasBeenSet = false;

    Aws::Utils::DateTime m_nodeUpdateStartDate;
    bool m_nodeUpdateStartDateHasBeenSet = false;

    Aws::Utils::DateTime m_nodeUpdateEndDate;
    bool m_nodeUpdateEndDateHasBeenSet = false;

    NodeUpdateInitiatedBy m_nodeUpdateInitiatedBy;
    bool m_nodeUpdateInitiatedByHasBeenSet = false;

    Aws::Utils::DateTime m_nodeUpdateInitiatedDate;
    bool m_nodeUpdateInitiatedDateHasBeenSet = false;

    Aws::Utils::DateTime m_nodeUpdateStatusModifiedDate;
    bool m_nodeUpdateStatusModifiedDateHasBeenSet = false;
  };

} // namespace Model
} // namespace ElastiCache
} // namespace Aws