{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric      #-}
{-# LANGUAGE OverloadedStrings  #-}
{-# LANGUAGE RecordWildCards    #-}
{-# LANGUAGE TypeFamilies       #-}

{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

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

-- |
-- Module      : Network.AWS.WAF.GetSampledRequests
-- Copyright   : (c) 2013-2016 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Gets detailed information about a specified number of requests--a
-- sample--that AWS WAF randomly selects from among the first 5,000
-- requests that your AWS resource received during a time range that you
-- choose. You can specify a sample size of up to 100 requests, and you can
-- specify any time range in the previous three hours.
--
-- 'GetSampledRequests' returns a time range, which is usually the time
-- range that you specified. However, if your resource (such as a
-- CloudFront distribution) received 5,000 requests before the specified
-- time range elapsed, 'GetSampledRequests' returns an updated time range.
-- This new time range indicates the actual period during which AWS WAF
-- selected the requests in the sample.
module Network.AWS.WAF.GetSampledRequests
    (
    -- * Creating a Request
      getSampledRequests
    , GetSampledRequests
    -- * Request Lenses
    , gsrWebACLId
    , gsrRuleId
    , gsrTimeWindow
    , gsrMaxItems

    -- * Destructuring the Response
    , getSampledRequestsResponse
    , GetSampledRequestsResponse
    -- * Response Lenses
    , gsrrsSampledRequests
    , gsrrsPopulationSize
    , gsrrsTimeWindow
    , gsrrsResponseStatus
    ) where

import           Network.AWS.Lens
import           Network.AWS.Prelude
import           Network.AWS.Request
import           Network.AWS.Response
import           Network.AWS.WAF.Types
import           Network.AWS.WAF.Types.Product

-- | /See:/ 'getSampledRequests' smart constructor.
data GetSampledRequests = GetSampledRequests'
    { _gsrWebACLId   :: !Text
    , _gsrRuleId     :: !Text
    , _gsrTimeWindow :: !TimeWindow
    , _gsrMaxItems   :: !Nat
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'GetSampledRequests' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gsrWebACLId'
--
-- * 'gsrRuleId'
--
-- * 'gsrTimeWindow'
--
-- * 'gsrMaxItems'
getSampledRequests
    :: Text -- ^ 'gsrWebACLId'
    -> Text -- ^ 'gsrRuleId'
    -> TimeWindow -- ^ 'gsrTimeWindow'
    -> Natural -- ^ 'gsrMaxItems'
    -> GetSampledRequests
getSampledRequests pWebACLId_ pRuleId_ pTimeWindow_ pMaxItems_ =
    GetSampledRequests'
    { _gsrWebACLId = pWebACLId_
    , _gsrRuleId = pRuleId_
    , _gsrTimeWindow = pTimeWindow_
    , _gsrMaxItems = _Nat # pMaxItems_
    }

-- | The 'WebACLId' of the 'WebACL' for which you want 'GetSampledRequests'
-- to return a sample of requests.
gsrWebACLId :: Lens' GetSampledRequests Text
gsrWebACLId = lens _gsrWebACLId (\ s a -> s{_gsrWebACLId = a});

-- | 'RuleId' is one of two values:
--
-- -   The 'RuleId' of the 'Rule' for which you want 'GetSampledRequests'
--     to return a sample of requests.
-- -   'Default_Action', which causes 'GetSampledRequests' to return a
--     sample of the requests that didn\'t match any of the rules in the
--     specified 'WebACL'.
gsrRuleId :: Lens' GetSampledRequests Text
gsrRuleId = lens _gsrRuleId (\ s a -> s{_gsrRuleId = a});

-- | The start date and time and the end date and time of the range for which
-- you want 'GetSampledRequests' to return a sample of requests. Specify
-- the date and time in Unix time format (in seconds). You can specify any
-- time range in the previous three hours.
gsrTimeWindow :: Lens' GetSampledRequests TimeWindow
gsrTimeWindow = lens _gsrTimeWindow (\ s a -> s{_gsrTimeWindow = a});

-- | The number of requests that you want AWS WAF to return from among the
-- first 5,000 requests that your AWS resource received during the time
-- range. If your resource received fewer requests than the value of
-- 'MaxItems', 'GetSampledRequests' returns information about all of them.
gsrMaxItems :: Lens' GetSampledRequests Natural
gsrMaxItems = lens _gsrMaxItems (\ s a -> s{_gsrMaxItems = a}) . _Nat;

instance AWSRequest GetSampledRequests where
        type Rs GetSampledRequests =
             GetSampledRequestsResponse
        request = postJSON waf
        response
          = receiveJSON
              (\ s h x ->
                 GetSampledRequestsResponse' <$>
                   (x .?> "SampledRequests" .!@ mempty) <*>
                     (x .?> "PopulationSize")
                     <*> (x .?> "TimeWindow")
                     <*> (pure (fromEnum s)))

instance Hashable GetSampledRequests

instance ToHeaders GetSampledRequests where
        toHeaders
          = const
              (mconcat
                 ["X-Amz-Target" =#
                    ("AWSWAF_20150824.GetSampledRequests" :: ByteString),
                  "Content-Type" =#
                    ("application/x-amz-json-1.1" :: ByteString)])

instance ToJSON GetSampledRequests where
        toJSON GetSampledRequests'{..}
          = object
              (catMaybes
                 [Just ("WebAclId" .= _gsrWebACLId),
                  Just ("RuleId" .= _gsrRuleId),
                  Just ("TimeWindow" .= _gsrTimeWindow),
                  Just ("MaxItems" .= _gsrMaxItems)])

instance ToPath GetSampledRequests where
        toPath = const "/"

instance ToQuery GetSampledRequests where
        toQuery = const mempty

-- | /See:/ 'getSampledRequestsResponse' smart constructor.
data GetSampledRequestsResponse = GetSampledRequestsResponse'
    { _gsrrsSampledRequests :: !(Maybe [SampledHTTPRequest])
    , _gsrrsPopulationSize  :: !(Maybe Integer)
    , _gsrrsTimeWindow      :: !(Maybe TimeWindow)
    , _gsrrsResponseStatus  :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'GetSampledRequestsResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gsrrsSampledRequests'
--
-- * 'gsrrsPopulationSize'
--
-- * 'gsrrsTimeWindow'
--
-- * 'gsrrsResponseStatus'
getSampledRequestsResponse
    :: Int -- ^ 'gsrrsResponseStatus'
    -> GetSampledRequestsResponse
getSampledRequestsResponse pResponseStatus_ =
    GetSampledRequestsResponse'
    { _gsrrsSampledRequests = Nothing
    , _gsrrsPopulationSize = Nothing
    , _gsrrsTimeWindow = Nothing
    , _gsrrsResponseStatus = pResponseStatus_
    }

-- | A complex type that contains detailed information about each of the
-- requests in the sample.
gsrrsSampledRequests :: Lens' GetSampledRequestsResponse [SampledHTTPRequest]
gsrrsSampledRequests = lens _gsrrsSampledRequests (\ s a -> s{_gsrrsSampledRequests = a}) . _Default . _Coerce;

-- | The total number of requests from which 'GetSampledRequests' got a
-- sample of 'MaxItems' requests. If 'PopulationSize' is less than
-- 'MaxItems', the sample includes every request that your AWS resource
-- received during the specified time range.
gsrrsPopulationSize :: Lens' GetSampledRequestsResponse (Maybe Integer)
gsrrsPopulationSize = lens _gsrrsPopulationSize (\ s a -> s{_gsrrsPopulationSize = a});

-- | Usually, 'TimeWindow' is the time range that you specified in the
-- 'GetSampledRequests' request. However, if your AWS resource received
-- more than 5,000 requests during the time range that you specified in the
-- request, 'GetSampledRequests' returns the time range for the first 5,000
-- requests.
gsrrsTimeWindow :: Lens' GetSampledRequestsResponse (Maybe TimeWindow)
gsrrsTimeWindow = lens _gsrrsTimeWindow (\ s a -> s{_gsrrsTimeWindow = a});

-- | The response status code.
gsrrsResponseStatus :: Lens' GetSampledRequestsResponse Int
gsrrsResponseStatus = lens _gsrrsResponseStatus (\ s a -> s{_gsrrsResponseStatus = a});