{-# 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.ECS.ListTaskDefinitionFamilies
-- 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)
--
-- Returns a list of task definition families that are registered to your account (which may include task definition families that no longer have any 'ACTIVE' task definition revisions).
--
-- You can filter out task definition families that do not contain any 'ACTIVE' task definition revisions by setting the 'status' parameter to 'ACTIVE'. You can also filter the results with the 'familyPrefix' parameter.
--
-- This operation returns paginated results.
module Network.AWS.ECS.ListTaskDefinitionFamilies
    (
    -- * Creating a Request
      listTaskDefinitionFamilies
    , ListTaskDefinitionFamilies
    -- * Request Lenses
    , ltdfStatus
    , ltdfFamilyPrefix
    , ltdfNextToken
    , ltdfMaxResults

    -- * Destructuring the Response
    , listTaskDefinitionFamiliesResponse
    , ListTaskDefinitionFamiliesResponse
    -- * Response Lenses
    , ltdfrsFamilies
    , ltdfrsNextToken
    , ltdfrsResponseStatus
    ) where

import           Network.AWS.ECS.Types
import           Network.AWS.ECS.Types.Product
import           Network.AWS.Lens
import           Network.AWS.Pager
import           Network.AWS.Prelude
import           Network.AWS.Request
import           Network.AWS.Response

-- | /See:/ 'listTaskDefinitionFamilies' smart constructor.
data ListTaskDefinitionFamilies = ListTaskDefinitionFamilies'
    { _ltdfStatus       :: !(Maybe TaskDefinitionFamilyStatus)
    , _ltdfFamilyPrefix :: !(Maybe Text)
    , _ltdfNextToken    :: !(Maybe Text)
    , _ltdfMaxResults   :: !(Maybe Int)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'ListTaskDefinitionFamilies' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ltdfStatus'
--
-- * 'ltdfFamilyPrefix'
--
-- * 'ltdfNextToken'
--
-- * 'ltdfMaxResults'
listTaskDefinitionFamilies
    :: ListTaskDefinitionFamilies
listTaskDefinitionFamilies =
    ListTaskDefinitionFamilies'
    { _ltdfStatus = Nothing
    , _ltdfFamilyPrefix = Nothing
    , _ltdfNextToken = Nothing
    , _ltdfMaxResults = Nothing
    }

-- | The task definition family status with which to filter the 'ListTaskDefinitionFamilies' results. By default, both 'ACTIVE' and 'INACTIVE' task definition families are listed. If this parameter is set to 'ACTIVE', only task definition families that have an 'ACTIVE' task definition revision are returned. If this parameter is set to 'INACTIVE', only task definition families that do not have any 'ACTIVE' task definition revisions are returned. If you paginate the resulting output, be sure to keep the 'status' value constant in each subsequent request.
ltdfStatus :: Lens' ListTaskDefinitionFamilies (Maybe TaskDefinitionFamilyStatus)
ltdfStatus = lens _ltdfStatus (\ s a -> s{_ltdfStatus = a});

-- | The 'familyPrefix' is a string that is used to filter the results of 'ListTaskDefinitionFamilies'. If you specify a 'familyPrefix', only task definition family names that begin with the 'familyPrefix' string are returned.
ltdfFamilyPrefix :: Lens' ListTaskDefinitionFamilies (Maybe Text)
ltdfFamilyPrefix = lens _ltdfFamilyPrefix (\ s a -> s{_ltdfFamilyPrefix = a});

-- | The 'nextToken' value returned from a previous paginated 'ListTaskDefinitionFamilies' request where 'maxResults' was used and the results exceeded the value of that parameter. Pagination continues from the end of the previous results that returned the 'nextToken' value. This value is 'null' when there are no more results to return.
--
-- This token should be treated as an opaque identifier that is only used to retrieve the next items in a list and not for other programmatic purposes.
ltdfNextToken :: Lens' ListTaskDefinitionFamilies (Maybe Text)
ltdfNextToken = lens _ltdfNextToken (\ s a -> s{_ltdfNextToken = a});

-- | The maximum number of task definition family results returned by 'ListTaskDefinitionFamilies' in paginated output. When this parameter is used, 'ListTaskDefinitions' only returns 'maxResults' results in a single page along with a 'nextToken' response element. The remaining results of the initial request can be seen by sending another 'ListTaskDefinitionFamilies' request with the returned 'nextToken' value. This value can be between 1 and 100. If this parameter is not used, then 'ListTaskDefinitionFamilies' returns up to 100 results and a 'nextToken' value if applicable.
ltdfMaxResults :: Lens' ListTaskDefinitionFamilies (Maybe Int)
ltdfMaxResults = lens _ltdfMaxResults (\ s a -> s{_ltdfMaxResults = a});

instance AWSPager ListTaskDefinitionFamilies where
        page rq rs
          | stop (rs ^. ltdfrsNextToken) = Nothing
          | stop (rs ^. ltdfrsFamilies) = Nothing
          | otherwise =
            Just $ rq & ltdfNextToken .~ rs ^. ltdfrsNextToken

instance AWSRequest ListTaskDefinitionFamilies where
        type Rs ListTaskDefinitionFamilies =
             ListTaskDefinitionFamiliesResponse
        request = postJSON ecs
        response
          = receiveJSON
              (\ s h x ->
                 ListTaskDefinitionFamiliesResponse' <$>
                   (x .?> "families" .!@ mempty) <*> (x .?> "nextToken")
                     <*> (pure (fromEnum s)))

instance Hashable ListTaskDefinitionFamilies

instance NFData ListTaskDefinitionFamilies

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

instance ToJSON ListTaskDefinitionFamilies where
        toJSON ListTaskDefinitionFamilies'{..}
          = object
              (catMaybes
                 [("status" .=) <$> _ltdfStatus,
                  ("familyPrefix" .=) <$> _ltdfFamilyPrefix,
                  ("nextToken" .=) <$> _ltdfNextToken,
                  ("maxResults" .=) <$> _ltdfMaxResults])

instance ToPath ListTaskDefinitionFamilies where
        toPath = const "/"

instance ToQuery ListTaskDefinitionFamilies where
        toQuery = const mempty

-- | /See:/ 'listTaskDefinitionFamiliesResponse' smart constructor.
data ListTaskDefinitionFamiliesResponse = ListTaskDefinitionFamiliesResponse'
    { _ltdfrsFamilies       :: !(Maybe [Text])
    , _ltdfrsNextToken      :: !(Maybe Text)
    , _ltdfrsResponseStatus :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'ListTaskDefinitionFamiliesResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ltdfrsFamilies'
--
-- * 'ltdfrsNextToken'
--
-- * 'ltdfrsResponseStatus'
listTaskDefinitionFamiliesResponse
    :: Int -- ^ 'ltdfrsResponseStatus'
    -> ListTaskDefinitionFamiliesResponse
listTaskDefinitionFamiliesResponse pResponseStatus_ =
    ListTaskDefinitionFamiliesResponse'
    { _ltdfrsFamilies = Nothing
    , _ltdfrsNextToken = Nothing
    , _ltdfrsResponseStatus = pResponseStatus_
    }

-- | The list of task definition family names that match the 'ListTaskDefinitionFamilies' request.
ltdfrsFamilies :: Lens' ListTaskDefinitionFamiliesResponse [Text]
ltdfrsFamilies = lens _ltdfrsFamilies (\ s a -> s{_ltdfrsFamilies = a}) . _Default . _Coerce;

-- | The 'nextToken' value to include in a future 'ListTaskDefinitionFamilies' request. When the results of a 'ListTaskDefinitionFamilies' request exceed 'maxResults', this value can be used to retrieve the next page of results. This value is 'null' when there are no more results to return.
ltdfrsNextToken :: Lens' ListTaskDefinitionFamiliesResponse (Maybe Text)
ltdfrsNextToken = lens _ltdfrsNextToken (\ s a -> s{_ltdfrsNextToken = a});

-- | The response status code.
ltdfrsResponseStatus :: Lens' ListTaskDefinitionFamiliesResponse Int
ltdfrsResponseStatus = lens _ltdfrsResponseStatus (\ s a -> s{_ltdfrsResponseStatus = a});

instance NFData ListTaskDefinitionFamiliesResponse