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

#pragma once
#include <aws/ce/CostExplorer_EXPORTS.h>
#include <aws/ce/model/DimensionValuesWithAttributes.h>
#include <aws/ce/model/GroupDefinition.h>
#include <aws/ce/model/ResultByTime.h>
#include <aws/core/utils/memory/stl/AWSString.h>
#include <aws/core/utils/memory/stl/AWSVector.h>

#include <utility>

namespace Aws {
template <typename RESULT_TYPE>
class AmazonWebServiceResult;

namespace Utils {
namespace Json {
class JsonValue;
}  // namespace Json
}  // namespace Utils
namespace CostExplorer {
namespace Model {
class GetCostAndUsageResult {
 public:
  AWS_COSTEXPLORER_API GetCostAndUsageResult() = default;
  AWS_COSTEXPLORER_API GetCostAndUsageResult(const Aws::AmazonWebServiceResult<Aws::Utils::Json::JsonValue>& result);
  AWS_COSTEXPLORER_API GetCostAndUsageResult& operator=(const Aws::AmazonWebServiceResult<Aws::Utils::Json::JsonValue>& result);

  ///@{
  /**
   * <p>The token for the next set of retrievable results. Amazon Web Services
   * provides the token when the response from a previous call has more results than
   * the maximum page size.</p>
   */
  inline const Aws::String& GetNextPageToken() const { return m_nextPageToken; }
  template <typename NextPageTokenT = Aws::String>
  void SetNextPageToken(NextPageTokenT&& value) {
    m_nextPageTokenHasBeenSet = true;
    m_nextPageToken = std::forward<NextPageTokenT>(value);
  }
  template <typename NextPageTokenT = Aws::String>
  GetCostAndUsageResult& WithNextPageToken(NextPageTokenT&& value) {
    SetNextPageToken(std::forward<NextPageTokenT>(value));
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>The groups that are specified by the <code>Filter</code> or
   * <code>GroupBy</code> parameters in the request.</p>
   */
  inline const Aws::Vector<GroupDefinition>& GetGroupDefinitions() const { return m_groupDefinitions; }
  template <typename GroupDefinitionsT = Aws::Vector<GroupDefinition>>
  void SetGroupDefinitions(GroupDefinitionsT&& value) {
    m_groupDefinitionsHasBeenSet = true;
    m_groupDefinitions = std::forward<GroupDefinitionsT>(value);
  }
  template <typename GroupDefinitionsT = Aws::Vector<GroupDefinition>>
  GetCostAndUsageResult& WithGroupDefinitions(GroupDefinitionsT&& value) {
    SetGroupDefinitions(std::forward<GroupDefinitionsT>(value));
    return *this;
  }
  template <typename GroupDefinitionsT = GroupDefinition>
  GetCostAndUsageResult& AddGroupDefinitions(GroupDefinitionsT&& value) {
    m_groupDefinitionsHasBeenSet = true;
    m_groupDefinitions.emplace_back(std::forward<GroupDefinitionsT>(value));
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>The time period that's covered by the results in the response.</p>
   */
  inline const Aws::Vector<ResultByTime>& GetResultsByTime() const { return m_resultsByTime; }
  template <typename ResultsByTimeT = Aws::Vector<ResultByTime>>
  void SetResultsByTime(ResultsByTimeT&& value) {
    m_resultsByTimeHasBeenSet = true;
    m_resultsByTime = std::forward<ResultsByTimeT>(value);
  }
  template <typename ResultsByTimeT = Aws::Vector<ResultByTime>>
  GetCostAndUsageResult& WithResultsByTime(ResultsByTimeT&& value) {
    SetResultsByTime(std::forward<ResultsByTimeT>(value));
    return *this;
  }
  template <typename ResultsByTimeT = ResultByTime>
  GetCostAndUsageResult& AddResultsByTime(ResultsByTimeT&& value) {
    m_resultsByTimeHasBeenSet = true;
    m_resultsByTime.emplace_back(std::forward<ResultsByTimeT>(value));
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>The attributes that apply to a specific dimension value. For example, if the
   * value is a linked account, the attribute is that account name.</p>
   */
  inline const Aws::Vector<DimensionValuesWithAttributes>& GetDimensionValueAttributes() const { return m_dimensionValueAttributes; }
  template <typename DimensionValueAttributesT = Aws::Vector<DimensionValuesWithAttributes>>
  void SetDimensionValueAttributes(DimensionValueAttributesT&& value) {
    m_dimensionValueAttributesHasBeenSet = true;
    m_dimensionValueAttributes = std::forward<DimensionValueAttributesT>(value);
  }
  template <typename DimensionValueAttributesT = Aws::Vector<DimensionValuesWithAttributes>>
  GetCostAndUsageResult& WithDimensionValueAttributes(DimensionValueAttributesT&& value) {
    SetDimensionValueAttributes(std::forward<DimensionValueAttributesT>(value));
    return *this;
  }
  template <typename DimensionValueAttributesT = DimensionValuesWithAttributes>
  GetCostAndUsageResult& AddDimensionValueAttributes(DimensionValueAttributesT&& value) {
    m_dimensionValueAttributesHasBeenSet = true;
    m_dimensionValueAttributes.emplace_back(std::forward<DimensionValueAttributesT>(value));
    return *this;
  }
  ///@}

  ///@{

  inline const Aws::String& GetRequestId() const { return m_requestId; }
  template <typename RequestIdT = Aws::String>
  void SetRequestId(RequestIdT&& value) {
    m_requestIdHasBeenSet = true;
    m_requestId = std::forward<RequestIdT>(value);
  }
  template <typename RequestIdT = Aws::String>
  GetCostAndUsageResult& WithRequestId(RequestIdT&& value) {
    SetRequestId(std::forward<RequestIdT>(value));
    return *this;
  }
  ///@}
 private:
  Aws::String m_nextPageToken;
  bool m_nextPageTokenHasBeenSet = false;

  Aws::Vector<GroupDefinition> m_groupDefinitions;
  bool m_groupDefinitionsHasBeenSet = false;

  Aws::Vector<ResultByTime> m_resultsByTime;
  bool m_resultsByTimeHasBeenSet = false;

  Aws::Vector<DimensionValuesWithAttributes> m_dimensionValueAttributes;
  bool m_dimensionValueAttributesHasBeenSet = false;

  Aws::String m_requestId;
  bool m_requestIdHasBeenSet = false;
};

}  // namespace Model
}  // namespace CostExplorer
}  // namespace Aws
