{-# 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.SNS.ListPlatformApplications
-- 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 platform application objects for the supported push notification services, such as APNS and GCM. The results for 'ListPlatformApplications' are paginated and return a limited list of applications, up to 100. If additional records are available after the first page results, then a NextToken string will be returned. To receive the next page, you call 'ListPlatformApplications' using the NextToken string received from the previous call. When there are no more records to return, NextToken will be null. For more information, see <http://docs.aws.amazon.com/sns/latest/dg/SNSMobilePush.html Using Amazon SNS Mobile Push Notifications>.
--
-- This operation returns paginated results.
module Network.AWS.SNS.ListPlatformApplications
    (
    -- * Creating a Request
      listPlatformApplications
    , ListPlatformApplications
    -- * Request Lenses
    , lpaNextToken

    -- * Destructuring the Response
    , listPlatformApplicationsResponse
    , ListPlatformApplicationsResponse
    -- * Response Lenses
    , lparsPlatformApplications
    , lparsNextToken
    , lparsResponseStatus
    ) where

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

-- | Input for ListPlatformApplications action.
--
-- /See:/ 'listPlatformApplications' smart constructor.
newtype ListPlatformApplications = ListPlatformApplications'
    { _lpaNextToken :: Maybe Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'ListPlatformApplications' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'lpaNextToken'
listPlatformApplications
    :: ListPlatformApplications
listPlatformApplications =
    ListPlatformApplications'
    { _lpaNextToken = Nothing
    }

-- | NextToken string is used when calling ListPlatformApplications action to retrieve additional records that are available after the first page results.
lpaNextToken :: Lens' ListPlatformApplications (Maybe Text)
lpaNextToken = lens _lpaNextToken (\ s a -> s{_lpaNextToken = a});

instance AWSPager ListPlatformApplications where
        page rq rs
          | stop (rs ^. lparsNextToken) = Nothing
          | stop (rs ^. lparsPlatformApplications) = Nothing
          | otherwise =
            Just $ rq & lpaNextToken .~ rs ^. lparsNextToken

instance AWSRequest ListPlatformApplications where
        type Rs ListPlatformApplications =
             ListPlatformApplicationsResponse
        request = postQuery sns
        response
          = receiveXMLWrapper "ListPlatformApplicationsResult"
              (\ s h x ->
                 ListPlatformApplicationsResponse' <$>
                   (x .@? "PlatformApplications" .!@ mempty >>=
                      may (parseXMLList "member"))
                     <*> (x .@? "NextToken")
                     <*> (pure (fromEnum s)))

instance Hashable ListPlatformApplications

instance NFData ListPlatformApplications

instance ToHeaders ListPlatformApplications where
        toHeaders = const mempty

instance ToPath ListPlatformApplications where
        toPath = const "/"

instance ToQuery ListPlatformApplications where
        toQuery ListPlatformApplications'{..}
          = mconcat
              ["Action" =:
                 ("ListPlatformApplications" :: ByteString),
               "Version" =: ("2010-03-31" :: ByteString),
               "NextToken" =: _lpaNextToken]

-- | Response for ListPlatformApplications action.
--
-- /See:/ 'listPlatformApplicationsResponse' smart constructor.
data ListPlatformApplicationsResponse = ListPlatformApplicationsResponse'
    { _lparsPlatformApplications :: !(Maybe [PlatformApplication])
    , _lparsNextToken            :: !(Maybe Text)
    , _lparsResponseStatus       :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'ListPlatformApplicationsResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'lparsPlatformApplications'
--
-- * 'lparsNextToken'
--
-- * 'lparsResponseStatus'
listPlatformApplicationsResponse
    :: Int -- ^ 'lparsResponseStatus'
    -> ListPlatformApplicationsResponse
listPlatformApplicationsResponse pResponseStatus_ =
    ListPlatformApplicationsResponse'
    { _lparsPlatformApplications = Nothing
    , _lparsNextToken = Nothing
    , _lparsResponseStatus = pResponseStatus_
    }

-- | Platform applications returned when calling ListPlatformApplications action.
lparsPlatformApplications :: Lens' ListPlatformApplicationsResponse [PlatformApplication]
lparsPlatformApplications = lens _lparsPlatformApplications (\ s a -> s{_lparsPlatformApplications = a}) . _Default . _Coerce;

-- | NextToken string is returned when calling ListPlatformApplications action if additional records are available after the first page results.
lparsNextToken :: Lens' ListPlatformApplicationsResponse (Maybe Text)
lparsNextToken = lens _lparsNextToken (\ s a -> s{_lparsNextToken = a});

-- | The response status code.
lparsResponseStatus :: Lens' ListPlatformApplicationsResponse Int
lparsResponseStatus = lens _lparsResponseStatus (\ s a -> s{_lparsResponseStatus = a});

instance NFData ListPlatformApplicationsResponse