{-# 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.GuardDuty.GetFindingsStatistics
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Lists Amazon GuardDuty findings statistics for the specified detector
-- ID.
module Amazonka.GuardDuty.GetFindingsStatistics
  ( -- * Creating a Request
    GetFindingsStatistics (..),
    newGetFindingsStatistics,

    -- * Request Lenses
    getFindingsStatistics_findingCriteria,
    getFindingsStatistics_detectorId,
    getFindingsStatistics_findingStatisticTypes,

    -- * Destructuring the Response
    GetFindingsStatisticsResponse (..),
    newGetFindingsStatisticsResponse,

    -- * Response Lenses
    getFindingsStatisticsResponse_httpStatus,
    getFindingsStatisticsResponse_findingStatistics,
  )
where

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

-- | /See:/ 'newGetFindingsStatistics' smart constructor.
data GetFindingsStatistics = GetFindingsStatistics'
  { -- | Represents the criteria that is used for querying findings.
    GetFindingsStatistics -> Maybe FindingCriteria
findingCriteria :: Prelude.Maybe FindingCriteria,
    -- | The ID of the detector that specifies the GuardDuty service whose
    -- findings\' statistics you want to retrieve.
    GetFindingsStatistics -> Text
detectorId :: Prelude.Text,
    -- | The types of finding statistics to retrieve.
    GetFindingsStatistics -> [FindingStatisticType]
findingStatisticTypes :: [FindingStatisticType]
  }
  deriving (GetFindingsStatistics -> GetFindingsStatistics -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GetFindingsStatistics -> GetFindingsStatistics -> Bool
$c/= :: GetFindingsStatistics -> GetFindingsStatistics -> Bool
== :: GetFindingsStatistics -> GetFindingsStatistics -> Bool
$c== :: GetFindingsStatistics -> GetFindingsStatistics -> Bool
Prelude.Eq, ReadPrec [GetFindingsStatistics]
ReadPrec GetFindingsStatistics
Int -> ReadS GetFindingsStatistics
ReadS [GetFindingsStatistics]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GetFindingsStatistics]
$creadListPrec :: ReadPrec [GetFindingsStatistics]
readPrec :: ReadPrec GetFindingsStatistics
$creadPrec :: ReadPrec GetFindingsStatistics
readList :: ReadS [GetFindingsStatistics]
$creadList :: ReadS [GetFindingsStatistics]
readsPrec :: Int -> ReadS GetFindingsStatistics
$creadsPrec :: Int -> ReadS GetFindingsStatistics
Prelude.Read, Int -> GetFindingsStatistics -> ShowS
[GetFindingsStatistics] -> ShowS
GetFindingsStatistics -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GetFindingsStatistics] -> ShowS
$cshowList :: [GetFindingsStatistics] -> ShowS
show :: GetFindingsStatistics -> String
$cshow :: GetFindingsStatistics -> String
showsPrec :: Int -> GetFindingsStatistics -> ShowS
$cshowsPrec :: Int -> GetFindingsStatistics -> ShowS
Prelude.Show, forall x. Rep GetFindingsStatistics x -> GetFindingsStatistics
forall x. GetFindingsStatistics -> Rep GetFindingsStatistics x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep GetFindingsStatistics x -> GetFindingsStatistics
$cfrom :: forall x. GetFindingsStatistics -> Rep GetFindingsStatistics x
Prelude.Generic)

-- |
-- Create a value of 'GetFindingsStatistics' 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:
--
-- 'findingCriteria', 'getFindingsStatistics_findingCriteria' - Represents the criteria that is used for querying findings.
--
-- 'detectorId', 'getFindingsStatistics_detectorId' - The ID of the detector that specifies the GuardDuty service whose
-- findings\' statistics you want to retrieve.
--
-- 'findingStatisticTypes', 'getFindingsStatistics_findingStatisticTypes' - The types of finding statistics to retrieve.
newGetFindingsStatistics ::
  -- | 'detectorId'
  Prelude.Text ->
  GetFindingsStatistics
newGetFindingsStatistics :: Text -> GetFindingsStatistics
newGetFindingsStatistics Text
pDetectorId_ =
  GetFindingsStatistics'
    { $sel:findingCriteria:GetFindingsStatistics' :: Maybe FindingCriteria
findingCriteria =
        forall a. Maybe a
Prelude.Nothing,
      $sel:detectorId:GetFindingsStatistics' :: Text
detectorId = Text
pDetectorId_,
      $sel:findingStatisticTypes:GetFindingsStatistics' :: [FindingStatisticType]
findingStatisticTypes = forall a. Monoid a => a
Prelude.mempty
    }

-- | Represents the criteria that is used for querying findings.
getFindingsStatistics_findingCriteria :: Lens.Lens' GetFindingsStatistics (Prelude.Maybe FindingCriteria)
getFindingsStatistics_findingCriteria :: Lens' GetFindingsStatistics (Maybe FindingCriteria)
getFindingsStatistics_findingCriteria = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetFindingsStatistics' {Maybe FindingCriteria
findingCriteria :: Maybe FindingCriteria
$sel:findingCriteria:GetFindingsStatistics' :: GetFindingsStatistics -> Maybe FindingCriteria
findingCriteria} -> Maybe FindingCriteria
findingCriteria) (\s :: GetFindingsStatistics
s@GetFindingsStatistics' {} Maybe FindingCriteria
a -> GetFindingsStatistics
s {$sel:findingCriteria:GetFindingsStatistics' :: Maybe FindingCriteria
findingCriteria = Maybe FindingCriteria
a} :: GetFindingsStatistics)

-- | The ID of the detector that specifies the GuardDuty service whose
-- findings\' statistics you want to retrieve.
getFindingsStatistics_detectorId :: Lens.Lens' GetFindingsStatistics Prelude.Text
getFindingsStatistics_detectorId :: Lens' GetFindingsStatistics Text
getFindingsStatistics_detectorId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetFindingsStatistics' {Text
detectorId :: Text
$sel:detectorId:GetFindingsStatistics' :: GetFindingsStatistics -> Text
detectorId} -> Text
detectorId) (\s :: GetFindingsStatistics
s@GetFindingsStatistics' {} Text
a -> GetFindingsStatistics
s {$sel:detectorId:GetFindingsStatistics' :: Text
detectorId = Text
a} :: GetFindingsStatistics)

-- | The types of finding statistics to retrieve.
getFindingsStatistics_findingStatisticTypes :: Lens.Lens' GetFindingsStatistics [FindingStatisticType]
getFindingsStatistics_findingStatisticTypes :: Lens' GetFindingsStatistics [FindingStatisticType]
getFindingsStatistics_findingStatisticTypes = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetFindingsStatistics' {[FindingStatisticType]
findingStatisticTypes :: [FindingStatisticType]
$sel:findingStatisticTypes:GetFindingsStatistics' :: GetFindingsStatistics -> [FindingStatisticType]
findingStatisticTypes} -> [FindingStatisticType]
findingStatisticTypes) (\s :: GetFindingsStatistics
s@GetFindingsStatistics' {} [FindingStatisticType]
a -> GetFindingsStatistics
s {$sel:findingStatisticTypes:GetFindingsStatistics' :: [FindingStatisticType]
findingStatisticTypes = [FindingStatisticType]
a} :: GetFindingsStatistics) 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

instance Core.AWSRequest GetFindingsStatistics where
  type
    AWSResponse GetFindingsStatistics =
      GetFindingsStatisticsResponse
  request :: (Service -> Service)
-> GetFindingsStatistics -> Request GetFindingsStatistics
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 GetFindingsStatistics
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse GetFindingsStatistics)))
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 ->
          Int -> FindingStatistics -> GetFindingsStatisticsResponse
GetFindingsStatisticsResponse'
            forall (f :: * -> *) a b. Functor 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 a
Data..:> Key
"findingStatistics")
      )

instance Prelude.Hashable GetFindingsStatistics where
  hashWithSalt :: Int -> GetFindingsStatistics -> Int
hashWithSalt Int
_salt GetFindingsStatistics' {[FindingStatisticType]
Maybe FindingCriteria
Text
findingStatisticTypes :: [FindingStatisticType]
detectorId :: Text
findingCriteria :: Maybe FindingCriteria
$sel:findingStatisticTypes:GetFindingsStatistics' :: GetFindingsStatistics -> [FindingStatisticType]
$sel:detectorId:GetFindingsStatistics' :: GetFindingsStatistics -> Text
$sel:findingCriteria:GetFindingsStatistics' :: GetFindingsStatistics -> Maybe FindingCriteria
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe FindingCriteria
findingCriteria
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
detectorId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` [FindingStatisticType]
findingStatisticTypes

instance Prelude.NFData GetFindingsStatistics where
  rnf :: GetFindingsStatistics -> ()
rnf GetFindingsStatistics' {[FindingStatisticType]
Maybe FindingCriteria
Text
findingStatisticTypes :: [FindingStatisticType]
detectorId :: Text
findingCriteria :: Maybe FindingCriteria
$sel:findingStatisticTypes:GetFindingsStatistics' :: GetFindingsStatistics -> [FindingStatisticType]
$sel:detectorId:GetFindingsStatistics' :: GetFindingsStatistics -> Text
$sel:findingCriteria:GetFindingsStatistics' :: GetFindingsStatistics -> Maybe FindingCriteria
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe FindingCriteria
findingCriteria
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
detectorId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf [FindingStatisticType]
findingStatisticTypes

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

instance Data.ToJSON GetFindingsStatistics where
  toJSON :: GetFindingsStatistics -> Value
toJSON GetFindingsStatistics' {[FindingStatisticType]
Maybe FindingCriteria
Text
findingStatisticTypes :: [FindingStatisticType]
detectorId :: Text
findingCriteria :: Maybe FindingCriteria
$sel:findingStatisticTypes:GetFindingsStatistics' :: GetFindingsStatistics -> [FindingStatisticType]
$sel:detectorId:GetFindingsStatistics' :: GetFindingsStatistics -> Text
$sel:findingCriteria:GetFindingsStatistics' :: GetFindingsStatistics -> Maybe FindingCriteria
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"findingCriteria" 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 FindingCriteria
findingCriteria,
            forall a. a -> Maybe a
Prelude.Just
              ( Key
"findingStatisticTypes"
                  forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= [FindingStatisticType]
findingStatisticTypes
              )
          ]
      )

instance Data.ToPath GetFindingsStatistics where
  toPath :: GetFindingsStatistics -> ByteString
toPath GetFindingsStatistics' {[FindingStatisticType]
Maybe FindingCriteria
Text
findingStatisticTypes :: [FindingStatisticType]
detectorId :: Text
findingCriteria :: Maybe FindingCriteria
$sel:findingStatisticTypes:GetFindingsStatistics' :: GetFindingsStatistics -> [FindingStatisticType]
$sel:detectorId:GetFindingsStatistics' :: GetFindingsStatistics -> Text
$sel:findingCriteria:GetFindingsStatistics' :: GetFindingsStatistics -> Maybe FindingCriteria
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ ByteString
"/detector/",
        forall a. ToByteString a => a -> ByteString
Data.toBS Text
detectorId,
        ByteString
"/findings/statistics"
      ]

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

-- | /See:/ 'newGetFindingsStatisticsResponse' smart constructor.
data GetFindingsStatisticsResponse = GetFindingsStatisticsResponse'
  { -- | The response's http status code.
    GetFindingsStatisticsResponse -> Int
httpStatus :: Prelude.Int,
    -- | The finding statistics object.
    GetFindingsStatisticsResponse -> FindingStatistics
findingStatistics :: FindingStatistics
  }
  deriving (GetFindingsStatisticsResponse
-> GetFindingsStatisticsResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GetFindingsStatisticsResponse
-> GetFindingsStatisticsResponse -> Bool
$c/= :: GetFindingsStatisticsResponse
-> GetFindingsStatisticsResponse -> Bool
== :: GetFindingsStatisticsResponse
-> GetFindingsStatisticsResponse -> Bool
$c== :: GetFindingsStatisticsResponse
-> GetFindingsStatisticsResponse -> Bool
Prelude.Eq, ReadPrec [GetFindingsStatisticsResponse]
ReadPrec GetFindingsStatisticsResponse
Int -> ReadS GetFindingsStatisticsResponse
ReadS [GetFindingsStatisticsResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GetFindingsStatisticsResponse]
$creadListPrec :: ReadPrec [GetFindingsStatisticsResponse]
readPrec :: ReadPrec GetFindingsStatisticsResponse
$creadPrec :: ReadPrec GetFindingsStatisticsResponse
readList :: ReadS [GetFindingsStatisticsResponse]
$creadList :: ReadS [GetFindingsStatisticsResponse]
readsPrec :: Int -> ReadS GetFindingsStatisticsResponse
$creadsPrec :: Int -> ReadS GetFindingsStatisticsResponse
Prelude.Read, Int -> GetFindingsStatisticsResponse -> ShowS
[GetFindingsStatisticsResponse] -> ShowS
GetFindingsStatisticsResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GetFindingsStatisticsResponse] -> ShowS
$cshowList :: [GetFindingsStatisticsResponse] -> ShowS
show :: GetFindingsStatisticsResponse -> String
$cshow :: GetFindingsStatisticsResponse -> String
showsPrec :: Int -> GetFindingsStatisticsResponse -> ShowS
$cshowsPrec :: Int -> GetFindingsStatisticsResponse -> ShowS
Prelude.Show, forall x.
Rep GetFindingsStatisticsResponse x
-> GetFindingsStatisticsResponse
forall x.
GetFindingsStatisticsResponse
-> Rep GetFindingsStatisticsResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep GetFindingsStatisticsResponse x
-> GetFindingsStatisticsResponse
$cfrom :: forall x.
GetFindingsStatisticsResponse
-> Rep GetFindingsStatisticsResponse x
Prelude.Generic)

-- |
-- Create a value of 'GetFindingsStatisticsResponse' 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:
--
-- 'httpStatus', 'getFindingsStatisticsResponse_httpStatus' - The response's http status code.
--
-- 'findingStatistics', 'getFindingsStatisticsResponse_findingStatistics' - The finding statistics object.
newGetFindingsStatisticsResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  -- | 'findingStatistics'
  FindingStatistics ->
  GetFindingsStatisticsResponse
newGetFindingsStatisticsResponse :: Int -> FindingStatistics -> GetFindingsStatisticsResponse
newGetFindingsStatisticsResponse
  Int
pHttpStatus_
  FindingStatistics
pFindingStatistics_ =
    GetFindingsStatisticsResponse'
      { $sel:httpStatus:GetFindingsStatisticsResponse' :: Int
httpStatus =
          Int
pHttpStatus_,
        $sel:findingStatistics:GetFindingsStatisticsResponse' :: FindingStatistics
findingStatistics = FindingStatistics
pFindingStatistics_
      }

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

-- | The finding statistics object.
getFindingsStatisticsResponse_findingStatistics :: Lens.Lens' GetFindingsStatisticsResponse FindingStatistics
getFindingsStatisticsResponse_findingStatistics :: Lens' GetFindingsStatisticsResponse FindingStatistics
getFindingsStatisticsResponse_findingStatistics = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetFindingsStatisticsResponse' {FindingStatistics
findingStatistics :: FindingStatistics
$sel:findingStatistics:GetFindingsStatisticsResponse' :: GetFindingsStatisticsResponse -> FindingStatistics
findingStatistics} -> FindingStatistics
findingStatistics) (\s :: GetFindingsStatisticsResponse
s@GetFindingsStatisticsResponse' {} FindingStatistics
a -> GetFindingsStatisticsResponse
s {$sel:findingStatistics:GetFindingsStatisticsResponse' :: FindingStatistics
findingStatistics = FindingStatistics
a} :: GetFindingsStatisticsResponse)

instance Prelude.NFData GetFindingsStatisticsResponse where
  rnf :: GetFindingsStatisticsResponse -> ()
rnf GetFindingsStatisticsResponse' {Int
FindingStatistics
findingStatistics :: FindingStatistics
httpStatus :: Int
$sel:findingStatistics:GetFindingsStatisticsResponse' :: GetFindingsStatisticsResponse -> FindingStatistics
$sel:httpStatus:GetFindingsStatisticsResponse' :: GetFindingsStatisticsResponse -> Int
..} =
    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 FindingStatistics
findingStatistics