{-# 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.CognitoSync.ListRecords
-- Copyright   : (c) 2013-2015 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 paginated records, optionally changed after a particular sync count
-- for a dataset and identity. With Amazon Cognito Sync, each identity has
-- access only to its own data. Thus, the credentials used to make this API
-- call need to have access to the identity data.
--
-- ListRecords can be called with temporary user credentials provided by
-- Cognito Identity or with developer credentials. You should use Cognito
-- Identity credentials to make this API call.
--
-- /See:/ <http://docs.aws.amazon.com/cognitosync/latest/APIReference/API_ListRecords.html AWS API Reference> for ListRecords.
module Network.AWS.CognitoSync.ListRecords
    (
    -- * Creating a Request
      listRecords
    , ListRecords
    -- * Request Lenses
    , lrLastSyncCount
    , lrNextToken
    , lrSyncSessionToken
    , lrMaxResults
    , lrIdentityPoolId
    , lrIdentityId
    , lrDatasetName

    -- * Destructuring the Response
    , listRecordsResponse
    , ListRecordsResponse
    -- * Response Lenses
    , lrrsDatasetDeletedAfterRequestedSyncCount
    , lrrsDatasetExists
    , lrrsCount
    , lrrsRecords
    , lrrsNextToken
    , lrrsMergedDatasetNames
    , lrrsSyncSessionToken
    , lrrsLastModifiedBy
    , lrrsDatasetSyncCount
    , lrrsResponseStatus
    ) where

import           Network.AWS.CognitoSync.Types
import           Network.AWS.CognitoSync.Types.Product
import           Network.AWS.Prelude
import           Network.AWS.Request
import           Network.AWS.Response

-- | A request for a list of records.
--
-- /See:/ 'listRecords' smart constructor.
data ListRecords = ListRecords'
    { _lrLastSyncCount    :: !(Maybe Integer)
    , _lrNextToken        :: !(Maybe Text)
    , _lrSyncSessionToken :: !(Maybe Text)
    , _lrMaxResults       :: !(Maybe Int)
    , _lrIdentityPoolId   :: !Text
    , _lrIdentityId       :: !Text
    , _lrDatasetName      :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'ListRecords' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'lrLastSyncCount'
--
-- * 'lrNextToken'
--
-- * 'lrSyncSessionToken'
--
-- * 'lrMaxResults'
--
-- * 'lrIdentityPoolId'
--
-- * 'lrIdentityId'
--
-- * 'lrDatasetName'
listRecords
    :: Text -- ^ 'lrIdentityPoolId'
    -> Text -- ^ 'lrIdentityId'
    -> Text -- ^ 'lrDatasetName'
    -> ListRecords
listRecords pIdentityPoolId_ pIdentityId_ pDatasetName_ =
    ListRecords'
    { _lrLastSyncCount = Nothing
    , _lrNextToken = Nothing
    , _lrSyncSessionToken = Nothing
    , _lrMaxResults = Nothing
    , _lrIdentityPoolId = pIdentityPoolId_
    , _lrIdentityId = pIdentityId_
    , _lrDatasetName = pDatasetName_
    }

-- | The last server sync count for this record.
lrLastSyncCount :: Lens' ListRecords (Maybe Integer)
lrLastSyncCount = lens _lrLastSyncCount (\ s a -> s{_lrLastSyncCount = a});

-- | A pagination token for obtaining the next page of results.
lrNextToken :: Lens' ListRecords (Maybe Text)
lrNextToken = lens _lrNextToken (\ s a -> s{_lrNextToken = a});

-- | A token containing a session ID, identity ID, and expiration.
lrSyncSessionToken :: Lens' ListRecords (Maybe Text)
lrSyncSessionToken = lens _lrSyncSessionToken (\ s a -> s{_lrSyncSessionToken = a});

-- | The maximum number of results to be returned.
lrMaxResults :: Lens' ListRecords (Maybe Int)
lrMaxResults = lens _lrMaxResults (\ s a -> s{_lrMaxResults = a});

-- | A name-spaced GUID (for example,
-- us-east-1:23EC4050-6AEA-7089-A2DD-08002EXAMPLE) created by Amazon
-- Cognito. GUID generation is unique within a region.
lrIdentityPoolId :: Lens' ListRecords Text
lrIdentityPoolId = lens _lrIdentityPoolId (\ s a -> s{_lrIdentityPoolId = a});

-- | A name-spaced GUID (for example,
-- us-east-1:23EC4050-6AEA-7089-A2DD-08002EXAMPLE) created by Amazon
-- Cognito. GUID generation is unique within a region.
lrIdentityId :: Lens' ListRecords Text
lrIdentityId = lens _lrIdentityId (\ s a -> s{_lrIdentityId = a});

-- | A string of up to 128 characters. Allowed characters are a-z, A-Z, 0-9,
-- \'_\' (underscore), \'-\' (dash), and \'.\' (dot).
lrDatasetName :: Lens' ListRecords Text
lrDatasetName = lens _lrDatasetName (\ s a -> s{_lrDatasetName = a});

instance AWSRequest ListRecords where
        type Rs ListRecords = ListRecordsResponse
        request = get cognitoSync
        response
          = receiveJSON
              (\ s h x ->
                 ListRecordsResponse' <$>
                   (x .?> "DatasetDeletedAfterRequestedSyncCount") <*>
                     (x .?> "DatasetExists")
                     <*> (x .?> "Count")
                     <*> (x .?> "Records" .!@ mempty)
                     <*> (x .?> "NextToken")
                     <*> (x .?> "MergedDatasetNames" .!@ mempty)
                     <*> (x .?> "SyncSessionToken")
                     <*> (x .?> "LastModifiedBy")
                     <*> (x .?> "DatasetSyncCount")
                     <*> (pure (fromEnum s)))

instance ToHeaders ListRecords where
        toHeaders
          = const
              (mconcat
                 ["Content-Type" =#
                    ("application/x-amz-json-1.1" :: ByteString)])

instance ToPath ListRecords where
        toPath ListRecords'{..}
          = mconcat
              ["/identitypools/", toBS _lrIdentityPoolId,
               "/identities/", toBS _lrIdentityId, "/datasets/",
               toBS _lrDatasetName, "/records"]

instance ToQuery ListRecords where
        toQuery ListRecords'{..}
          = mconcat
              ["lastSyncCount" =: _lrLastSyncCount,
               "nextToken" =: _lrNextToken,
               "syncSessionToken" =: _lrSyncSessionToken,
               "maxResults" =: _lrMaxResults]

-- | Returned for a successful ListRecordsRequest.
--
-- /See:/ 'listRecordsResponse' smart constructor.
data ListRecordsResponse = ListRecordsResponse'
    { _lrrsDatasetDeletedAfterRequestedSyncCount :: !(Maybe Bool)
    , _lrrsDatasetExists                         :: !(Maybe Bool)
    , _lrrsCount                                 :: !(Maybe Int)
    , _lrrsRecords                               :: !(Maybe [Record])
    , _lrrsNextToken                             :: !(Maybe Text)
    , _lrrsMergedDatasetNames                    :: !(Maybe [Text])
    , _lrrsSyncSessionToken                      :: !(Maybe Text)
    , _lrrsLastModifiedBy                        :: !(Maybe Text)
    , _lrrsDatasetSyncCount                      :: !(Maybe Integer)
    , _lrrsResponseStatus                        :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'ListRecordsResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'lrrsDatasetDeletedAfterRequestedSyncCount'
--
-- * 'lrrsDatasetExists'
--
-- * 'lrrsCount'
--
-- * 'lrrsRecords'
--
-- * 'lrrsNextToken'
--
-- * 'lrrsMergedDatasetNames'
--
-- * 'lrrsSyncSessionToken'
--
-- * 'lrrsLastModifiedBy'
--
-- * 'lrrsDatasetSyncCount'
--
-- * 'lrrsResponseStatus'
listRecordsResponse
    :: Int -- ^ 'lrrsResponseStatus'
    -> ListRecordsResponse
listRecordsResponse pResponseStatus_ =
    ListRecordsResponse'
    { _lrrsDatasetDeletedAfterRequestedSyncCount = Nothing
    , _lrrsDatasetExists = Nothing
    , _lrrsCount = Nothing
    , _lrrsRecords = Nothing
    , _lrrsNextToken = Nothing
    , _lrrsMergedDatasetNames = Nothing
    , _lrrsSyncSessionToken = Nothing
    , _lrrsLastModifiedBy = Nothing
    , _lrrsDatasetSyncCount = Nothing
    , _lrrsResponseStatus = pResponseStatus_
    }

-- | A boolean value specifying whether to delete the dataset locally.
lrrsDatasetDeletedAfterRequestedSyncCount :: Lens' ListRecordsResponse (Maybe Bool)
lrrsDatasetDeletedAfterRequestedSyncCount = lens _lrrsDatasetDeletedAfterRequestedSyncCount (\ s a -> s{_lrrsDatasetDeletedAfterRequestedSyncCount = a});

-- | Indicates whether the dataset exists.
lrrsDatasetExists :: Lens' ListRecordsResponse (Maybe Bool)
lrrsDatasetExists = lens _lrrsDatasetExists (\ s a -> s{_lrrsDatasetExists = a});

-- | Total number of records.
lrrsCount :: Lens' ListRecordsResponse (Maybe Int)
lrrsCount = lens _lrrsCount (\ s a -> s{_lrrsCount = a});

-- | A list of all records.
lrrsRecords :: Lens' ListRecordsResponse [Record]
lrrsRecords = lens _lrrsRecords (\ s a -> s{_lrrsRecords = a}) . _Default . _Coerce;

-- | A pagination token for obtaining the next page of results.
lrrsNextToken :: Lens' ListRecordsResponse (Maybe Text)
lrrsNextToken = lens _lrrsNextToken (\ s a -> s{_lrrsNextToken = a});

-- | Names of merged datasets.
lrrsMergedDatasetNames :: Lens' ListRecordsResponse [Text]
lrrsMergedDatasetNames = lens _lrrsMergedDatasetNames (\ s a -> s{_lrrsMergedDatasetNames = a}) . _Default . _Coerce;

-- | A token containing a session ID, identity ID, and expiration.
lrrsSyncSessionToken :: Lens' ListRecordsResponse (Maybe Text)
lrrsSyncSessionToken = lens _lrrsSyncSessionToken (\ s a -> s{_lrrsSyncSessionToken = a});

-- | The user\/device that made the last change to this record.
lrrsLastModifiedBy :: Lens' ListRecordsResponse (Maybe Text)
lrrsLastModifiedBy = lens _lrrsLastModifiedBy (\ s a -> s{_lrrsLastModifiedBy = a});

-- | Server sync count for this dataset.
lrrsDatasetSyncCount :: Lens' ListRecordsResponse (Maybe Integer)
lrrsDatasetSyncCount = lens _lrrsDatasetSyncCount (\ s a -> s{_lrrsDatasetSyncCount = a});

-- | The response status code.
lrrsResponseStatus :: Lens' ListRecordsResponse Int
lrrsResponseStatus = lens _lrrsResponseStatus (\ s a -> s{_lrrsResponseStatus = a});
