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

#pragma once
#include <aws/license-manager/LicenseManager_EXPORTS.h>
#include <aws/core/utils/memory/stl/AWSString.h>
#include <aws/core/utils/memory/stl/AWSVector.h>
#include <aws/license-manager/model/ReportContext.h>
#include <aws/license-manager/model/ReportFrequency.h>
#include <aws/license-manager/model/S3Location.h>
#include <aws/license-manager/model/ReportType.h>
#include <aws/license-manager/model/Tag.h>
#include <utility>

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

  /**
   * <p>Describe the details of a report generator.</p><p><h3>See Also:</h3>   <a
   * href="http://docs.aws.amazon.com/goto/WebAPI/license-manager-2018-08-01/ReportGenerator">AWS
   * API Reference</a></p>
   */
  class ReportGenerator
  {
  public:
    AWS_LICENSEMANAGER_API ReportGenerator();
    AWS_LICENSEMANAGER_API ReportGenerator(Aws::Utils::Json::JsonView jsonValue);
    AWS_LICENSEMANAGER_API ReportGenerator& operator=(Aws::Utils::Json::JsonView jsonValue);
    AWS_LICENSEMANAGER_API Aws::Utils::Json::JsonValue Jsonize() const;


    /**
     * <p>Name of the report generator.</p>
     */
    inline const Aws::String& GetReportGeneratorName() const{ return m_reportGeneratorName; }

    /**
     * <p>Name of the report generator.</p>
     */
    inline bool ReportGeneratorNameHasBeenSet() const { return m_reportGeneratorNameHasBeenSet; }

    /**
     * <p>Name of the report generator.</p>
     */
    inline void SetReportGeneratorName(const Aws::String& value) { m_reportGeneratorNameHasBeenSet = true; m_reportGeneratorName = value; }

    /**
     * <p>Name of the report generator.</p>
     */
    inline void SetReportGeneratorName(Aws::String&& value) { m_reportGeneratorNameHasBeenSet = true; m_reportGeneratorName = std::move(value); }

    /**
     * <p>Name of the report generator.</p>
     */
    inline void SetReportGeneratorName(const char* value) { m_reportGeneratorNameHasBeenSet = true; m_reportGeneratorName.assign(value); }

    /**
     * <p>Name of the report generator.</p>
     */
    inline ReportGenerator& WithReportGeneratorName(const Aws::String& value) { SetReportGeneratorName(value); return *this;}

    /**
     * <p>Name of the report generator.</p>
     */
    inline ReportGenerator& WithReportGeneratorName(Aws::String&& value) { SetReportGeneratorName(std::move(value)); return *this;}

    /**
     * <p>Name of the report generator.</p>
     */
    inline ReportGenerator& WithReportGeneratorName(const char* value) { SetReportGeneratorName(value); return *this;}


    /**
     * <p>Type of reports that are generated.</p>
     */
    inline const Aws::Vector<ReportType>& GetReportType() const{ return m_reportType; }

    /**
     * <p>Type of reports that are generated.</p>
     */
    inline bool ReportTypeHasBeenSet() const { return m_reportTypeHasBeenSet; }

    /**
     * <p>Type of reports that are generated.</p>
     */
    inline void SetReportType(const Aws::Vector<ReportType>& value) { m_reportTypeHasBeenSet = true; m_reportType = value; }

    /**
     * <p>Type of reports that are generated.</p>
     */
    inline void SetReportType(Aws::Vector<ReportType>&& value) { m_reportTypeHasBeenSet = true; m_reportType = std::move(value); }

    /**
     * <p>Type of reports that are generated.</p>
     */
    inline ReportGenerator& WithReportType(const Aws::Vector<ReportType>& value) { SetReportType(value); return *this;}

    /**
     * <p>Type of reports that are generated.</p>
     */
    inline ReportGenerator& WithReportType(Aws::Vector<ReportType>&& value) { SetReportType(std::move(value)); return *this;}

    /**
     * <p>Type of reports that are generated.</p>
     */
    inline ReportGenerator& AddReportType(const ReportType& value) { m_reportTypeHasBeenSet = true; m_reportType.push_back(value); return *this; }

    /**
     * <p>Type of reports that are generated.</p>
     */
    inline ReportGenerator& AddReportType(ReportType&& value) { m_reportTypeHasBeenSet = true; m_reportType.push_back(std::move(value)); return *this; }


    /**
     * <p>License configuration type for this generator.</p>
     */
    inline const ReportContext& GetReportContext() const{ return m_reportContext; }

    /**
     * <p>License configuration type for this generator.</p>
     */
    inline bool ReportContextHasBeenSet() const { return m_reportContextHasBeenSet; }

    /**
     * <p>License configuration type for this generator.</p>
     */
    inline void SetReportContext(const ReportContext& value) { m_reportContextHasBeenSet = true; m_reportContext = value; }

    /**
     * <p>License configuration type for this generator.</p>
     */
    inline void SetReportContext(ReportContext&& value) { m_reportContextHasBeenSet = true; m_reportContext = std::move(value); }

    /**
     * <p>License configuration type for this generator.</p>
     */
    inline ReportGenerator& WithReportContext(const ReportContext& value) { SetReportContext(value); return *this;}

    /**
     * <p>License configuration type for this generator.</p>
     */
    inline ReportGenerator& WithReportContext(ReportContext&& value) { SetReportContext(std::move(value)); return *this;}


    /**
     * <p>Details about how frequently reports are generated.</p>
     */
    inline const ReportFrequency& GetReportFrequency() const{ return m_reportFrequency; }

    /**
     * <p>Details about how frequently reports are generated.</p>
     */
    inline bool ReportFrequencyHasBeenSet() const { return m_reportFrequencyHasBeenSet; }

    /**
     * <p>Details about how frequently reports are generated.</p>
     */
    inline void SetReportFrequency(const ReportFrequency& value) { m_reportFrequencyHasBeenSet = true; m_reportFrequency = value; }

    /**
     * <p>Details about how frequently reports are generated.</p>
     */
    inline void SetReportFrequency(ReportFrequency&& value) { m_reportFrequencyHasBeenSet = true; m_reportFrequency = std::move(value); }

    /**
     * <p>Details about how frequently reports are generated.</p>
     */
    inline ReportGenerator& WithReportFrequency(const ReportFrequency& value) { SetReportFrequency(value); return *this;}

    /**
     * <p>Details about how frequently reports are generated.</p>
     */
    inline ReportGenerator& WithReportFrequency(ReportFrequency&& value) { SetReportFrequency(std::move(value)); return *this;}


    /**
     * <p>Amazon Resource Name (ARN) of the report generator.</p>
     */
    inline const Aws::String& GetLicenseManagerReportGeneratorArn() const{ return m_licenseManagerReportGeneratorArn; }

    /**
     * <p>Amazon Resource Name (ARN) of the report generator.</p>
     */
    inline bool LicenseManagerReportGeneratorArnHasBeenSet() const { return m_licenseManagerReportGeneratorArnHasBeenSet; }

    /**
     * <p>Amazon Resource Name (ARN) of the report generator.</p>
     */
    inline void SetLicenseManagerReportGeneratorArn(const Aws::String& value) { m_licenseManagerReportGeneratorArnHasBeenSet = true; m_licenseManagerReportGeneratorArn = value; }

    /**
     * <p>Amazon Resource Name (ARN) of the report generator.</p>
     */
    inline void SetLicenseManagerReportGeneratorArn(Aws::String&& value) { m_licenseManagerReportGeneratorArnHasBeenSet = true; m_licenseManagerReportGeneratorArn = std::move(value); }

    /**
     * <p>Amazon Resource Name (ARN) of the report generator.</p>
     */
    inline void SetLicenseManagerReportGeneratorArn(const char* value) { m_licenseManagerReportGeneratorArnHasBeenSet = true; m_licenseManagerReportGeneratorArn.assign(value); }

    /**
     * <p>Amazon Resource Name (ARN) of the report generator.</p>
     */
    inline ReportGenerator& WithLicenseManagerReportGeneratorArn(const Aws::String& value) { SetLicenseManagerReportGeneratorArn(value); return *this;}

    /**
     * <p>Amazon Resource Name (ARN) of the report generator.</p>
     */
    inline ReportGenerator& WithLicenseManagerReportGeneratorArn(Aws::String&& value) { SetLicenseManagerReportGeneratorArn(std::move(value)); return *this;}

    /**
     * <p>Amazon Resource Name (ARN) of the report generator.</p>
     */
    inline ReportGenerator& WithLicenseManagerReportGeneratorArn(const char* value) { SetLicenseManagerReportGeneratorArn(value); return *this;}


    /**
     * <p>Status of the last report generation attempt.</p>
     */
    inline const Aws::String& GetLastRunStatus() const{ return m_lastRunStatus; }

    /**
     * <p>Status of the last report generation attempt.</p>
     */
    inline bool LastRunStatusHasBeenSet() const { return m_lastRunStatusHasBeenSet; }

    /**
     * <p>Status of the last report generation attempt.</p>
     */
    inline void SetLastRunStatus(const Aws::String& value) { m_lastRunStatusHasBeenSet = true; m_lastRunStatus = value; }

    /**
     * <p>Status of the last report generation attempt.</p>
     */
    inline void SetLastRunStatus(Aws::String&& value) { m_lastRunStatusHasBeenSet = true; m_lastRunStatus = std::move(value); }

    /**
     * <p>Status of the last report generation attempt.</p>
     */
    inline void SetLastRunStatus(const char* value) { m_lastRunStatusHasBeenSet = true; m_lastRunStatus.assign(value); }

    /**
     * <p>Status of the last report generation attempt.</p>
     */
    inline ReportGenerator& WithLastRunStatus(const Aws::String& value) { SetLastRunStatus(value); return *this;}

    /**
     * <p>Status of the last report generation attempt.</p>
     */
    inline ReportGenerator& WithLastRunStatus(Aws::String&& value) { SetLastRunStatus(std::move(value)); return *this;}

    /**
     * <p>Status of the last report generation attempt.</p>
     */
    inline ReportGenerator& WithLastRunStatus(const char* value) { SetLastRunStatus(value); return *this;}


    /**
     * <p>Failure message for the last report generation attempt.</p>
     */
    inline const Aws::String& GetLastRunFailureReason() const{ return m_lastRunFailureReason; }

    /**
     * <p>Failure message for the last report generation attempt.</p>
     */
    inline bool LastRunFailureReasonHasBeenSet() const { return m_lastRunFailureReasonHasBeenSet; }

    /**
     * <p>Failure message for the last report generation attempt.</p>
     */
    inline void SetLastRunFailureReason(const Aws::String& value) { m_lastRunFailureReasonHasBeenSet = true; m_lastRunFailureReason = value; }

    /**
     * <p>Failure message for the last report generation attempt.</p>
     */
    inline void SetLastRunFailureReason(Aws::String&& value) { m_lastRunFailureReasonHasBeenSet = true; m_lastRunFailureReason = std::move(value); }

    /**
     * <p>Failure message for the last report generation attempt.</p>
     */
    inline void SetLastRunFailureReason(const char* value) { m_lastRunFailureReasonHasBeenSet = true; m_lastRunFailureReason.assign(value); }

    /**
     * <p>Failure message for the last report generation attempt.</p>
     */
    inline ReportGenerator& WithLastRunFailureReason(const Aws::String& value) { SetLastRunFailureReason(value); return *this;}

    /**
     * <p>Failure message for the last report generation attempt.</p>
     */
    inline ReportGenerator& WithLastRunFailureReason(Aws::String&& value) { SetLastRunFailureReason(std::move(value)); return *this;}

    /**
     * <p>Failure message for the last report generation attempt.</p>
     */
    inline ReportGenerator& WithLastRunFailureReason(const char* value) { SetLastRunFailureReason(value); return *this;}


    /**
     * <p>Time the last report was generated at.</p>
     */
    inline const Aws::String& GetLastReportGenerationTime() const{ return m_lastReportGenerationTime; }

    /**
     * <p>Time the last report was generated at.</p>
     */
    inline bool LastReportGenerationTimeHasBeenSet() const { return m_lastReportGenerationTimeHasBeenSet; }

    /**
     * <p>Time the last report was generated at.</p>
     */
    inline void SetLastReportGenerationTime(const Aws::String& value) { m_lastReportGenerationTimeHasBeenSet = true; m_lastReportGenerationTime = value; }

    /**
     * <p>Time the last report was generated at.</p>
     */
    inline void SetLastReportGenerationTime(Aws::String&& value) { m_lastReportGenerationTimeHasBeenSet = true; m_lastReportGenerationTime = std::move(value); }

    /**
     * <p>Time the last report was generated at.</p>
     */
    inline void SetLastReportGenerationTime(const char* value) { m_lastReportGenerationTimeHasBeenSet = true; m_lastReportGenerationTime.assign(value); }

    /**
     * <p>Time the last report was generated at.</p>
     */
    inline ReportGenerator& WithLastReportGenerationTime(const Aws::String& value) { SetLastReportGenerationTime(value); return *this;}

    /**
     * <p>Time the last report was generated at.</p>
     */
    inline ReportGenerator& WithLastReportGenerationTime(Aws::String&& value) { SetLastReportGenerationTime(std::move(value)); return *this;}

    /**
     * <p>Time the last report was generated at.</p>
     */
    inline ReportGenerator& WithLastReportGenerationTime(const char* value) { SetLastReportGenerationTime(value); return *this;}


    /**
     * <p>The Amazon Web Services account ID used to create the report generator.</p>
     */
    inline const Aws::String& GetReportCreatorAccount() const{ return m_reportCreatorAccount; }

    /**
     * <p>The Amazon Web Services account ID used to create the report generator.</p>
     */
    inline bool ReportCreatorAccountHasBeenSet() const { return m_reportCreatorAccountHasBeenSet; }

    /**
     * <p>The Amazon Web Services account ID used to create the report generator.</p>
     */
    inline void SetReportCreatorAccount(const Aws::String& value) { m_reportCreatorAccountHasBeenSet = true; m_reportCreatorAccount = value; }

    /**
     * <p>The Amazon Web Services account ID used to create the report generator.</p>
     */
    inline void SetReportCreatorAccount(Aws::String&& value) { m_reportCreatorAccountHasBeenSet = true; m_reportCreatorAccount = std::move(value); }

    /**
     * <p>The Amazon Web Services account ID used to create the report generator.</p>
     */
    inline void SetReportCreatorAccount(const char* value) { m_reportCreatorAccountHasBeenSet = true; m_reportCreatorAccount.assign(value); }

    /**
     * <p>The Amazon Web Services account ID used to create the report generator.</p>
     */
    inline ReportGenerator& WithReportCreatorAccount(const Aws::String& value) { SetReportCreatorAccount(value); return *this;}

    /**
     * <p>The Amazon Web Services account ID used to create the report generator.</p>
     */
    inline ReportGenerator& WithReportCreatorAccount(Aws::String&& value) { SetReportCreatorAccount(std::move(value)); return *this;}

    /**
     * <p>The Amazon Web Services account ID used to create the report generator.</p>
     */
    inline ReportGenerator& WithReportCreatorAccount(const char* value) { SetReportCreatorAccount(value); return *this;}


    /**
     * <p>Description of the report generator.</p>
     */
    inline const Aws::String& GetDescription() const{ return m_description; }

    /**
     * <p>Description of the report generator.</p>
     */
    inline bool DescriptionHasBeenSet() const { return m_descriptionHasBeenSet; }

    /**
     * <p>Description of the report generator.</p>
     */
    inline void SetDescription(const Aws::String& value) { m_descriptionHasBeenSet = true; m_description = value; }

    /**
     * <p>Description of the report generator.</p>
     */
    inline void SetDescription(Aws::String&& value) { m_descriptionHasBeenSet = true; m_description = std::move(value); }

    /**
     * <p>Description of the report generator.</p>
     */
    inline void SetDescription(const char* value) { m_descriptionHasBeenSet = true; m_description.assign(value); }

    /**
     * <p>Description of the report generator.</p>
     */
    inline ReportGenerator& WithDescription(const Aws::String& value) { SetDescription(value); return *this;}

    /**
     * <p>Description of the report generator.</p>
     */
    inline ReportGenerator& WithDescription(Aws::String&& value) { SetDescription(std::move(value)); return *this;}

    /**
     * <p>Description of the report generator.</p>
     */
    inline ReportGenerator& WithDescription(const char* value) { SetDescription(value); return *this;}


    /**
     * <p>Details of the S3 bucket that report generator reports are published to.</p>
     */
    inline const S3Location& GetS3Location() const{ return m_s3Location; }

    /**
     * <p>Details of the S3 bucket that report generator reports are published to.</p>
     */
    inline bool S3LocationHasBeenSet() const { return m_s3LocationHasBeenSet; }

    /**
     * <p>Details of the S3 bucket that report generator reports are published to.</p>
     */
    inline void SetS3Location(const S3Location& value) { m_s3LocationHasBeenSet = true; m_s3Location = value; }

    /**
     * <p>Details of the S3 bucket that report generator reports are published to.</p>
     */
    inline void SetS3Location(S3Location&& value) { m_s3LocationHasBeenSet = true; m_s3Location = std::move(value); }

    /**
     * <p>Details of the S3 bucket that report generator reports are published to.</p>
     */
    inline ReportGenerator& WithS3Location(const S3Location& value) { SetS3Location(value); return *this;}

    /**
     * <p>Details of the S3 bucket that report generator reports are published to.</p>
     */
    inline ReportGenerator& WithS3Location(S3Location&& value) { SetS3Location(std::move(value)); return *this;}


    /**
     * <p>Time the report was created.</p>
     */
    inline const Aws::String& GetCreateTime() const{ return m_createTime; }

    /**
     * <p>Time the report was created.</p>
     */
    inline bool CreateTimeHasBeenSet() const { return m_createTimeHasBeenSet; }

    /**
     * <p>Time the report was created.</p>
     */
    inline void SetCreateTime(const Aws::String& value) { m_createTimeHasBeenSet = true; m_createTime = value; }

    /**
     * <p>Time the report was created.</p>
     */
    inline void SetCreateTime(Aws::String&& value) { m_createTimeHasBeenSet = true; m_createTime = std::move(value); }

    /**
     * <p>Time the report was created.</p>
     */
    inline void SetCreateTime(const char* value) { m_createTimeHasBeenSet = true; m_createTime.assign(value); }

    /**
     * <p>Time the report was created.</p>
     */
    inline ReportGenerator& WithCreateTime(const Aws::String& value) { SetCreateTime(value); return *this;}

    /**
     * <p>Time the report was created.</p>
     */
    inline ReportGenerator& WithCreateTime(Aws::String&& value) { SetCreateTime(std::move(value)); return *this;}

    /**
     * <p>Time the report was created.</p>
     */
    inline ReportGenerator& WithCreateTime(const char* value) { SetCreateTime(value); return *this;}


    /**
     * <p>Tags associated with the report generator.</p>
     */
    inline const Aws::Vector<Tag>& GetTags() const{ return m_tags; }

    /**
     * <p>Tags associated with the report generator.</p>
     */
    inline bool TagsHasBeenSet() const { return m_tagsHasBeenSet; }

    /**
     * <p>Tags associated with the report generator.</p>
     */
    inline void SetTags(const Aws::Vector<Tag>& value) { m_tagsHasBeenSet = true; m_tags = value; }

    /**
     * <p>Tags associated with the report generator.</p>
     */
    inline void SetTags(Aws::Vector<Tag>&& value) { m_tagsHasBeenSet = true; m_tags = std::move(value); }

    /**
     * <p>Tags associated with the report generator.</p>
     */
    inline ReportGenerator& WithTags(const Aws::Vector<Tag>& value) { SetTags(value); return *this;}

    /**
     * <p>Tags associated with the report generator.</p>
     */
    inline ReportGenerator& WithTags(Aws::Vector<Tag>&& value) { SetTags(std::move(value)); return *this;}

    /**
     * <p>Tags associated with the report generator.</p>
     */
    inline ReportGenerator& AddTags(const Tag& value) { m_tagsHasBeenSet = true; m_tags.push_back(value); return *this; }

    /**
     * <p>Tags associated with the report generator.</p>
     */
    inline ReportGenerator& AddTags(Tag&& value) { m_tagsHasBeenSet = true; m_tags.push_back(std::move(value)); return *this; }

  private:

    Aws::String m_reportGeneratorName;
    bool m_reportGeneratorNameHasBeenSet = false;

    Aws::Vector<ReportType> m_reportType;
    bool m_reportTypeHasBeenSet = false;

    ReportContext m_reportContext;
    bool m_reportContextHasBeenSet = false;

    ReportFrequency m_reportFrequency;
    bool m_reportFrequencyHasBeenSet = false;

    Aws::String m_licenseManagerReportGeneratorArn;
    bool m_licenseManagerReportGeneratorArnHasBeenSet = false;

    Aws::String m_lastRunStatus;
    bool m_lastRunStatusHasBeenSet = false;

    Aws::String m_lastRunFailureReason;
    bool m_lastRunFailureReasonHasBeenSet = false;

    Aws::String m_lastReportGenerationTime;
    bool m_lastReportGenerationTimeHasBeenSet = false;

    Aws::String m_reportCreatorAccount;
    bool m_reportCreatorAccountHasBeenSet = false;

    Aws::String m_description;
    bool m_descriptionHasBeenSet = false;

    S3Location m_s3Location;
    bool m_s3LocationHasBeenSet = false;

    Aws::String m_createTime;
    bool m_createTimeHasBeenSet = false;

    Aws::Vector<Tag> m_tags;
    bool m_tagsHasBeenSet = false;
  };

} // namespace Model
} // namespace LicenseManager
} // namespace Aws