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

#pragma once
#include <aws/codeguruprofiler/CodeGuruProfiler_EXPORTS.h>
#include <aws/core/utils/DateTime.h>
#include <aws/core/utils/memory/stl/AWSVector.h>
#include <aws/codeguruprofiler/model/AggregationPeriod.h>
#include <aws/core/utils/memory/stl/AWSMap.h>
#include <aws/core/utils/memory/stl/AWSString.h>
#include <aws/codeguruprofiler/model/TimestampStructure.h>
#include <aws/codeguruprofiler/model/FrameMetricDatum.h>
#include <utility>

namespace Aws
{
template<typename RESULT_TYPE>
class AmazonWebServiceResult;

namespace Utils
{
namespace Json
{
  class JsonValue;
} // namespace Json
} // namespace Utils
namespace CodeGuruProfiler
{
namespace Model
{
  /**
   * <p>The structure representing the BatchGetFrameMetricDataResponse.</p><p><h3>See
   * Also:</h3>   <a
   * href="http://docs.aws.amazon.com/goto/WebAPI/codeguruprofiler-2019-07-18/BatchGetFrameMetricDataResponse">AWS
   * API Reference</a></p>
   */
  class BatchGetFrameMetricDataResult
  {
  public:
    AWS_CODEGURUPROFILER_API BatchGetFrameMetricDataResult();
    AWS_CODEGURUPROFILER_API BatchGetFrameMetricDataResult(const Aws::AmazonWebServiceResult<Aws::Utils::Json::JsonValue>& result);
    AWS_CODEGURUPROFILER_API BatchGetFrameMetricDataResult& operator=(const Aws::AmazonWebServiceResult<Aws::Utils::Json::JsonValue>& result);


    /**
     * <p> The end time of the time period for the returned time series values. This is
     * specified using the ISO 8601 format. For example, 2020-06-01T13:15:02.001Z
     * represents 1 millisecond past June 1, 2020 1:15:02 PM UTC. </p>
     */
    inline const Aws::Utils::DateTime& GetEndTime() const{ return m_endTime; }

    /**
     * <p> The end time of the time period for the returned time series values. This is
     * specified using the ISO 8601 format. For example, 2020-06-01T13:15:02.001Z
     * represents 1 millisecond past June 1, 2020 1:15:02 PM UTC. </p>
     */
    inline void SetEndTime(const Aws::Utils::DateTime& value) { m_endTime = value; }

    /**
     * <p> The end time of the time period for the returned time series values. This is
     * specified using the ISO 8601 format. For example, 2020-06-01T13:15:02.001Z
     * represents 1 millisecond past June 1, 2020 1:15:02 PM UTC. </p>
     */
    inline void SetEndTime(Aws::Utils::DateTime&& value) { m_endTime = std::move(value); }

    /**
     * <p> The end time of the time period for the returned time series values. This is
     * specified using the ISO 8601 format. For example, 2020-06-01T13:15:02.001Z
     * represents 1 millisecond past June 1, 2020 1:15:02 PM UTC. </p>
     */
    inline BatchGetFrameMetricDataResult& WithEndTime(const Aws::Utils::DateTime& value) { SetEndTime(value); return *this;}

    /**
     * <p> The end time of the time period for the returned time series values. This is
     * specified using the ISO 8601 format. For example, 2020-06-01T13:15:02.001Z
     * represents 1 millisecond past June 1, 2020 1:15:02 PM UTC. </p>
     */
    inline BatchGetFrameMetricDataResult& WithEndTime(Aws::Utils::DateTime&& value) { SetEndTime(std::move(value)); return *this;}


    /**
     * <p> List of instances, or time steps, in the time series. For example, if the
     * <code>period</code> is one day (<code>PT24H)</code>), and the
     * <code>resolution</code> is five minutes (<code>PT5M</code>), then there are 288
     * <code>endTimes</code> in the list that are each five minutes appart. </p>
     */
    inline const Aws::Vector<TimestampStructure>& GetEndTimes() const{ return m_endTimes; }

    /**
     * <p> List of instances, or time steps, in the time series. For example, if the
     * <code>period</code> is one day (<code>PT24H)</code>), and the
     * <code>resolution</code> is five minutes (<code>PT5M</code>), then there are 288
     * <code>endTimes</code> in the list that are each five minutes appart. </p>
     */
    inline void SetEndTimes(const Aws::Vector<TimestampStructure>& value) { m_endTimes = value; }

    /**
     * <p> List of instances, or time steps, in the time series. For example, if the
     * <code>period</code> is one day (<code>PT24H)</code>), and the
     * <code>resolution</code> is five minutes (<code>PT5M</code>), then there are 288
     * <code>endTimes</code> in the list that are each five minutes appart. </p>
     */
    inline void SetEndTimes(Aws::Vector<TimestampStructure>&& value) { m_endTimes = std::move(value); }

    /**
     * <p> List of instances, or time steps, in the time series. For example, if the
     * <code>period</code> is one day (<code>PT24H)</code>), and the
     * <code>resolution</code> is five minutes (<code>PT5M</code>), then there are 288
     * <code>endTimes</code> in the list that are each five minutes appart. </p>
     */
    inline BatchGetFrameMetricDataResult& WithEndTimes(const Aws::Vector<TimestampStructure>& value) { SetEndTimes(value); return *this;}

    /**
     * <p> List of instances, or time steps, in the time series. For example, if the
     * <code>period</code> is one day (<code>PT24H)</code>), and the
     * <code>resolution</code> is five minutes (<code>PT5M</code>), then there are 288
     * <code>endTimes</code> in the list that are each five minutes appart. </p>
     */
    inline BatchGetFrameMetricDataResult& WithEndTimes(Aws::Vector<TimestampStructure>&& value) { SetEndTimes(std::move(value)); return *this;}

    /**
     * <p> List of instances, or time steps, in the time series. For example, if the
     * <code>period</code> is one day (<code>PT24H)</code>), and the
     * <code>resolution</code> is five minutes (<code>PT5M</code>), then there are 288
     * <code>endTimes</code> in the list that are each five minutes appart. </p>
     */
    inline BatchGetFrameMetricDataResult& AddEndTimes(const TimestampStructure& value) { m_endTimes.push_back(value); return *this; }

    /**
     * <p> List of instances, or time steps, in the time series. For example, if the
     * <code>period</code> is one day (<code>PT24H)</code>), and the
     * <code>resolution</code> is five minutes (<code>PT5M</code>), then there are 288
     * <code>endTimes</code> in the list that are each five minutes appart. </p>
     */
    inline BatchGetFrameMetricDataResult& AddEndTimes(TimestampStructure&& value) { m_endTimes.push_back(std::move(value)); return *this; }


    /**
     * <p>Details of the metrics to request a time series of values. The metric
     * includes the name of the frame, the aggregation type to calculate the metric
     * value for the frame, and the thread states to use to get the count for the
     * metric value of the frame.</p>
     */
    inline const Aws::Vector<FrameMetricDatum>& GetFrameMetricData() const{ return m_frameMetricData; }

    /**
     * <p>Details of the metrics to request a time series of values. The metric
     * includes the name of the frame, the aggregation type to calculate the metric
     * value for the frame, and the thread states to use to get the count for the
     * metric value of the frame.</p>
     */
    inline void SetFrameMetricData(const Aws::Vector<FrameMetricDatum>& value) { m_frameMetricData = value; }

    /**
     * <p>Details of the metrics to request a time series of values. The metric
     * includes the name of the frame, the aggregation type to calculate the metric
     * value for the frame, and the thread states to use to get the count for the
     * metric value of the frame.</p>
     */
    inline void SetFrameMetricData(Aws::Vector<FrameMetricDatum>&& value) { m_frameMetricData = std::move(value); }

    /**
     * <p>Details of the metrics to request a time series of values. The metric
     * includes the name of the frame, the aggregation type to calculate the metric
     * value for the frame, and the thread states to use to get the count for the
     * metric value of the frame.</p>
     */
    inline BatchGetFrameMetricDataResult& WithFrameMetricData(const Aws::Vector<FrameMetricDatum>& value) { SetFrameMetricData(value); return *this;}

    /**
     * <p>Details of the metrics to request a time series of values. The metric
     * includes the name of the frame, the aggregation type to calculate the metric
     * value for the frame, and the thread states to use to get the count for the
     * metric value of the frame.</p>
     */
    inline BatchGetFrameMetricDataResult& WithFrameMetricData(Aws::Vector<FrameMetricDatum>&& value) { SetFrameMetricData(std::move(value)); return *this;}

    /**
     * <p>Details of the metrics to request a time series of values. The metric
     * includes the name of the frame, the aggregation type to calculate the metric
     * value for the frame, and the thread states to use to get the count for the
     * metric value of the frame.</p>
     */
    inline BatchGetFrameMetricDataResult& AddFrameMetricData(const FrameMetricDatum& value) { m_frameMetricData.push_back(value); return *this; }

    /**
     * <p>Details of the metrics to request a time series of values. The metric
     * includes the name of the frame, the aggregation type to calculate the metric
     * value for the frame, and the thread states to use to get the count for the
     * metric value of the frame.</p>
     */
    inline BatchGetFrameMetricDataResult& AddFrameMetricData(FrameMetricDatum&& value) { m_frameMetricData.push_back(std::move(value)); return *this; }


    /**
     * <p>Resolution or granularity of the profile data used to generate the time
     * series. This is the value used to jump through time steps in a time series.
     * There are 3 valid values. </p> <ul> <li> <p> <code>P1D</code> — 1 day </p> </li>
     * <li> <p> <code>PT1H</code> — 1 hour </p> </li> <li> <p> <code>PT5M</code> — 5
     * minutes </p> </li> </ul>
     */
    inline const AggregationPeriod& GetResolution() const{ return m_resolution; }

    /**
     * <p>Resolution or granularity of the profile data used to generate the time
     * series. This is the value used to jump through time steps in a time series.
     * There are 3 valid values. </p> <ul> <li> <p> <code>P1D</code> — 1 day </p> </li>
     * <li> <p> <code>PT1H</code> — 1 hour </p> </li> <li> <p> <code>PT5M</code> — 5
     * minutes </p> </li> </ul>
     */
    inline void SetResolution(const AggregationPeriod& value) { m_resolution = value; }

    /**
     * <p>Resolution or granularity of the profile data used to generate the time
     * series. This is the value used to jump through time steps in a time series.
     * There are 3 valid values. </p> <ul> <li> <p> <code>P1D</code> — 1 day </p> </li>
     * <li> <p> <code>PT1H</code> — 1 hour </p> </li> <li> <p> <code>PT5M</code> — 5
     * minutes </p> </li> </ul>
     */
    inline void SetResolution(AggregationPeriod&& value) { m_resolution = std::move(value); }

    /**
     * <p>Resolution or granularity of the profile data used to generate the time
     * series. This is the value used to jump through time steps in a time series.
     * There are 3 valid values. </p> <ul> <li> <p> <code>P1D</code> — 1 day </p> </li>
     * <li> <p> <code>PT1H</code> — 1 hour </p> </li> <li> <p> <code>PT5M</code> — 5
     * minutes </p> </li> </ul>
     */
    inline BatchGetFrameMetricDataResult& WithResolution(const AggregationPeriod& value) { SetResolution(value); return *this;}

    /**
     * <p>Resolution or granularity of the profile data used to generate the time
     * series. This is the value used to jump through time steps in a time series.
     * There are 3 valid values. </p> <ul> <li> <p> <code>P1D</code> — 1 day </p> </li>
     * <li> <p> <code>PT1H</code> — 1 hour </p> </li> <li> <p> <code>PT5M</code> — 5
     * minutes </p> </li> </ul>
     */
    inline BatchGetFrameMetricDataResult& WithResolution(AggregationPeriod&& value) { SetResolution(std::move(value)); return *this;}


    /**
     * <p> The start time of the time period for the returned time series values. This
     * is specified using the ISO 8601 format. For example, 2020-06-01T13:15:02.001Z
     * represents 1 millisecond past June 1, 2020 1:15:02 PM UTC. </p>
     */
    inline const Aws::Utils::DateTime& GetStartTime() const{ return m_startTime; }

    /**
     * <p> The start time of the time period for the returned time series values. This
     * is specified using the ISO 8601 format. For example, 2020-06-01T13:15:02.001Z
     * represents 1 millisecond past June 1, 2020 1:15:02 PM UTC. </p>
     */
    inline void SetStartTime(const Aws::Utils::DateTime& value) { m_startTime = value; }

    /**
     * <p> The start time of the time period for the returned time series values. This
     * is specified using the ISO 8601 format. For example, 2020-06-01T13:15:02.001Z
     * represents 1 millisecond past June 1, 2020 1:15:02 PM UTC. </p>
     */
    inline void SetStartTime(Aws::Utils::DateTime&& value) { m_startTime = std::move(value); }

    /**
     * <p> The start time of the time period for the returned time series values. This
     * is specified using the ISO 8601 format. For example, 2020-06-01T13:15:02.001Z
     * represents 1 millisecond past June 1, 2020 1:15:02 PM UTC. </p>
     */
    inline BatchGetFrameMetricDataResult& WithStartTime(const Aws::Utils::DateTime& value) { SetStartTime(value); return *this;}

    /**
     * <p> The start time of the time period for the returned time series values. This
     * is specified using the ISO 8601 format. For example, 2020-06-01T13:15:02.001Z
     * represents 1 millisecond past June 1, 2020 1:15:02 PM UTC. </p>
     */
    inline BatchGetFrameMetricDataResult& WithStartTime(Aws::Utils::DateTime&& value) { SetStartTime(std::move(value)); return *this;}


    /**
     * <p>List of instances which remained unprocessed. This will create a missing time
     * step in the list of end times.</p>
     */
    inline const Aws::Map<Aws::String, Aws::Vector<TimestampStructure>>& GetUnprocessedEndTimes() const{ return m_unprocessedEndTimes; }

    /**
     * <p>List of instances which remained unprocessed. This will create a missing time
     * step in the list of end times.</p>
     */
    inline void SetUnprocessedEndTimes(const Aws::Map<Aws::String, Aws::Vector<TimestampStructure>>& value) { m_unprocessedEndTimes = value; }

    /**
     * <p>List of instances which remained unprocessed. This will create a missing time
     * step in the list of end times.</p>
     */
    inline void SetUnprocessedEndTimes(Aws::Map<Aws::String, Aws::Vector<TimestampStructure>>&& value) { m_unprocessedEndTimes = std::move(value); }

    /**
     * <p>List of instances which remained unprocessed. This will create a missing time
     * step in the list of end times.</p>
     */
    inline BatchGetFrameMetricDataResult& WithUnprocessedEndTimes(const Aws::Map<Aws::String, Aws::Vector<TimestampStructure>>& value) { SetUnprocessedEndTimes(value); return *this;}

    /**
     * <p>List of instances which remained unprocessed. This will create a missing time
     * step in the list of end times.</p>
     */
    inline BatchGetFrameMetricDataResult& WithUnprocessedEndTimes(Aws::Map<Aws::String, Aws::Vector<TimestampStructure>>&& value) { SetUnprocessedEndTimes(std::move(value)); return *this;}

    /**
     * <p>List of instances which remained unprocessed. This will create a missing time
     * step in the list of end times.</p>
     */
    inline BatchGetFrameMetricDataResult& AddUnprocessedEndTimes(const Aws::String& key, const Aws::Vector<TimestampStructure>& value) { m_unprocessedEndTimes.emplace(key, value); return *this; }

    /**
     * <p>List of instances which remained unprocessed. This will create a missing time
     * step in the list of end times.</p>
     */
    inline BatchGetFrameMetricDataResult& AddUnprocessedEndTimes(Aws::String&& key, const Aws::Vector<TimestampStructure>& value) { m_unprocessedEndTimes.emplace(std::move(key), value); return *this; }

    /**
     * <p>List of instances which remained unprocessed. This will create a missing time
     * step in the list of end times.</p>
     */
    inline BatchGetFrameMetricDataResult& AddUnprocessedEndTimes(const Aws::String& key, Aws::Vector<TimestampStructure>&& value) { m_unprocessedEndTimes.emplace(key, std::move(value)); return *this; }

    /**
     * <p>List of instances which remained unprocessed. This will create a missing time
     * step in the list of end times.</p>
     */
    inline BatchGetFrameMetricDataResult& AddUnprocessedEndTimes(Aws::String&& key, Aws::Vector<TimestampStructure>&& value) { m_unprocessedEndTimes.emplace(std::move(key), std::move(value)); return *this; }

    /**
     * <p>List of instances which remained unprocessed. This will create a missing time
     * step in the list of end times.</p>
     */
    inline BatchGetFrameMetricDataResult& AddUnprocessedEndTimes(const char* key, Aws::Vector<TimestampStructure>&& value) { m_unprocessedEndTimes.emplace(key, std::move(value)); return *this; }

    /**
     * <p>List of instances which remained unprocessed. This will create a missing time
     * step in the list of end times.</p>
     */
    inline BatchGetFrameMetricDataResult& AddUnprocessedEndTimes(const char* key, const Aws::Vector<TimestampStructure>& value) { m_unprocessedEndTimes.emplace(key, value); return *this; }


    
    inline const Aws::String& GetRequestId() const{ return m_requestId; }

    
    inline void SetRequestId(const Aws::String& value) { m_requestId = value; }

    
    inline void SetRequestId(Aws::String&& value) { m_requestId = std::move(value); }

    
    inline void SetRequestId(const char* value) { m_requestId.assign(value); }

    
    inline BatchGetFrameMetricDataResult& WithRequestId(const Aws::String& value) { SetRequestId(value); return *this;}

    
    inline BatchGetFrameMetricDataResult& WithRequestId(Aws::String&& value) { SetRequestId(std::move(value)); return *this;}

    
    inline BatchGetFrameMetricDataResult& WithRequestId(const char* value) { SetRequestId(value); return *this;}

  private:

    Aws::Utils::DateTime m_endTime;

    Aws::Vector<TimestampStructure> m_endTimes;

    Aws::Vector<FrameMetricDatum> m_frameMetricData;

    AggregationPeriod m_resolution;

    Aws::Utils::DateTime m_startTime;

    Aws::Map<Aws::String, Aws::Vector<TimestampStructure>> m_unprocessedEndTimes;

    Aws::String m_requestId;
  };

} // namespace Model
} // namespace CodeGuruProfiler
} // namespace Aws