{-# 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.IoT.ListCACertificates
-- 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)
--
-- Lists the CA certificates registered for your AWS account.
--
-- The results are paginated with a default page size of 25. You can use the returned marker to retrieve additional results.
module Network.AWS.IoT.ListCACertificates
    (
    -- * Creating a Request
      listCACertificates
    , ListCACertificates
    -- * Request Lenses
    , lcacMarker
    , lcacAscendingOrder
    , lcacPageSize

    -- * Destructuring the Response
    , listCACertificatesResponse
    , ListCACertificatesResponse
    -- * Response Lenses
    , lcacrsCertificates
    , lcacrsNextMarker
    , lcacrsResponseStatus
    ) where

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

-- | Input for the ListCACertificates operation.
--
-- /See:/ 'listCACertificates' smart constructor.
data ListCACertificates = ListCACertificates'
    { _lcacMarker         :: !(Maybe Text)
    , _lcacAscendingOrder :: !(Maybe Bool)
    , _lcacPageSize       :: !(Maybe Nat)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'ListCACertificates' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'lcacMarker'
--
-- * 'lcacAscendingOrder'
--
-- * 'lcacPageSize'
listCACertificates
    :: ListCACertificates
listCACertificates =
    ListCACertificates'
    { _lcacMarker = Nothing
    , _lcacAscendingOrder = Nothing
    , _lcacPageSize = Nothing
    }

-- | The marker for the next set of results.
lcacMarker :: Lens' ListCACertificates (Maybe Text)
lcacMarker = lens _lcacMarker (\ s a -> s{_lcacMarker = a});

-- | Determines the order of the results.
lcacAscendingOrder :: Lens' ListCACertificates (Maybe Bool)
lcacAscendingOrder = lens _lcacAscendingOrder (\ s a -> s{_lcacAscendingOrder = a});

-- | The result page size.
lcacPageSize :: Lens' ListCACertificates (Maybe Natural)
lcacPageSize = lens _lcacPageSize (\ s a -> s{_lcacPageSize = a}) . mapping _Nat;

instance AWSRequest ListCACertificates where
        type Rs ListCACertificates =
             ListCACertificatesResponse
        request = get ioT
        response
          = receiveJSON
              (\ s h x ->
                 ListCACertificatesResponse' <$>
                   (x .?> "certificates" .!@ mempty) <*>
                     (x .?> "nextMarker")
                     <*> (pure (fromEnum s)))

instance Hashable ListCACertificates

instance NFData ListCACertificates

instance ToHeaders ListCACertificates where
        toHeaders = const mempty

instance ToPath ListCACertificates where
        toPath = const "/cacertificates"

instance ToQuery ListCACertificates where
        toQuery ListCACertificates'{..}
          = mconcat
              ["marker" =: _lcacMarker,
               "isAscendingOrder" =: _lcacAscendingOrder,
               "pageSize" =: _lcacPageSize]

-- | The output from the ListCACertificates operation.
--
-- /See:/ 'listCACertificatesResponse' smart constructor.
data ListCACertificatesResponse = ListCACertificatesResponse'
    { _lcacrsCertificates   :: !(Maybe [CACertificate])
    , _lcacrsNextMarker     :: !(Maybe Text)
    , _lcacrsResponseStatus :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'ListCACertificatesResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'lcacrsCertificates'
--
-- * 'lcacrsNextMarker'
--
-- * 'lcacrsResponseStatus'
listCACertificatesResponse
    :: Int -- ^ 'lcacrsResponseStatus'
    -> ListCACertificatesResponse
listCACertificatesResponse pResponseStatus_ =
    ListCACertificatesResponse'
    { _lcacrsCertificates = Nothing
    , _lcacrsNextMarker = Nothing
    , _lcacrsResponseStatus = pResponseStatus_
    }

-- | The CA certificates registered in your AWS account.
lcacrsCertificates :: Lens' ListCACertificatesResponse [CACertificate]
lcacrsCertificates = lens _lcacrsCertificates (\ s a -> s{_lcacrsCertificates = a}) . _Default . _Coerce;

-- | The current position within the list of CA certificates.
lcacrsNextMarker :: Lens' ListCACertificatesResponse (Maybe Text)
lcacrsNextMarker = lens _lcacrsNextMarker (\ s a -> s{_lcacrsNextMarker = a});

-- | The response status code.
lcacrsResponseStatus :: Lens' ListCACertificatesResponse Int
lcacrsResponseStatus = lens _lcacrsResponseStatus (\ s a -> s{_lcacrsResponseStatus = a});

instance NFData ListCACertificatesResponse