{-# 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.Route53.ListTrafficPolicyVersions
-- 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 information about all of the versions for a specified traffic policy. 'ListTrafficPolicyVersions' lists only versions that have not been deleted.
--
-- Amazon Route 53 returns a maximum of 100 items in each response. If you have a lot of traffic policies, you can use the 'maxitems' parameter to list them in groups of up to 100.
--
-- The response includes three values that help you navigate from one group of 'maxitems'maxitems traffic policies to the next:
--
-- -   __IsTruncated__
-- -   __TrafficPolicyVersionMarker__
-- -   __MaxItems__
module Network.AWS.Route53.ListTrafficPolicyVersions
    (
    -- * Creating a Request
      listTrafficPolicyVersions
    , ListTrafficPolicyVersions
    -- * Request Lenses
    , ltpvMaxItems
    , ltpvTrafficPolicyVersionMarker
    , ltpvId

    -- * Destructuring the Response
    , listTrafficPolicyVersionsResponse
    , ListTrafficPolicyVersionsResponse
    -- * Response Lenses
    , ltpvrsResponseStatus
    , ltpvrsTrafficPolicies
    , ltpvrsIsTruncated
    , ltpvrsTrafficPolicyVersionMarker
    , ltpvrsMaxItems
    ) where

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

-- | A complex type that contains the information about the request to list your traffic policies.
--
-- /See:/ 'listTrafficPolicyVersions' smart constructor.
data ListTrafficPolicyVersions = ListTrafficPolicyVersions'
    { _ltpvMaxItems                   :: !(Maybe Text)
    , _ltpvTrafficPolicyVersionMarker :: !(Maybe Text)
    , _ltpvId                         :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'ListTrafficPolicyVersions' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ltpvMaxItems'
--
-- * 'ltpvTrafficPolicyVersionMarker'
--
-- * 'ltpvId'
listTrafficPolicyVersions
    :: Text -- ^ 'ltpvId'
    -> ListTrafficPolicyVersions
listTrafficPolicyVersions pId_ =
    ListTrafficPolicyVersions'
    { _ltpvMaxItems = Nothing
    , _ltpvTrafficPolicyVersionMarker = Nothing
    , _ltpvId = pId_
    }

-- | The maximum number of traffic policy versions that you want Amazon Route 53 to include in the response body for this request. If the specified traffic policy has more than 'MaxItems' versions, the value of the 'IsTruncated' element in the response is 'true', and the value of the 'TrafficPolicyVersionMarker' element is the ID of the first version in the next group of 'MaxItems' traffic policy versions.
ltpvMaxItems :: Lens' ListTrafficPolicyVersions (Maybe Text)
ltpvMaxItems = lens _ltpvMaxItems (\ s a -> s{_ltpvMaxItems = a});

-- | For your first request to 'ListTrafficPolicyVersions', do not include the 'TrafficPolicyVersionMarker' parameter.
--
-- If you have more traffic policy versions than the value of 'MaxItems', 'ListTrafficPolicyVersions' returns only the first group of 'MaxItems' versions. To get the next group of 'MaxItems' traffic policy versions, submit another request to 'ListTrafficPolicyVersions'. For the value of 'TrafficPolicyVersionMarker', specify the value of the 'TrafficPolicyVersionMarker' element that was returned in the previous response.
--
-- Traffic policy versions are listed in sequential order.
ltpvTrafficPolicyVersionMarker :: Lens' ListTrafficPolicyVersions (Maybe Text)
ltpvTrafficPolicyVersionMarker = lens _ltpvTrafficPolicyVersionMarker (\ s a -> s{_ltpvTrafficPolicyVersionMarker = a});

-- | Specify the value of 'Id' of the traffic policy for which you want to list all versions.
ltpvId :: Lens' ListTrafficPolicyVersions Text
ltpvId = lens _ltpvId (\ s a -> s{_ltpvId = a});

instance AWSRequest ListTrafficPolicyVersions where
        type Rs ListTrafficPolicyVersions =
             ListTrafficPolicyVersionsResponse
        request = get route53
        response
          = receiveXML
              (\ s h x ->
                 ListTrafficPolicyVersionsResponse' <$>
                   (pure (fromEnum s)) <*>
                     (x .@? "TrafficPolicies" .!@ mempty >>=
                        parseXMLList "TrafficPolicy")
                     <*> (x .@ "IsTruncated")
                     <*> (x .@ "TrafficPolicyVersionMarker")
                     <*> (x .@ "MaxItems"))

instance Hashable ListTrafficPolicyVersions

instance NFData ListTrafficPolicyVersions

instance ToHeaders ListTrafficPolicyVersions where
        toHeaders = const mempty

instance ToPath ListTrafficPolicyVersions where
        toPath ListTrafficPolicyVersions'{..}
          = mconcat
              ["/2013-04-01/trafficpolicies/", toBS _ltpvId,
               "/versions"]

instance ToQuery ListTrafficPolicyVersions where
        toQuery ListTrafficPolicyVersions'{..}
          = mconcat
              ["maxitems" =: _ltpvMaxItems,
               "trafficpolicyversion" =:
                 _ltpvTrafficPolicyVersionMarker]

-- | A complex type that contains the response information for the request.
--
-- /See:/ 'listTrafficPolicyVersionsResponse' smart constructor.
data ListTrafficPolicyVersionsResponse = ListTrafficPolicyVersionsResponse'
    { _ltpvrsResponseStatus             :: !Int
    , _ltpvrsTrafficPolicies            :: ![TrafficPolicy]
    , _ltpvrsIsTruncated                :: !Bool
    , _ltpvrsTrafficPolicyVersionMarker :: !Text
    , _ltpvrsMaxItems                   :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'ListTrafficPolicyVersionsResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ltpvrsResponseStatus'
--
-- * 'ltpvrsTrafficPolicies'
--
-- * 'ltpvrsIsTruncated'
--
-- * 'ltpvrsTrafficPolicyVersionMarker'
--
-- * 'ltpvrsMaxItems'
listTrafficPolicyVersionsResponse
    :: Int -- ^ 'ltpvrsResponseStatus'
    -> Bool -- ^ 'ltpvrsIsTruncated'
    -> Text -- ^ 'ltpvrsTrafficPolicyVersionMarker'
    -> Text -- ^ 'ltpvrsMaxItems'
    -> ListTrafficPolicyVersionsResponse
listTrafficPolicyVersionsResponse pResponseStatus_ pIsTruncated_ pTrafficPolicyVersionMarker_ pMaxItems_ =
    ListTrafficPolicyVersionsResponse'
    { _ltpvrsResponseStatus = pResponseStatus_
    , _ltpvrsTrafficPolicies = mempty
    , _ltpvrsIsTruncated = pIsTruncated_
    , _ltpvrsTrafficPolicyVersionMarker = pTrafficPolicyVersionMarker_
    , _ltpvrsMaxItems = pMaxItems_
    }

-- | The response status code.
ltpvrsResponseStatus :: Lens' ListTrafficPolicyVersionsResponse Int
ltpvrsResponseStatus = lens _ltpvrsResponseStatus (\ s a -> s{_ltpvrsResponseStatus = a});

-- | A list that contains one 'TrafficPolicy' element for each traffic policy version that is associated with the specified traffic policy.
ltpvrsTrafficPolicies :: Lens' ListTrafficPolicyVersionsResponse [TrafficPolicy]
ltpvrsTrafficPolicies = lens _ltpvrsTrafficPolicies (\ s a -> s{_ltpvrsTrafficPolicies = a}) . _Coerce;

-- | A flag that indicates whether there are more traffic policies to be listed. If the response was truncated, you can get the next group of 'maxitems' traffic policies by calling 'ListTrafficPolicyVersions' again and specifying the value of the 'NextMarker' element in the marker parameter.
--
-- Valid Values: 'true' | 'false'
ltpvrsIsTruncated :: Lens' ListTrafficPolicyVersionsResponse Bool
ltpvrsIsTruncated = lens _ltpvrsIsTruncated (\ s a -> s{_ltpvrsIsTruncated = a});

-- | If 'IsTruncated' is 'true', the value of 'TrafficPolicyVersionMarker' identifies the first traffic policy in the next group of 'MaxItems' traffic policies. Call 'ListTrafficPolicyVersions' again and specify the value of 'TrafficPolicyVersionMarker' in the 'TrafficPolicyVersionMarker' request parameter.
--
-- This element is present only if 'IsTruncated' is 'true'.
ltpvrsTrafficPolicyVersionMarker :: Lens' ListTrafficPolicyVersionsResponse Text
ltpvrsTrafficPolicyVersionMarker = lens _ltpvrsTrafficPolicyVersionMarker (\ s a -> s{_ltpvrsTrafficPolicyVersionMarker = a});

-- | The value that you specified for the 'maxitems' parameter in the call to 'ListTrafficPolicyVersions' that produced the current response.
ltpvrsMaxItems :: Lens' ListTrafficPolicyVersionsResponse Text
ltpvrsMaxItems = lens _ltpvrsMaxItems (\ s a -> s{_ltpvrsMaxItems = a});

instance NFData ListTrafficPolicyVersionsResponse