{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# 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.Types.RightsizingRecommendation
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
module Amazonka.CostExplorer.Types.RightsizingRecommendation where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import Amazonka.CostExplorer.Types.CurrentInstance
import Amazonka.CostExplorer.Types.FindingReasonCode
import Amazonka.CostExplorer.Types.ModifyRecommendationDetail
import Amazonka.CostExplorer.Types.RightsizingType
import Amazonka.CostExplorer.Types.TerminateRecommendationDetail
import qualified Amazonka.Data as Data
import qualified Amazonka.Prelude as Prelude

-- | Recommendations to rightsize resources.
--
-- /See:/ 'newRightsizingRecommendation' smart constructor.
data RightsizingRecommendation = RightsizingRecommendation'
  { -- | The account that this recommendation is for.
    RightsizingRecommendation -> Maybe Text
accountId :: Prelude.Maybe Prelude.Text,
    -- | Context regarding the current instance.
    RightsizingRecommendation -> Maybe CurrentInstance
currentInstance :: Prelude.Maybe CurrentInstance,
    -- | The list of possible reasons why the recommendation is generated, such
    -- as under- or over-utilization of specific metrics (for example, CPU,
    -- Memory, Network).
    RightsizingRecommendation -> Maybe [FindingReasonCode]
findingReasonCodes :: Prelude.Maybe [FindingReasonCode],
    -- | The details for the modification recommendations.
    RightsizingRecommendation -> Maybe ModifyRecommendationDetail
modifyRecommendationDetail :: Prelude.Maybe ModifyRecommendationDetail,
    -- | A recommendation to either terminate or modify the resource.
    RightsizingRecommendation -> Maybe RightsizingType
rightsizingType :: Prelude.Maybe RightsizingType,
    -- | The details for termination recommendations.
    RightsizingRecommendation -> Maybe TerminateRecommendationDetail
terminateRecommendationDetail :: Prelude.Maybe TerminateRecommendationDetail
  }
  deriving (RightsizingRecommendation -> RightsizingRecommendation -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RightsizingRecommendation -> RightsizingRecommendation -> Bool
$c/= :: RightsizingRecommendation -> RightsizingRecommendation -> Bool
== :: RightsizingRecommendation -> RightsizingRecommendation -> Bool
$c== :: RightsizingRecommendation -> RightsizingRecommendation -> Bool
Prelude.Eq, ReadPrec [RightsizingRecommendation]
ReadPrec RightsizingRecommendation
Int -> ReadS RightsizingRecommendation
ReadS [RightsizingRecommendation]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [RightsizingRecommendation]
$creadListPrec :: ReadPrec [RightsizingRecommendation]
readPrec :: ReadPrec RightsizingRecommendation
$creadPrec :: ReadPrec RightsizingRecommendation
readList :: ReadS [RightsizingRecommendation]
$creadList :: ReadS [RightsizingRecommendation]
readsPrec :: Int -> ReadS RightsizingRecommendation
$creadsPrec :: Int -> ReadS RightsizingRecommendation
Prelude.Read, Int -> RightsizingRecommendation -> ShowS
[RightsizingRecommendation] -> ShowS
RightsizingRecommendation -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RightsizingRecommendation] -> ShowS
$cshowList :: [RightsizingRecommendation] -> ShowS
show :: RightsizingRecommendation -> String
$cshow :: RightsizingRecommendation -> String
showsPrec :: Int -> RightsizingRecommendation -> ShowS
$cshowsPrec :: Int -> RightsizingRecommendation -> ShowS
Prelude.Show, forall x.
Rep RightsizingRecommendation x -> RightsizingRecommendation
forall x.
RightsizingRecommendation -> Rep RightsizingRecommendation x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep RightsizingRecommendation x -> RightsizingRecommendation
$cfrom :: forall x.
RightsizingRecommendation -> Rep RightsizingRecommendation x
Prelude.Generic)

-- |
-- Create a value of 'RightsizingRecommendation' 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:
--
-- 'accountId', 'rightsizingRecommendation_accountId' - The account that this recommendation is for.
--
-- 'currentInstance', 'rightsizingRecommendation_currentInstance' - Context regarding the current instance.
--
-- 'findingReasonCodes', 'rightsizingRecommendation_findingReasonCodes' - The list of possible reasons why the recommendation is generated, such
-- as under- or over-utilization of specific metrics (for example, CPU,
-- Memory, Network).
--
-- 'modifyRecommendationDetail', 'rightsizingRecommendation_modifyRecommendationDetail' - The details for the modification recommendations.
--
-- 'rightsizingType', 'rightsizingRecommendation_rightsizingType' - A recommendation to either terminate or modify the resource.
--
-- 'terminateRecommendationDetail', 'rightsizingRecommendation_terminateRecommendationDetail' - The details for termination recommendations.
newRightsizingRecommendation ::
  RightsizingRecommendation
newRightsizingRecommendation :: RightsizingRecommendation
newRightsizingRecommendation =
  RightsizingRecommendation'
    { $sel:accountId:RightsizingRecommendation' :: Maybe Text
accountId =
        forall a. Maybe a
Prelude.Nothing,
      $sel:currentInstance:RightsizingRecommendation' :: Maybe CurrentInstance
currentInstance = forall a. Maybe a
Prelude.Nothing,
      $sel:findingReasonCodes:RightsizingRecommendation' :: Maybe [FindingReasonCode]
findingReasonCodes = forall a. Maybe a
Prelude.Nothing,
      $sel:modifyRecommendationDetail:RightsizingRecommendation' :: Maybe ModifyRecommendationDetail
modifyRecommendationDetail = forall a. Maybe a
Prelude.Nothing,
      $sel:rightsizingType:RightsizingRecommendation' :: Maybe RightsizingType
rightsizingType = forall a. Maybe a
Prelude.Nothing,
      $sel:terminateRecommendationDetail:RightsizingRecommendation' :: Maybe TerminateRecommendationDetail
terminateRecommendationDetail = forall a. Maybe a
Prelude.Nothing
    }

-- | The account that this recommendation is for.
rightsizingRecommendation_accountId :: Lens.Lens' RightsizingRecommendation (Prelude.Maybe Prelude.Text)
rightsizingRecommendation_accountId :: Lens' RightsizingRecommendation (Maybe Text)
rightsizingRecommendation_accountId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RightsizingRecommendation' {Maybe Text
accountId :: Maybe Text
$sel:accountId:RightsizingRecommendation' :: RightsizingRecommendation -> Maybe Text
accountId} -> Maybe Text
accountId) (\s :: RightsizingRecommendation
s@RightsizingRecommendation' {} Maybe Text
a -> RightsizingRecommendation
s {$sel:accountId:RightsizingRecommendation' :: Maybe Text
accountId = Maybe Text
a} :: RightsizingRecommendation)

-- | Context regarding the current instance.
rightsizingRecommendation_currentInstance :: Lens.Lens' RightsizingRecommendation (Prelude.Maybe CurrentInstance)
rightsizingRecommendation_currentInstance :: Lens' RightsizingRecommendation (Maybe CurrentInstance)
rightsizingRecommendation_currentInstance = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RightsizingRecommendation' {Maybe CurrentInstance
currentInstance :: Maybe CurrentInstance
$sel:currentInstance:RightsizingRecommendation' :: RightsizingRecommendation -> Maybe CurrentInstance
currentInstance} -> Maybe CurrentInstance
currentInstance) (\s :: RightsizingRecommendation
s@RightsizingRecommendation' {} Maybe CurrentInstance
a -> RightsizingRecommendation
s {$sel:currentInstance:RightsizingRecommendation' :: Maybe CurrentInstance
currentInstance = Maybe CurrentInstance
a} :: RightsizingRecommendation)

-- | The list of possible reasons why the recommendation is generated, such
-- as under- or over-utilization of specific metrics (for example, CPU,
-- Memory, Network).
rightsizingRecommendation_findingReasonCodes :: Lens.Lens' RightsizingRecommendation (Prelude.Maybe [FindingReasonCode])
rightsizingRecommendation_findingReasonCodes :: Lens' RightsizingRecommendation (Maybe [FindingReasonCode])
rightsizingRecommendation_findingReasonCodes = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RightsizingRecommendation' {Maybe [FindingReasonCode]
findingReasonCodes :: Maybe [FindingReasonCode]
$sel:findingReasonCodes:RightsizingRecommendation' :: RightsizingRecommendation -> Maybe [FindingReasonCode]
findingReasonCodes} -> Maybe [FindingReasonCode]
findingReasonCodes) (\s :: RightsizingRecommendation
s@RightsizingRecommendation' {} Maybe [FindingReasonCode]
a -> RightsizingRecommendation
s {$sel:findingReasonCodes:RightsizingRecommendation' :: Maybe [FindingReasonCode]
findingReasonCodes = Maybe [FindingReasonCode]
a} :: RightsizingRecommendation) 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

-- | The details for the modification recommendations.
rightsizingRecommendation_modifyRecommendationDetail :: Lens.Lens' RightsizingRecommendation (Prelude.Maybe ModifyRecommendationDetail)
rightsizingRecommendation_modifyRecommendationDetail :: Lens' RightsizingRecommendation (Maybe ModifyRecommendationDetail)
rightsizingRecommendation_modifyRecommendationDetail = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RightsizingRecommendation' {Maybe ModifyRecommendationDetail
modifyRecommendationDetail :: Maybe ModifyRecommendationDetail
$sel:modifyRecommendationDetail:RightsizingRecommendation' :: RightsizingRecommendation -> Maybe ModifyRecommendationDetail
modifyRecommendationDetail} -> Maybe ModifyRecommendationDetail
modifyRecommendationDetail) (\s :: RightsizingRecommendation
s@RightsizingRecommendation' {} Maybe ModifyRecommendationDetail
a -> RightsizingRecommendation
s {$sel:modifyRecommendationDetail:RightsizingRecommendation' :: Maybe ModifyRecommendationDetail
modifyRecommendationDetail = Maybe ModifyRecommendationDetail
a} :: RightsizingRecommendation)

-- | A recommendation to either terminate or modify the resource.
rightsizingRecommendation_rightsizingType :: Lens.Lens' RightsizingRecommendation (Prelude.Maybe RightsizingType)
rightsizingRecommendation_rightsizingType :: Lens' RightsizingRecommendation (Maybe RightsizingType)
rightsizingRecommendation_rightsizingType = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RightsizingRecommendation' {Maybe RightsizingType
rightsizingType :: Maybe RightsizingType
$sel:rightsizingType:RightsizingRecommendation' :: RightsizingRecommendation -> Maybe RightsizingType
rightsizingType} -> Maybe RightsizingType
rightsizingType) (\s :: RightsizingRecommendation
s@RightsizingRecommendation' {} Maybe RightsizingType
a -> RightsizingRecommendation
s {$sel:rightsizingType:RightsizingRecommendation' :: Maybe RightsizingType
rightsizingType = Maybe RightsizingType
a} :: RightsizingRecommendation)

-- | The details for termination recommendations.
rightsizingRecommendation_terminateRecommendationDetail :: Lens.Lens' RightsizingRecommendation (Prelude.Maybe TerminateRecommendationDetail)
rightsizingRecommendation_terminateRecommendationDetail :: Lens'
  RightsizingRecommendation (Maybe TerminateRecommendationDetail)
rightsizingRecommendation_terminateRecommendationDetail = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RightsizingRecommendation' {Maybe TerminateRecommendationDetail
terminateRecommendationDetail :: Maybe TerminateRecommendationDetail
$sel:terminateRecommendationDetail:RightsizingRecommendation' :: RightsizingRecommendation -> Maybe TerminateRecommendationDetail
terminateRecommendationDetail} -> Maybe TerminateRecommendationDetail
terminateRecommendationDetail) (\s :: RightsizingRecommendation
s@RightsizingRecommendation' {} Maybe TerminateRecommendationDetail
a -> RightsizingRecommendation
s {$sel:terminateRecommendationDetail:RightsizingRecommendation' :: Maybe TerminateRecommendationDetail
terminateRecommendationDetail = Maybe TerminateRecommendationDetail
a} :: RightsizingRecommendation)

instance Data.FromJSON RightsizingRecommendation where
  parseJSON :: Value -> Parser RightsizingRecommendation
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"RightsizingRecommendation"
      ( \Object
x ->
          Maybe Text
-> Maybe CurrentInstance
-> Maybe [FindingReasonCode]
-> Maybe ModifyRecommendationDetail
-> Maybe RightsizingType
-> Maybe TerminateRecommendationDetail
-> RightsizingRecommendation
RightsizingRecommendation'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"AccountId")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"CurrentInstance")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> ( Object
x
                            forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"FindingReasonCodes"
                            forall a. Parser (Maybe a) -> a -> Parser a
Data..!= 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 -> Parser (Maybe a)
Data..:? Key
"ModifyRecommendationDetail")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"RightsizingType")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"TerminateRecommendationDetail")
      )

instance Prelude.Hashable RightsizingRecommendation where
  hashWithSalt :: Int -> RightsizingRecommendation -> Int
hashWithSalt Int
_salt RightsizingRecommendation' {Maybe [FindingReasonCode]
Maybe Text
Maybe RightsizingType
Maybe CurrentInstance
Maybe ModifyRecommendationDetail
Maybe TerminateRecommendationDetail
terminateRecommendationDetail :: Maybe TerminateRecommendationDetail
rightsizingType :: Maybe RightsizingType
modifyRecommendationDetail :: Maybe ModifyRecommendationDetail
findingReasonCodes :: Maybe [FindingReasonCode]
currentInstance :: Maybe CurrentInstance
accountId :: Maybe Text
$sel:terminateRecommendationDetail:RightsizingRecommendation' :: RightsizingRecommendation -> Maybe TerminateRecommendationDetail
$sel:rightsizingType:RightsizingRecommendation' :: RightsizingRecommendation -> Maybe RightsizingType
$sel:modifyRecommendationDetail:RightsizingRecommendation' :: RightsizingRecommendation -> Maybe ModifyRecommendationDetail
$sel:findingReasonCodes:RightsizingRecommendation' :: RightsizingRecommendation -> Maybe [FindingReasonCode]
$sel:currentInstance:RightsizingRecommendation' :: RightsizingRecommendation -> Maybe CurrentInstance
$sel:accountId:RightsizingRecommendation' :: RightsizingRecommendation -> Maybe Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
accountId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe CurrentInstance
currentInstance
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe [FindingReasonCode]
findingReasonCodes
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ModifyRecommendationDetail
modifyRecommendationDetail
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe RightsizingType
rightsizingType
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe TerminateRecommendationDetail
terminateRecommendationDetail

instance Prelude.NFData RightsizingRecommendation where
  rnf :: RightsizingRecommendation -> ()
rnf RightsizingRecommendation' {Maybe [FindingReasonCode]
Maybe Text
Maybe RightsizingType
Maybe CurrentInstance
Maybe ModifyRecommendationDetail
Maybe TerminateRecommendationDetail
terminateRecommendationDetail :: Maybe TerminateRecommendationDetail
rightsizingType :: Maybe RightsizingType
modifyRecommendationDetail :: Maybe ModifyRecommendationDetail
findingReasonCodes :: Maybe [FindingReasonCode]
currentInstance :: Maybe CurrentInstance
accountId :: Maybe Text
$sel:terminateRecommendationDetail:RightsizingRecommendation' :: RightsizingRecommendation -> Maybe TerminateRecommendationDetail
$sel:rightsizingType:RightsizingRecommendation' :: RightsizingRecommendation -> Maybe RightsizingType
$sel:modifyRecommendationDetail:RightsizingRecommendation' :: RightsizingRecommendation -> Maybe ModifyRecommendationDetail
$sel:findingReasonCodes:RightsizingRecommendation' :: RightsizingRecommendation -> Maybe [FindingReasonCode]
$sel:currentInstance:RightsizingRecommendation' :: RightsizingRecommendation -> Maybe CurrentInstance
$sel:accountId:RightsizingRecommendation' :: RightsizingRecommendation -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
accountId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe CurrentInstance
currentInstance
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe [FindingReasonCode]
findingReasonCodes
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe ModifyRecommendationDetail
modifyRecommendationDetail
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe RightsizingType
rightsizingType
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe TerminateRecommendationDetail
terminateRecommendationDetail