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

#pragma once
#include <aws/acm/ACM_EXPORTS.h>
#include <aws/core/utils/memory/stl/AWSString.h>
#include <aws/core/utils/memory/stl/AWSVector.h>
#include <aws/acm/model/DomainStatus.h>
#include <aws/acm/model/ResourceRecord.h>
#include <aws/acm/model/HttpRedirect.h>
#include <aws/acm/model/ValidationMethod.h>
#include <utility>

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

  /**
   * <p>Contains information about the validation of each domain name in the
   * certificate.</p><p><h3>See Also:</h3>   <a
   * href="http://docs.aws.amazon.com/goto/WebAPI/acm-2015-12-08/DomainValidation">AWS
   * API Reference</a></p>
   */
  class DomainValidation
  {
  public:
    AWS_ACM_API DomainValidation() = default;
    AWS_ACM_API DomainValidation(Aws::Utils::Json::JsonView jsonValue);
    AWS_ACM_API DomainValidation& operator=(Aws::Utils::Json::JsonView jsonValue);
    AWS_ACM_API Aws::Utils::Json::JsonValue Jsonize() const;


    ///@{
    /**
     * <p>A fully qualified domain name (FQDN) in the certificate. For example,
     * <code>www.example.com</code> or <code>example.com</code>. </p>
     */
    inline const Aws::String& GetDomainName() const { return m_domainName; }
    inline bool DomainNameHasBeenSet() const { return m_domainNameHasBeenSet; }
    template<typename DomainNameT = Aws::String>
    void SetDomainName(DomainNameT&& value) { m_domainNameHasBeenSet = true; m_domainName = std::forward<DomainNameT>(value); }
    template<typename DomainNameT = Aws::String>
    DomainValidation& WithDomainName(DomainNameT&& value) { SetDomainName(std::forward<DomainNameT>(value)); return *this;}
    ///@}

    ///@{
    /**
     * <p>A list of email addresses that ACM used to send domain validation emails.</p>
     */
    inline const Aws::Vector<Aws::String>& GetValidationEmails() const { return m_validationEmails; }
    inline bool ValidationEmailsHasBeenSet() const { return m_validationEmailsHasBeenSet; }
    template<typename ValidationEmailsT = Aws::Vector<Aws::String>>
    void SetValidationEmails(ValidationEmailsT&& value) { m_validationEmailsHasBeenSet = true; m_validationEmails = std::forward<ValidationEmailsT>(value); }
    template<typename ValidationEmailsT = Aws::Vector<Aws::String>>
    DomainValidation& WithValidationEmails(ValidationEmailsT&& value) { SetValidationEmails(std::forward<ValidationEmailsT>(value)); return *this;}
    template<typename ValidationEmailsT = Aws::String>
    DomainValidation& AddValidationEmails(ValidationEmailsT&& value) { m_validationEmailsHasBeenSet = true; m_validationEmails.emplace_back(std::forward<ValidationEmailsT>(value)); return *this; }
    ///@}

    ///@{
    /**
     * <p>The domain name that ACM used to send domain validation emails.</p>
     */
    inline const Aws::String& GetValidationDomain() const { return m_validationDomain; }
    inline bool ValidationDomainHasBeenSet() const { return m_validationDomainHasBeenSet; }
    template<typename ValidationDomainT = Aws::String>
    void SetValidationDomain(ValidationDomainT&& value) { m_validationDomainHasBeenSet = true; m_validationDomain = std::forward<ValidationDomainT>(value); }
    template<typename ValidationDomainT = Aws::String>
    DomainValidation& WithValidationDomain(ValidationDomainT&& value) { SetValidationDomain(std::forward<ValidationDomainT>(value)); return *this;}
    ///@}

    ///@{
    /**
     * <p>The validation status of the domain name. This can be one of the following
     * values:</p> <ul> <li> <p> <code>PENDING_VALIDATION</code> </p> </li> <li> <p>
     * <code/>SUCCESS</p> </li> <li> <p> <code/>FAILED</p> </li> </ul>
     */
    inline DomainStatus GetValidationStatus() const { return m_validationStatus; }
    inline bool ValidationStatusHasBeenSet() const { return m_validationStatusHasBeenSet; }
    inline void SetValidationStatus(DomainStatus value) { m_validationStatusHasBeenSet = true; m_validationStatus = value; }
    inline DomainValidation& WithValidationStatus(DomainStatus value) { SetValidationStatus(value); return *this;}
    ///@}

    ///@{
    /**
     * <p>Contains the CNAME record that you add to your DNS database for domain
     * validation. For more information, see <a
     * href="https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-validate-dns.html">Use
     * DNS to Validate Domain Ownership</a>.</p> <p>Note: The CNAME information that
     * you need does not include the name of your domain. If you include your domain
     * name in the DNS database CNAME record, validation fails. For example, if the
     * name is "_a79865eb4cd1a6ab990a45779b4e0b96.yourdomain.com", only
     * "_a79865eb4cd1a6ab990a45779b4e0b96" must be used.</p>
     */
    inline const ResourceRecord& GetResourceRecord() const { return m_resourceRecord; }
    inline bool ResourceRecordHasBeenSet() const { return m_resourceRecordHasBeenSet; }
    template<typename ResourceRecordT = ResourceRecord>
    void SetResourceRecord(ResourceRecordT&& value) { m_resourceRecordHasBeenSet = true; m_resourceRecord = std::forward<ResourceRecordT>(value); }
    template<typename ResourceRecordT = ResourceRecord>
    DomainValidation& WithResourceRecord(ResourceRecordT&& value) { SetResourceRecord(std::forward<ResourceRecordT>(value)); return *this;}
    ///@}

    ///@{
    /**
     * <p>Contains information for HTTP-based domain validation of certificates
     * requested through CloudFront and issued by ACM. This field exists only when the
     * certificate type is <code>AMAZON_ISSUED</code> and the validation method is
     * <code>HTTP</code>.</p>
     */
    inline const HttpRedirect& GetHttpRedirect() const { return m_httpRedirect; }
    inline bool HttpRedirectHasBeenSet() const { return m_httpRedirectHasBeenSet; }
    template<typename HttpRedirectT = HttpRedirect>
    void SetHttpRedirect(HttpRedirectT&& value) { m_httpRedirectHasBeenSet = true; m_httpRedirect = std::forward<HttpRedirectT>(value); }
    template<typename HttpRedirectT = HttpRedirect>
    DomainValidation& WithHttpRedirect(HttpRedirectT&& value) { SetHttpRedirect(std::forward<HttpRedirectT>(value)); return *this;}
    ///@}

    ///@{
    /**
     * <p>Specifies the domain validation method.</p>
     */
    inline ValidationMethod GetValidationMethod() const { return m_validationMethod; }
    inline bool ValidationMethodHasBeenSet() const { return m_validationMethodHasBeenSet; }
    inline void SetValidationMethod(ValidationMethod value) { m_validationMethodHasBeenSet = true; m_validationMethod = value; }
    inline DomainValidation& WithValidationMethod(ValidationMethod value) { SetValidationMethod(value); return *this;}
    ///@}
  private:

    Aws::String m_domainName;
    bool m_domainNameHasBeenSet = false;

    Aws::Vector<Aws::String> m_validationEmails;
    bool m_validationEmailsHasBeenSet = false;

    Aws::String m_validationDomain;
    bool m_validationDomainHasBeenSet = false;

    DomainStatus m_validationStatus{DomainStatus::NOT_SET};
    bool m_validationStatusHasBeenSet = false;

    ResourceRecord m_resourceRecord;
    bool m_resourceRecordHasBeenSet = false;

    HttpRedirect m_httpRedirect;
    bool m_httpRedirectHasBeenSet = false;

    ValidationMethod m_validationMethod{ValidationMethod::NOT_SET};
    bool m_validationMethodHasBeenSet = false;
  };

} // namespace Model
} // namespace ACM
} // namespace Aws
