{-# 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.Route53Domains.ListDomains
-- 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)
--
-- This operation returns all the domain names registered with Amazon Route 53 for the current AWS account.
--
-- This operation returns paginated results.
module Network.AWS.Route53Domains.ListDomains
    (
    -- * Creating a Request
      listDomains
    , ListDomains
    -- * Request Lenses
    , ldMarker
    , ldMaxItems

    -- * Destructuring the Response
    , listDomainsResponse
    , ListDomainsResponse
    -- * Response Lenses
    , ldrsNextPageMarker
    , ldrsResponseStatus
    , ldrsDomains
    ) where

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

-- | The ListDomains request includes the following elements.
--
-- /See:/ 'listDomains' smart constructor.
data ListDomains = ListDomains'
    { _ldMarker   :: !(Maybe Text)
    , _ldMaxItems :: !(Maybe Int)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'ListDomains' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ldMarker'
--
-- * 'ldMaxItems'
listDomains
    :: ListDomains
listDomains =
    ListDomains'
    { _ldMarker = Nothing
    , _ldMaxItems = Nothing
    }

-- | For an initial request for a list of domains, omit this element. If the number of domains that are associated with the current AWS account is greater than the value that you specified for 'MaxItems', you can use 'Marker' to return additional domains. Get the value of 'NextPageMarker' from the previous response, and submit another request that includes the value of 'NextPageMarker' in the 'Marker' element.
--
-- Type: String
--
-- Default: None
--
-- Constraints: The marker must match the value specified in the previous request.
--
-- Required: No
ldMarker :: Lens' ListDomains (Maybe Text)
ldMarker = lens _ldMarker (\ s a -> s{_ldMarker = a});

-- | Number of domains to be returned.
--
-- Type: Integer
--
-- Default: 20
--
-- Constraints: A numeral between 1 and 100.
--
-- Required: No
ldMaxItems :: Lens' ListDomains (Maybe Int)
ldMaxItems = lens _ldMaxItems (\ s a -> s{_ldMaxItems = a});

instance AWSPager ListDomains where
        page rq rs
          | stop (rs ^. ldrsNextPageMarker) = Nothing
          | stop (rs ^. ldrsDomains) = Nothing
          | otherwise =
            Just $ rq & ldMarker .~ rs ^. ldrsNextPageMarker

instance AWSRequest ListDomains where
        type Rs ListDomains = ListDomainsResponse
        request = postJSON route53Domains
        response
          = receiveJSON
              (\ s h x ->
                 ListDomainsResponse' <$>
                   (x .?> "NextPageMarker") <*> (pure (fromEnum s)) <*>
                     (x .?> "Domains" .!@ mempty))

instance Hashable ListDomains

instance NFData ListDomains

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

instance ToJSON ListDomains where
        toJSON ListDomains'{..}
          = object
              (catMaybes
                 [("Marker" .=) <$> _ldMarker,
                  ("MaxItems" .=) <$> _ldMaxItems])

instance ToPath ListDomains where
        toPath = const "/"

instance ToQuery ListDomains where
        toQuery = const mempty

-- | The ListDomains response includes the following elements.
--
-- /See:/ 'listDomainsResponse' smart constructor.
data ListDomainsResponse = ListDomainsResponse'
    { _ldrsNextPageMarker :: !(Maybe Text)
    , _ldrsResponseStatus :: !Int
    , _ldrsDomains        :: ![DomainSummary]
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'ListDomainsResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ldrsNextPageMarker'
--
-- * 'ldrsResponseStatus'
--
-- * 'ldrsDomains'
listDomainsResponse
    :: Int -- ^ 'ldrsResponseStatus'
    -> ListDomainsResponse
listDomainsResponse pResponseStatus_ =
    ListDomainsResponse'
    { _ldrsNextPageMarker = Nothing
    , _ldrsResponseStatus = pResponseStatus_
    , _ldrsDomains = mempty
    }

-- | If there are more domains than you specified for 'MaxItems' in the request, submit another request and include the value of 'NextPageMarker' in the value of 'Marker'.
--
-- Type: String
--
-- Parent: 'Operations'
ldrsNextPageMarker :: Lens' ListDomainsResponse (Maybe Text)
ldrsNextPageMarker = lens _ldrsNextPageMarker (\ s a -> s{_ldrsNextPageMarker = a});

-- | The response status code.
ldrsResponseStatus :: Lens' ListDomainsResponse Int
ldrsResponseStatus = lens _ldrsResponseStatus (\ s a -> s{_ldrsResponseStatus = a});

-- | A summary of domains.
--
-- Type: Complex type containing a list of domain summaries.
--
-- Children: 'AutoRenew', 'DomainName', 'Expiry', 'TransferLock'
ldrsDomains :: Lens' ListDomainsResponse [DomainSummary]
ldrsDomains = lens _ldrsDomains (\ s a -> s{_ldrsDomains = a}) . _Coerce;

instance NFData ListDomainsResponse