{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-binds #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.CostExplorer.GetSavingsPlansUtilizationDetails
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Retrieves attribute data along with aggregate utilization and savings
-- data for a given time period. This doesn\'t support granular or grouped
-- data (daily\/monthly) in response. You can\'t retrieve data by dates in
-- a single response similar to @GetSavingsPlanUtilization@, but you have
-- the option to make multiple calls to @GetSavingsPlanUtilizationDetails@
-- by providing individual dates. You can use @GetDimensionValues@ in
-- @SAVINGS_PLANS@ to determine the possible dimension values.
--
-- @GetSavingsPlanUtilizationDetails@ internally groups data by
-- @SavingsPlansArn@.
module Amazonka.CostExplorer.GetSavingsPlansUtilizationDetails
  ( -- * Creating a Request
    GetSavingsPlansUtilizationDetails (..),
    newGetSavingsPlansUtilizationDetails,

    -- * Request Lenses
    getSavingsPlansUtilizationDetails_dataType,
    getSavingsPlansUtilizationDetails_filter,
    getSavingsPlansUtilizationDetails_maxResults,
    getSavingsPlansUtilizationDetails_nextToken,
    getSavingsPlansUtilizationDetails_sortBy,
    getSavingsPlansUtilizationDetails_timePeriod,

    -- * Destructuring the Response
    GetSavingsPlansUtilizationDetailsResponse (..),
    newGetSavingsPlansUtilizationDetailsResponse,

    -- * Response Lenses
    getSavingsPlansUtilizationDetailsResponse_nextToken,
    getSavingsPlansUtilizationDetailsResponse_total,
    getSavingsPlansUtilizationDetailsResponse_httpStatus,
    getSavingsPlansUtilizationDetailsResponse_savingsPlansUtilizationDetails,
    getSavingsPlansUtilizationDetailsResponse_timePeriod,
  )
where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import Amazonka.CostExplorer.Types
import qualified Amazonka.Data as Data
import qualified Amazonka.Prelude as Prelude
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response

-- | /See:/ 'newGetSavingsPlansUtilizationDetails' smart constructor.
data GetSavingsPlansUtilizationDetails = GetSavingsPlansUtilizationDetails'
  { -- | The data type.
    GetSavingsPlansUtilizationDetails -> Maybe [SavingsPlansDataType]
dataType :: Prelude.Maybe [SavingsPlansDataType],
    -- | Filters Savings Plans utilization coverage data for active Savings Plans
    -- dimensions. You can filter data with the following dimensions:
    --
    -- -   @LINKED_ACCOUNT@
    --
    -- -   @SAVINGS_PLAN_ARN@
    --
    -- -   @REGION@
    --
    -- -   @PAYMENT_OPTION@
    --
    -- -   @INSTANCE_TYPE_FAMILY@
    --
    -- @GetSavingsPlansUtilizationDetails@ uses the same
    -- <https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_Expression.html Expression>
    -- object as the other operations, but only @AND@ is supported among each
    -- dimension.
    GetSavingsPlansUtilizationDetails -> Maybe Expression
filter' :: Prelude.Maybe Expression,
    -- | The number of items to be returned in a response. The default is @20@,
    -- with a minimum value of @1@.
    GetSavingsPlansUtilizationDetails -> Maybe Natural
maxResults :: Prelude.Maybe Prelude.Natural,
    -- | The token to retrieve the next set of results. Amazon Web Services
    -- provides the token when the response from a previous call has more
    -- results than the maximum page size.
    GetSavingsPlansUtilizationDetails -> Maybe Text
nextToken :: Prelude.Maybe Prelude.Text,
    -- | The value that you want to sort the data by.
    --
    -- The following values are supported for @Key@:
    --
    -- -   @UtilizationPercentage@
    --
    -- -   @TotalCommitment@
    --
    -- -   @UsedCommitment@
    --
    -- -   @UnusedCommitment@
    --
    -- -   @NetSavings@
    --
    -- -   @AmortizedRecurringCommitment@
    --
    -- -   @AmortizedUpfrontCommitment@
    --
    -- The supported values for @SortOrder@ are @ASCENDING@ and @DESCENDING@.
    GetSavingsPlansUtilizationDetails -> Maybe SortDefinition
sortBy :: Prelude.Maybe SortDefinition,
    -- | The time period that you want the usage and costs for. The @Start@ date
    -- must be within 13 months. The @End@ date must be after the @Start@ date,
    -- and before the current date. Future dates can\'t be used as an @End@
    -- date.
    GetSavingsPlansUtilizationDetails -> DateInterval
timePeriod :: DateInterval
  }
  deriving (GetSavingsPlansUtilizationDetails
-> GetSavingsPlansUtilizationDetails -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GetSavingsPlansUtilizationDetails
-> GetSavingsPlansUtilizationDetails -> Bool
$c/= :: GetSavingsPlansUtilizationDetails
-> GetSavingsPlansUtilizationDetails -> Bool
== :: GetSavingsPlansUtilizationDetails
-> GetSavingsPlansUtilizationDetails -> Bool
$c== :: GetSavingsPlansUtilizationDetails
-> GetSavingsPlansUtilizationDetails -> Bool
Prelude.Eq, ReadPrec [GetSavingsPlansUtilizationDetails]
ReadPrec GetSavingsPlansUtilizationDetails
Int -> ReadS GetSavingsPlansUtilizationDetails
ReadS [GetSavingsPlansUtilizationDetails]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GetSavingsPlansUtilizationDetails]
$creadListPrec :: ReadPrec [GetSavingsPlansUtilizationDetails]
readPrec :: ReadPrec GetSavingsPlansUtilizationDetails
$creadPrec :: ReadPrec GetSavingsPlansUtilizationDetails
readList :: ReadS [GetSavingsPlansUtilizationDetails]
$creadList :: ReadS [GetSavingsPlansUtilizationDetails]
readsPrec :: Int -> ReadS GetSavingsPlansUtilizationDetails
$creadsPrec :: Int -> ReadS GetSavingsPlansUtilizationDetails
Prelude.Read, Int -> GetSavingsPlansUtilizationDetails -> ShowS
[GetSavingsPlansUtilizationDetails] -> ShowS
GetSavingsPlansUtilizationDetails -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GetSavingsPlansUtilizationDetails] -> ShowS
$cshowList :: [GetSavingsPlansUtilizationDetails] -> ShowS
show :: GetSavingsPlansUtilizationDetails -> String
$cshow :: GetSavingsPlansUtilizationDetails -> String
showsPrec :: Int -> GetSavingsPlansUtilizationDetails -> ShowS
$cshowsPrec :: Int -> GetSavingsPlansUtilizationDetails -> ShowS
Prelude.Show, forall x.
Rep GetSavingsPlansUtilizationDetails x
-> GetSavingsPlansUtilizationDetails
forall x.
GetSavingsPlansUtilizationDetails
-> Rep GetSavingsPlansUtilizationDetails x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep GetSavingsPlansUtilizationDetails x
-> GetSavingsPlansUtilizationDetails
$cfrom :: forall x.
GetSavingsPlansUtilizationDetails
-> Rep GetSavingsPlansUtilizationDetails x
Prelude.Generic)

-- |
-- Create a value of 'GetSavingsPlansUtilizationDetails' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'dataType', 'getSavingsPlansUtilizationDetails_dataType' - The data type.
--
-- 'filter'', 'getSavingsPlansUtilizationDetails_filter' - Filters Savings Plans utilization coverage data for active Savings Plans
-- dimensions. You can filter data with the following dimensions:
--
-- -   @LINKED_ACCOUNT@
--
-- -   @SAVINGS_PLAN_ARN@
--
-- -   @REGION@
--
-- -   @PAYMENT_OPTION@
--
-- -   @INSTANCE_TYPE_FAMILY@
--
-- @GetSavingsPlansUtilizationDetails@ uses the same
-- <https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_Expression.html Expression>
-- object as the other operations, but only @AND@ is supported among each
-- dimension.
--
-- 'maxResults', 'getSavingsPlansUtilizationDetails_maxResults' - The number of items to be returned in a response. The default is @20@,
-- with a minimum value of @1@.
--
-- 'nextToken', 'getSavingsPlansUtilizationDetails_nextToken' - The token to retrieve the next set of results. Amazon Web Services
-- provides the token when the response from a previous call has more
-- results than the maximum page size.
--
-- 'sortBy', 'getSavingsPlansUtilizationDetails_sortBy' - The value that you want to sort the data by.
--
-- The following values are supported for @Key@:
--
-- -   @UtilizationPercentage@
--
-- -   @TotalCommitment@
--
-- -   @UsedCommitment@
--
-- -   @UnusedCommitment@
--
-- -   @NetSavings@
--
-- -   @AmortizedRecurringCommitment@
--
-- -   @AmortizedUpfrontCommitment@
--
-- The supported values for @SortOrder@ are @ASCENDING@ and @DESCENDING@.
--
-- 'timePeriod', 'getSavingsPlansUtilizationDetails_timePeriod' - The time period that you want the usage and costs for. The @Start@ date
-- must be within 13 months. The @End@ date must be after the @Start@ date,
-- and before the current date. Future dates can\'t be used as an @End@
-- date.
newGetSavingsPlansUtilizationDetails ::
  -- | 'timePeriod'
  DateInterval ->
  GetSavingsPlansUtilizationDetails
newGetSavingsPlansUtilizationDetails :: DateInterval -> GetSavingsPlansUtilizationDetails
newGetSavingsPlansUtilizationDetails DateInterval
pTimePeriod_ =
  GetSavingsPlansUtilizationDetails'
    { $sel:dataType:GetSavingsPlansUtilizationDetails' :: Maybe [SavingsPlansDataType]
dataType =
        forall a. Maybe a
Prelude.Nothing,
      $sel:filter':GetSavingsPlansUtilizationDetails' :: Maybe Expression
filter' = forall a. Maybe a
Prelude.Nothing,
      $sel:maxResults:GetSavingsPlansUtilizationDetails' :: Maybe Natural
maxResults = forall a. Maybe a
Prelude.Nothing,
      $sel:nextToken:GetSavingsPlansUtilizationDetails' :: Maybe Text
nextToken = forall a. Maybe a
Prelude.Nothing,
      $sel:sortBy:GetSavingsPlansUtilizationDetails' :: Maybe SortDefinition
sortBy = forall a. Maybe a
Prelude.Nothing,
      $sel:timePeriod:GetSavingsPlansUtilizationDetails' :: DateInterval
timePeriod = DateInterval
pTimePeriod_
    }

-- | The data type.
getSavingsPlansUtilizationDetails_dataType :: Lens.Lens' GetSavingsPlansUtilizationDetails (Prelude.Maybe [SavingsPlansDataType])
getSavingsPlansUtilizationDetails_dataType :: Lens'
  GetSavingsPlansUtilizationDetails (Maybe [SavingsPlansDataType])
getSavingsPlansUtilizationDetails_dataType = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetSavingsPlansUtilizationDetails' {Maybe [SavingsPlansDataType]
dataType :: Maybe [SavingsPlansDataType]
$sel:dataType:GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> Maybe [SavingsPlansDataType]
dataType} -> Maybe [SavingsPlansDataType]
dataType) (\s :: GetSavingsPlansUtilizationDetails
s@GetSavingsPlansUtilizationDetails' {} Maybe [SavingsPlansDataType]
a -> GetSavingsPlansUtilizationDetails
s {$sel:dataType:GetSavingsPlansUtilizationDetails' :: Maybe [SavingsPlansDataType]
dataType = Maybe [SavingsPlansDataType]
a} :: GetSavingsPlansUtilizationDetails) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | Filters Savings Plans utilization coverage data for active Savings Plans
-- dimensions. You can filter data with the following dimensions:
--
-- -   @LINKED_ACCOUNT@
--
-- -   @SAVINGS_PLAN_ARN@
--
-- -   @REGION@
--
-- -   @PAYMENT_OPTION@
--
-- -   @INSTANCE_TYPE_FAMILY@
--
-- @GetSavingsPlansUtilizationDetails@ uses the same
-- <https://docs.aws.amazon.com/aws-cost-management/latest/APIReference/API_Expression.html Expression>
-- object as the other operations, but only @AND@ is supported among each
-- dimension.
getSavingsPlansUtilizationDetails_filter :: Lens.Lens' GetSavingsPlansUtilizationDetails (Prelude.Maybe Expression)
getSavingsPlansUtilizationDetails_filter :: Lens' GetSavingsPlansUtilizationDetails (Maybe Expression)
getSavingsPlansUtilizationDetails_filter = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetSavingsPlansUtilizationDetails' {Maybe Expression
filter' :: Maybe Expression
$sel:filter':GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> Maybe Expression
filter'} -> Maybe Expression
filter') (\s :: GetSavingsPlansUtilizationDetails
s@GetSavingsPlansUtilizationDetails' {} Maybe Expression
a -> GetSavingsPlansUtilizationDetails
s {$sel:filter':GetSavingsPlansUtilizationDetails' :: Maybe Expression
filter' = Maybe Expression
a} :: GetSavingsPlansUtilizationDetails)

-- | The number of items to be returned in a response. The default is @20@,
-- with a minimum value of @1@.
getSavingsPlansUtilizationDetails_maxResults :: Lens.Lens' GetSavingsPlansUtilizationDetails (Prelude.Maybe Prelude.Natural)
getSavingsPlansUtilizationDetails_maxResults :: Lens' GetSavingsPlansUtilizationDetails (Maybe Natural)
getSavingsPlansUtilizationDetails_maxResults = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetSavingsPlansUtilizationDetails' {Maybe Natural
maxResults :: Maybe Natural
$sel:maxResults:GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> Maybe Natural
maxResults} -> Maybe Natural
maxResults) (\s :: GetSavingsPlansUtilizationDetails
s@GetSavingsPlansUtilizationDetails' {} Maybe Natural
a -> GetSavingsPlansUtilizationDetails
s {$sel:maxResults:GetSavingsPlansUtilizationDetails' :: Maybe Natural
maxResults = Maybe Natural
a} :: GetSavingsPlansUtilizationDetails)

-- | The token to retrieve the next set of results. Amazon Web Services
-- provides the token when the response from a previous call has more
-- results than the maximum page size.
getSavingsPlansUtilizationDetails_nextToken :: Lens.Lens' GetSavingsPlansUtilizationDetails (Prelude.Maybe Prelude.Text)
getSavingsPlansUtilizationDetails_nextToken :: Lens' GetSavingsPlansUtilizationDetails (Maybe Text)
getSavingsPlansUtilizationDetails_nextToken = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetSavingsPlansUtilizationDetails' {Maybe Text
nextToken :: Maybe Text
$sel:nextToken:GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> Maybe Text
nextToken} -> Maybe Text
nextToken) (\s :: GetSavingsPlansUtilizationDetails
s@GetSavingsPlansUtilizationDetails' {} Maybe Text
a -> GetSavingsPlansUtilizationDetails
s {$sel:nextToken:GetSavingsPlansUtilizationDetails' :: Maybe Text
nextToken = Maybe Text
a} :: GetSavingsPlansUtilizationDetails)

-- | The value that you want to sort the data by.
--
-- The following values are supported for @Key@:
--
-- -   @UtilizationPercentage@
--
-- -   @TotalCommitment@
--
-- -   @UsedCommitment@
--
-- -   @UnusedCommitment@
--
-- -   @NetSavings@
--
-- -   @AmortizedRecurringCommitment@
--
-- -   @AmortizedUpfrontCommitment@
--
-- The supported values for @SortOrder@ are @ASCENDING@ and @DESCENDING@.
getSavingsPlansUtilizationDetails_sortBy :: Lens.Lens' GetSavingsPlansUtilizationDetails (Prelude.Maybe SortDefinition)
getSavingsPlansUtilizationDetails_sortBy :: Lens' GetSavingsPlansUtilizationDetails (Maybe SortDefinition)
getSavingsPlansUtilizationDetails_sortBy = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetSavingsPlansUtilizationDetails' {Maybe SortDefinition
sortBy :: Maybe SortDefinition
$sel:sortBy:GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> Maybe SortDefinition
sortBy} -> Maybe SortDefinition
sortBy) (\s :: GetSavingsPlansUtilizationDetails
s@GetSavingsPlansUtilizationDetails' {} Maybe SortDefinition
a -> GetSavingsPlansUtilizationDetails
s {$sel:sortBy:GetSavingsPlansUtilizationDetails' :: Maybe SortDefinition
sortBy = Maybe SortDefinition
a} :: GetSavingsPlansUtilizationDetails)

-- | The time period that you want the usage and costs for. The @Start@ date
-- must be within 13 months. The @End@ date must be after the @Start@ date,
-- and before the current date. Future dates can\'t be used as an @End@
-- date.
getSavingsPlansUtilizationDetails_timePeriod :: Lens.Lens' GetSavingsPlansUtilizationDetails DateInterval
getSavingsPlansUtilizationDetails_timePeriod :: Lens' GetSavingsPlansUtilizationDetails DateInterval
getSavingsPlansUtilizationDetails_timePeriod = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetSavingsPlansUtilizationDetails' {DateInterval
timePeriod :: DateInterval
$sel:timePeriod:GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> DateInterval
timePeriod} -> DateInterval
timePeriod) (\s :: GetSavingsPlansUtilizationDetails
s@GetSavingsPlansUtilizationDetails' {} DateInterval
a -> GetSavingsPlansUtilizationDetails
s {$sel:timePeriod:GetSavingsPlansUtilizationDetails' :: DateInterval
timePeriod = DateInterval
a} :: GetSavingsPlansUtilizationDetails)

instance
  Core.AWSRequest
    GetSavingsPlansUtilizationDetails
  where
  type
    AWSResponse GetSavingsPlansUtilizationDetails =
      GetSavingsPlansUtilizationDetailsResponse
  request :: (Service -> Service)
-> GetSavingsPlansUtilizationDetails
-> Request GetSavingsPlansUtilizationDetails
request Service -> Service
overrides =
    forall a. (ToRequest a, ToJSON a) => Service -> a -> Request a
Request.postJSON (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy GetSavingsPlansUtilizationDetails
-> ClientResponse ClientBody
-> m (Either
        Error
        (ClientResponse (AWSResponse GetSavingsPlansUtilizationDetails)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> Object -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveJSON
      ( \Int
s ResponseHeaders
h Object
x ->
          Maybe Text
-> Maybe SavingsPlansUtilizationAggregates
-> Int
-> [SavingsPlansUtilizationDetail]
-> DateInterval
-> GetSavingsPlansUtilizationDetailsResponse
GetSavingsPlansUtilizationDetailsResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Either String (Maybe a)
Data..?> Key
"NextToken")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Either String (Maybe a)
Data..?> Key
"Total")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (forall (f :: * -> *) a. Applicative f => a -> f a
Prelude.pure (forall a. Enum a => a -> Int
Prelude.fromEnum Int
s))
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> ( Object
x
                            forall a. FromJSON a => Object -> Key -> Either String (Maybe a)
Data..?> Key
"SavingsPlansUtilizationDetails"
                            forall (f :: * -> *) a. Functor f => f (Maybe a) -> a -> f a
Core..!@ forall a. Monoid a => a
Prelude.mempty
                        )
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Either String a
Data..:> Key
"TimePeriod")
      )

instance
  Prelude.Hashable
    GetSavingsPlansUtilizationDetails
  where
  hashWithSalt :: Int -> GetSavingsPlansUtilizationDetails -> Int
hashWithSalt
    Int
_salt
    GetSavingsPlansUtilizationDetails' {Maybe Natural
Maybe [SavingsPlansDataType]
Maybe Text
Maybe SortDefinition
Maybe Expression
DateInterval
timePeriod :: DateInterval
sortBy :: Maybe SortDefinition
nextToken :: Maybe Text
maxResults :: Maybe Natural
filter' :: Maybe Expression
dataType :: Maybe [SavingsPlansDataType]
$sel:timePeriod:GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> DateInterval
$sel:sortBy:GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> Maybe SortDefinition
$sel:nextToken:GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> Maybe Text
$sel:maxResults:GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> Maybe Natural
$sel:filter':GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> Maybe Expression
$sel:dataType:GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> Maybe [SavingsPlansDataType]
..} =
      Int
_salt
        forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe [SavingsPlansDataType]
dataType
        forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Expression
filter'
        forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Natural
maxResults
        forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
nextToken
        forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe SortDefinition
sortBy
        forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` DateInterval
timePeriod

instance
  Prelude.NFData
    GetSavingsPlansUtilizationDetails
  where
  rnf :: GetSavingsPlansUtilizationDetails -> ()
rnf GetSavingsPlansUtilizationDetails' {Maybe Natural
Maybe [SavingsPlansDataType]
Maybe Text
Maybe SortDefinition
Maybe Expression
DateInterval
timePeriod :: DateInterval
sortBy :: Maybe SortDefinition
nextToken :: Maybe Text
maxResults :: Maybe Natural
filter' :: Maybe Expression
dataType :: Maybe [SavingsPlansDataType]
$sel:timePeriod:GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> DateInterval
$sel:sortBy:GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> Maybe SortDefinition
$sel:nextToken:GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> Maybe Text
$sel:maxResults:GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> Maybe Natural
$sel:filter':GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> Maybe Expression
$sel:dataType:GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> Maybe [SavingsPlansDataType]
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe [SavingsPlansDataType]
dataType
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Expression
filter'
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Natural
maxResults
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
nextToken
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe SortDefinition
sortBy
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf DateInterval
timePeriod

instance
  Data.ToHeaders
    GetSavingsPlansUtilizationDetails
  where
  toHeaders :: GetSavingsPlansUtilizationDetails -> ResponseHeaders
toHeaders =
    forall a b. a -> b -> a
Prelude.const
      ( forall a. Monoid a => [a] -> a
Prelude.mconcat
          [ HeaderName
"X-Amz-Target"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"AWSInsightsIndexService.GetSavingsPlansUtilizationDetails" ::
                          Prelude.ByteString
                      ),
            HeaderName
"Content-Type"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"application/x-amz-json-1.1" ::
                          Prelude.ByteString
                      )
          ]
      )

instance
  Data.ToJSON
    GetSavingsPlansUtilizationDetails
  where
  toJSON :: GetSavingsPlansUtilizationDetails -> Value
toJSON GetSavingsPlansUtilizationDetails' {Maybe Natural
Maybe [SavingsPlansDataType]
Maybe Text
Maybe SortDefinition
Maybe Expression
DateInterval
timePeriod :: DateInterval
sortBy :: Maybe SortDefinition
nextToken :: Maybe Text
maxResults :: Maybe Natural
filter' :: Maybe Expression
dataType :: Maybe [SavingsPlansDataType]
$sel:timePeriod:GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> DateInterval
$sel:sortBy:GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> Maybe SortDefinition
$sel:nextToken:GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> Maybe Text
$sel:maxResults:GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> Maybe Natural
$sel:filter':GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> Maybe Expression
$sel:dataType:GetSavingsPlansUtilizationDetails' :: GetSavingsPlansUtilizationDetails -> Maybe [SavingsPlansDataType]
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"DataType" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe [SavingsPlansDataType]
dataType,
            (Key
"Filter" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Expression
filter',
            (Key
"MaxResults" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Natural
maxResults,
            (Key
"NextToken" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
nextToken,
            (Key
"SortBy" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe SortDefinition
sortBy,
            forall a. a -> Maybe a
Prelude.Just (Key
"TimePeriod" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= DateInterval
timePeriod)
          ]
      )

instance
  Data.ToPath
    GetSavingsPlansUtilizationDetails
  where
  toPath :: GetSavingsPlansUtilizationDetails -> ByteString
toPath = forall a b. a -> b -> a
Prelude.const ByteString
"/"

instance
  Data.ToQuery
    GetSavingsPlansUtilizationDetails
  where
  toQuery :: GetSavingsPlansUtilizationDetails -> QueryString
toQuery = forall a b. a -> b -> a
Prelude.const forall a. Monoid a => a
Prelude.mempty

-- | /See:/ 'newGetSavingsPlansUtilizationDetailsResponse' smart constructor.
data GetSavingsPlansUtilizationDetailsResponse = GetSavingsPlansUtilizationDetailsResponse'
  { -- | The token to retrieve the next set of results. Amazon Web Services
    -- provides the token when the response from a previous call has more
    -- results than the maximum page size.
    GetSavingsPlansUtilizationDetailsResponse -> Maybe Text
nextToken :: Prelude.Maybe Prelude.Text,
    -- | The total Savings Plans utilization, regardless of time period.
    GetSavingsPlansUtilizationDetailsResponse
-> Maybe SavingsPlansUtilizationAggregates
total :: Prelude.Maybe SavingsPlansUtilizationAggregates,
    -- | The response's http status code.
    GetSavingsPlansUtilizationDetailsResponse -> Int
httpStatus :: Prelude.Int,
    -- | Retrieves a single daily or monthly Savings Plans utilization rate and
    -- details for your account.
    GetSavingsPlansUtilizationDetailsResponse
-> [SavingsPlansUtilizationDetail]
savingsPlansUtilizationDetails :: [SavingsPlansUtilizationDetail],
    GetSavingsPlansUtilizationDetailsResponse -> DateInterval
timePeriod :: DateInterval
  }
  deriving (GetSavingsPlansUtilizationDetailsResponse
-> GetSavingsPlansUtilizationDetailsResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GetSavingsPlansUtilizationDetailsResponse
-> GetSavingsPlansUtilizationDetailsResponse -> Bool
$c/= :: GetSavingsPlansUtilizationDetailsResponse
-> GetSavingsPlansUtilizationDetailsResponse -> Bool
== :: GetSavingsPlansUtilizationDetailsResponse
-> GetSavingsPlansUtilizationDetailsResponse -> Bool
$c== :: GetSavingsPlansUtilizationDetailsResponse
-> GetSavingsPlansUtilizationDetailsResponse -> Bool
Prelude.Eq, ReadPrec [GetSavingsPlansUtilizationDetailsResponse]
ReadPrec GetSavingsPlansUtilizationDetailsResponse
Int -> ReadS GetSavingsPlansUtilizationDetailsResponse
ReadS [GetSavingsPlansUtilizationDetailsResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GetSavingsPlansUtilizationDetailsResponse]
$creadListPrec :: ReadPrec [GetSavingsPlansUtilizationDetailsResponse]
readPrec :: ReadPrec GetSavingsPlansUtilizationDetailsResponse
$creadPrec :: ReadPrec GetSavingsPlansUtilizationDetailsResponse
readList :: ReadS [GetSavingsPlansUtilizationDetailsResponse]
$creadList :: ReadS [GetSavingsPlansUtilizationDetailsResponse]
readsPrec :: Int -> ReadS GetSavingsPlansUtilizationDetailsResponse
$creadsPrec :: Int -> ReadS GetSavingsPlansUtilizationDetailsResponse
Prelude.Read, Int -> GetSavingsPlansUtilizationDetailsResponse -> ShowS
[GetSavingsPlansUtilizationDetailsResponse] -> ShowS
GetSavingsPlansUtilizationDetailsResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GetSavingsPlansUtilizationDetailsResponse] -> ShowS
$cshowList :: [GetSavingsPlansUtilizationDetailsResponse] -> ShowS
show :: GetSavingsPlansUtilizationDetailsResponse -> String
$cshow :: GetSavingsPlansUtilizationDetailsResponse -> String
showsPrec :: Int -> GetSavingsPlansUtilizationDetailsResponse -> ShowS
$cshowsPrec :: Int -> GetSavingsPlansUtilizationDetailsResponse -> ShowS
Prelude.Show, forall x.
Rep GetSavingsPlansUtilizationDetailsResponse x
-> GetSavingsPlansUtilizationDetailsResponse
forall x.
GetSavingsPlansUtilizationDetailsResponse
-> Rep GetSavingsPlansUtilizationDetailsResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep GetSavingsPlansUtilizationDetailsResponse x
-> GetSavingsPlansUtilizationDetailsResponse
$cfrom :: forall x.
GetSavingsPlansUtilizationDetailsResponse
-> Rep GetSavingsPlansUtilizationDetailsResponse x
Prelude.Generic)

-- |
-- Create a value of 'GetSavingsPlansUtilizationDetailsResponse' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'nextToken', 'getSavingsPlansUtilizationDetailsResponse_nextToken' - The token to retrieve the next set of results. Amazon Web Services
-- provides the token when the response from a previous call has more
-- results than the maximum page size.
--
-- 'total', 'getSavingsPlansUtilizationDetailsResponse_total' - The total Savings Plans utilization, regardless of time period.
--
-- 'httpStatus', 'getSavingsPlansUtilizationDetailsResponse_httpStatus' - The response's http status code.
--
-- 'savingsPlansUtilizationDetails', 'getSavingsPlansUtilizationDetailsResponse_savingsPlansUtilizationDetails' - Retrieves a single daily or monthly Savings Plans utilization rate and
-- details for your account.
--
-- 'timePeriod', 'getSavingsPlansUtilizationDetailsResponse_timePeriod' - Undocumented member.
newGetSavingsPlansUtilizationDetailsResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  -- | 'timePeriod'
  DateInterval ->
  GetSavingsPlansUtilizationDetailsResponse
newGetSavingsPlansUtilizationDetailsResponse :: Int -> DateInterval -> GetSavingsPlansUtilizationDetailsResponse
newGetSavingsPlansUtilizationDetailsResponse
  Int
pHttpStatus_
  DateInterval
pTimePeriod_ =
    GetSavingsPlansUtilizationDetailsResponse'
      { $sel:nextToken:GetSavingsPlansUtilizationDetailsResponse' :: Maybe Text
nextToken =
          forall a. Maybe a
Prelude.Nothing,
        $sel:total:GetSavingsPlansUtilizationDetailsResponse' :: Maybe SavingsPlansUtilizationAggregates
total = forall a. Maybe a
Prelude.Nothing,
        $sel:httpStatus:GetSavingsPlansUtilizationDetailsResponse' :: Int
httpStatus = Int
pHttpStatus_,
        $sel:savingsPlansUtilizationDetails:GetSavingsPlansUtilizationDetailsResponse' :: [SavingsPlansUtilizationDetail]
savingsPlansUtilizationDetails =
          forall a. Monoid a => a
Prelude.mempty,
        $sel:timePeriod:GetSavingsPlansUtilizationDetailsResponse' :: DateInterval
timePeriod = DateInterval
pTimePeriod_
      }

-- | The token to retrieve the next set of results. Amazon Web Services
-- provides the token when the response from a previous call has more
-- results than the maximum page size.
getSavingsPlansUtilizationDetailsResponse_nextToken :: Lens.Lens' GetSavingsPlansUtilizationDetailsResponse (Prelude.Maybe Prelude.Text)
getSavingsPlansUtilizationDetailsResponse_nextToken :: Lens' GetSavingsPlansUtilizationDetailsResponse (Maybe Text)
getSavingsPlansUtilizationDetailsResponse_nextToken = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetSavingsPlansUtilizationDetailsResponse' {Maybe Text
nextToken :: Maybe Text
$sel:nextToken:GetSavingsPlansUtilizationDetailsResponse' :: GetSavingsPlansUtilizationDetailsResponse -> Maybe Text
nextToken} -> Maybe Text
nextToken) (\s :: GetSavingsPlansUtilizationDetailsResponse
s@GetSavingsPlansUtilizationDetailsResponse' {} Maybe Text
a -> GetSavingsPlansUtilizationDetailsResponse
s {$sel:nextToken:GetSavingsPlansUtilizationDetailsResponse' :: Maybe Text
nextToken = Maybe Text
a} :: GetSavingsPlansUtilizationDetailsResponse)

-- | The total Savings Plans utilization, regardless of time period.
getSavingsPlansUtilizationDetailsResponse_total :: Lens.Lens' GetSavingsPlansUtilizationDetailsResponse (Prelude.Maybe SavingsPlansUtilizationAggregates)
getSavingsPlansUtilizationDetailsResponse_total :: Lens'
  GetSavingsPlansUtilizationDetailsResponse
  (Maybe SavingsPlansUtilizationAggregates)
getSavingsPlansUtilizationDetailsResponse_total = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetSavingsPlansUtilizationDetailsResponse' {Maybe SavingsPlansUtilizationAggregates
total :: Maybe SavingsPlansUtilizationAggregates
$sel:total:GetSavingsPlansUtilizationDetailsResponse' :: GetSavingsPlansUtilizationDetailsResponse
-> Maybe SavingsPlansUtilizationAggregates
total} -> Maybe SavingsPlansUtilizationAggregates
total) (\s :: GetSavingsPlansUtilizationDetailsResponse
s@GetSavingsPlansUtilizationDetailsResponse' {} Maybe SavingsPlansUtilizationAggregates
a -> GetSavingsPlansUtilizationDetailsResponse
s {$sel:total:GetSavingsPlansUtilizationDetailsResponse' :: Maybe SavingsPlansUtilizationAggregates
total = Maybe SavingsPlansUtilizationAggregates
a} :: GetSavingsPlansUtilizationDetailsResponse)

-- | The response's http status code.
getSavingsPlansUtilizationDetailsResponse_httpStatus :: Lens.Lens' GetSavingsPlansUtilizationDetailsResponse Prelude.Int
getSavingsPlansUtilizationDetailsResponse_httpStatus :: Lens' GetSavingsPlansUtilizationDetailsResponse Int
getSavingsPlansUtilizationDetailsResponse_httpStatus = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetSavingsPlansUtilizationDetailsResponse' {Int
httpStatus :: Int
$sel:httpStatus:GetSavingsPlansUtilizationDetailsResponse' :: GetSavingsPlansUtilizationDetailsResponse -> Int
httpStatus} -> Int
httpStatus) (\s :: GetSavingsPlansUtilizationDetailsResponse
s@GetSavingsPlansUtilizationDetailsResponse' {} Int
a -> GetSavingsPlansUtilizationDetailsResponse
s {$sel:httpStatus:GetSavingsPlansUtilizationDetailsResponse' :: Int
httpStatus = Int
a} :: GetSavingsPlansUtilizationDetailsResponse)

-- | Retrieves a single daily or monthly Savings Plans utilization rate and
-- details for your account.
getSavingsPlansUtilizationDetailsResponse_savingsPlansUtilizationDetails :: Lens.Lens' GetSavingsPlansUtilizationDetailsResponse [SavingsPlansUtilizationDetail]
getSavingsPlansUtilizationDetailsResponse_savingsPlansUtilizationDetails :: Lens'
  GetSavingsPlansUtilizationDetailsResponse
  [SavingsPlansUtilizationDetail]
getSavingsPlansUtilizationDetailsResponse_savingsPlansUtilizationDetails = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetSavingsPlansUtilizationDetailsResponse' {[SavingsPlansUtilizationDetail]
savingsPlansUtilizationDetails :: [SavingsPlansUtilizationDetail]
$sel:savingsPlansUtilizationDetails:GetSavingsPlansUtilizationDetailsResponse' :: GetSavingsPlansUtilizationDetailsResponse
-> [SavingsPlansUtilizationDetail]
savingsPlansUtilizationDetails} -> [SavingsPlansUtilizationDetail]
savingsPlansUtilizationDetails) (\s :: GetSavingsPlansUtilizationDetailsResponse
s@GetSavingsPlansUtilizationDetailsResponse' {} [SavingsPlansUtilizationDetail]
a -> GetSavingsPlansUtilizationDetailsResponse
s {$sel:savingsPlansUtilizationDetails:GetSavingsPlansUtilizationDetailsResponse' :: [SavingsPlansUtilizationDetail]
savingsPlansUtilizationDetails = [SavingsPlansUtilizationDetail]
a} :: GetSavingsPlansUtilizationDetailsResponse) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | Undocumented member.
getSavingsPlansUtilizationDetailsResponse_timePeriod :: Lens.Lens' GetSavingsPlansUtilizationDetailsResponse DateInterval
getSavingsPlansUtilizationDetailsResponse_timePeriod :: Lens' GetSavingsPlansUtilizationDetailsResponse DateInterval
getSavingsPlansUtilizationDetailsResponse_timePeriod = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetSavingsPlansUtilizationDetailsResponse' {DateInterval
timePeriod :: DateInterval
$sel:timePeriod:GetSavingsPlansUtilizationDetailsResponse' :: GetSavingsPlansUtilizationDetailsResponse -> DateInterval
timePeriod} -> DateInterval
timePeriod) (\s :: GetSavingsPlansUtilizationDetailsResponse
s@GetSavingsPlansUtilizationDetailsResponse' {} DateInterval
a -> GetSavingsPlansUtilizationDetailsResponse
s {$sel:timePeriod:GetSavingsPlansUtilizationDetailsResponse' :: DateInterval
timePeriod = DateInterval
a} :: GetSavingsPlansUtilizationDetailsResponse)

instance
  Prelude.NFData
    GetSavingsPlansUtilizationDetailsResponse
  where
  rnf :: GetSavingsPlansUtilizationDetailsResponse -> ()
rnf GetSavingsPlansUtilizationDetailsResponse' {Int
[SavingsPlansUtilizationDetail]
Maybe Text
Maybe SavingsPlansUtilizationAggregates
DateInterval
timePeriod :: DateInterval
savingsPlansUtilizationDetails :: [SavingsPlansUtilizationDetail]
httpStatus :: Int
total :: Maybe SavingsPlansUtilizationAggregates
nextToken :: Maybe Text
$sel:timePeriod:GetSavingsPlansUtilizationDetailsResponse' :: GetSavingsPlansUtilizationDetailsResponse -> DateInterval
$sel:savingsPlansUtilizationDetails:GetSavingsPlansUtilizationDetailsResponse' :: GetSavingsPlansUtilizationDetailsResponse
-> [SavingsPlansUtilizationDetail]
$sel:httpStatus:GetSavingsPlansUtilizationDetailsResponse' :: GetSavingsPlansUtilizationDetailsResponse -> Int
$sel:total:GetSavingsPlansUtilizationDetailsResponse' :: GetSavingsPlansUtilizationDetailsResponse
-> Maybe SavingsPlansUtilizationAggregates
$sel:nextToken:GetSavingsPlansUtilizationDetailsResponse' :: GetSavingsPlansUtilizationDetailsResponse -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
nextToken
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe SavingsPlansUtilizationAggregates
total
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf [SavingsPlansUtilizationDetail]
savingsPlansUtilizationDetails
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf DateInterval
timePeriod