{-# 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.S3.ListObjectVersions
-- 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)
--
-- Returns metadata about all of the versions of objects in a bucket.
--
-- /See:/ <http://docs.aws.amazon.com/AmazonS3/latest/API/ListObjectVersions.html AWS API Reference> for ListObjectVersions.
--
-- This operation returns paginated results.
module Network.AWS.S3.ListObjectVersions
    (
    -- * Creating a Request
      listObjectVersions
    , ListObjectVersions
    -- * Request Lenses
    , lovKeyMarker
    , lovPrefix
    , lovEncodingType
    , lovVersionIdMarker
    , lovMaxKeys
    , lovDelimiter
    , lovBucket

    -- * Destructuring the Response
    , listObjectVersionsResponse
    , ListObjectVersionsResponse
    -- * Response Lenses
    , lovrsNextVersionIdMarker
    , lovrsKeyMarker
    , lovrsDeleteMarkers
    , lovrsPrefix
    , lovrsCommonPrefixes
    , lovrsEncodingType
    , lovrsVersions
    , lovrsName
    , lovrsNextKeyMarker
    , lovrsVersionIdMarker
    , lovrsMaxKeys
    , lovrsIsTruncated
    , lovrsDelimiter
    , lovrsResponseStatus
    ) where

import           Network.AWS.Pager
import           Network.AWS.Prelude
import           Network.AWS.Request
import           Network.AWS.Response
import           Network.AWS.S3.Types
import           Network.AWS.S3.Types.Product

-- | /See:/ 'listObjectVersions' smart constructor.
data ListObjectVersions = ListObjectVersions'
    { _lovKeyMarker       :: !(Maybe Text)
    , _lovPrefix          :: !(Maybe Text)
    , _lovEncodingType    :: !(Maybe EncodingType)
    , _lovVersionIdMarker :: !(Maybe Text)
    , _lovMaxKeys         :: !(Maybe Int)
    , _lovDelimiter       :: !(Maybe Delimiter)
    , _lovBucket          :: !BucketName
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'ListObjectVersions' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'lovKeyMarker'
--
-- * 'lovPrefix'
--
-- * 'lovEncodingType'
--
-- * 'lovVersionIdMarker'
--
-- * 'lovMaxKeys'
--
-- * 'lovDelimiter'
--
-- * 'lovBucket'
listObjectVersions
    :: BucketName -- ^ 'lovBucket'
    -> ListObjectVersions
listObjectVersions pBucket_ =
    ListObjectVersions'
    { _lovKeyMarker = Nothing
    , _lovPrefix = Nothing
    , _lovEncodingType = Nothing
    , _lovVersionIdMarker = Nothing
    , _lovMaxKeys = Nothing
    , _lovDelimiter = Nothing
    , _lovBucket = pBucket_
    }

-- | Specifies the key to start with when listing objects in a bucket.
lovKeyMarker :: Lens' ListObjectVersions (Maybe Text)
lovKeyMarker = lens _lovKeyMarker (\ s a -> s{_lovKeyMarker = a});

-- | Limits the response to keys that begin with the specified prefix.
lovPrefix :: Lens' ListObjectVersions (Maybe Text)
lovPrefix = lens _lovPrefix (\ s a -> s{_lovPrefix = a});

-- | Undocumented member.
lovEncodingType :: Lens' ListObjectVersions (Maybe EncodingType)
lovEncodingType = lens _lovEncodingType (\ s a -> s{_lovEncodingType = a});

-- | Specifies the object version you want to start listing from.
lovVersionIdMarker :: Lens' ListObjectVersions (Maybe Text)
lovVersionIdMarker = lens _lovVersionIdMarker (\ s a -> s{_lovVersionIdMarker = a});

-- | Sets the maximum number of keys returned in the response. The response
-- might contain fewer keys but will never contain more.
lovMaxKeys :: Lens' ListObjectVersions (Maybe Int)
lovMaxKeys = lens _lovMaxKeys (\ s a -> s{_lovMaxKeys = a});

-- | A delimiter is a character you use to group keys.
lovDelimiter :: Lens' ListObjectVersions (Maybe Delimiter)
lovDelimiter = lens _lovDelimiter (\ s a -> s{_lovDelimiter = a});

-- | Undocumented member.
lovBucket :: Lens' ListObjectVersions BucketName
lovBucket = lens _lovBucket (\ s a -> s{_lovBucket = a});

instance AWSPager ListObjectVersions where
        page rq rs
          | stop (rs ^. lovrsIsTruncated) = Nothing
          | isNothing (rs ^. lovrsNextKeyMarker) &&
              isNothing (rs ^. lovrsNextVersionIdMarker)
            = Nothing
          | otherwise =
            Just $ rq & lovKeyMarker .~ rs ^. lovrsNextKeyMarker
              &
              lovVersionIdMarker .~ rs ^. lovrsNextVersionIdMarker

instance AWSRequest ListObjectVersions where
        type Rs ListObjectVersions =
             ListObjectVersionsResponse
        request = get s3
        response
          = receiveXML
              (\ s h x ->
                 ListObjectVersionsResponse' <$>
                   (x .@? "NextVersionIdMarker") <*> (x .@? "KeyMarker")
                     <*> (may (parseXMLList "DeleteMarker") x)
                     <*> (x .@? "Prefix")
                     <*> (may (parseXMLList "CommonPrefixes") x)
                     <*> (x .@? "EncodingType")
                     <*> (may (parseXMLList "Version") x)
                     <*> (x .@? "Name")
                     <*> (x .@? "NextKeyMarker")
                     <*> (x .@? "VersionIdMarker")
                     <*> (x .@? "MaxKeys")
                     <*> (x .@? "IsTruncated")
                     <*> (x .@? "Delimiter")
                     <*> (pure (fromEnum s)))

instance ToHeaders ListObjectVersions where
        toHeaders = const mempty

instance ToPath ListObjectVersions where
        toPath ListObjectVersions'{..}
          = mconcat ["/", toBS _lovBucket]

instance ToQuery ListObjectVersions where
        toQuery ListObjectVersions'{..}
          = mconcat
              ["key-marker" =: _lovKeyMarker,
               "prefix" =: _lovPrefix,
               "encoding-type" =: _lovEncodingType,
               "version-id-marker" =: _lovVersionIdMarker,
               "max-keys" =: _lovMaxKeys,
               "delimiter" =: _lovDelimiter, "versions"]

-- | /See:/ 'listObjectVersionsResponse' smart constructor.
data ListObjectVersionsResponse = ListObjectVersionsResponse'
    { _lovrsNextVersionIdMarker :: !(Maybe Text)
    , _lovrsKeyMarker           :: !(Maybe Text)
    , _lovrsDeleteMarkers       :: !(Maybe [DeleteMarkerEntry])
    , _lovrsPrefix              :: !(Maybe Text)
    , _lovrsCommonPrefixes      :: !(Maybe [CommonPrefix])
    , _lovrsEncodingType        :: !(Maybe EncodingType)
    , _lovrsVersions            :: !(Maybe [ObjectVersion])
    , _lovrsName                :: !(Maybe BucketName)
    , _lovrsNextKeyMarker       :: !(Maybe Text)
    , _lovrsVersionIdMarker     :: !(Maybe Text)
    , _lovrsMaxKeys             :: !(Maybe Int)
    , _lovrsIsTruncated         :: !(Maybe Bool)
    , _lovrsDelimiter           :: !(Maybe Delimiter)
    , _lovrsResponseStatus      :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'ListObjectVersionsResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'lovrsNextVersionIdMarker'
--
-- * 'lovrsKeyMarker'
--
-- * 'lovrsDeleteMarkers'
--
-- * 'lovrsPrefix'
--
-- * 'lovrsCommonPrefixes'
--
-- * 'lovrsEncodingType'
--
-- * 'lovrsVersions'
--
-- * 'lovrsName'
--
-- * 'lovrsNextKeyMarker'
--
-- * 'lovrsVersionIdMarker'
--
-- * 'lovrsMaxKeys'
--
-- * 'lovrsIsTruncated'
--
-- * 'lovrsDelimiter'
--
-- * 'lovrsResponseStatus'
listObjectVersionsResponse
    :: Int -- ^ 'lovrsResponseStatus'
    -> ListObjectVersionsResponse
listObjectVersionsResponse pResponseStatus_ =
    ListObjectVersionsResponse'
    { _lovrsNextVersionIdMarker = Nothing
    , _lovrsKeyMarker = Nothing
    , _lovrsDeleteMarkers = Nothing
    , _lovrsPrefix = Nothing
    , _lovrsCommonPrefixes = Nothing
    , _lovrsEncodingType = Nothing
    , _lovrsVersions = Nothing
    , _lovrsName = Nothing
    , _lovrsNextKeyMarker = Nothing
    , _lovrsVersionIdMarker = Nothing
    , _lovrsMaxKeys = Nothing
    , _lovrsIsTruncated = Nothing
    , _lovrsDelimiter = Nothing
    , _lovrsResponseStatus = pResponseStatus_
    }

-- | Use this value for the next version id marker parameter in a subsequent
-- request.
lovrsNextVersionIdMarker :: Lens' ListObjectVersionsResponse (Maybe Text)
lovrsNextVersionIdMarker = lens _lovrsNextVersionIdMarker (\ s a -> s{_lovrsNextVersionIdMarker = a});

-- | Marks the last Key returned in a truncated response.
lovrsKeyMarker :: Lens' ListObjectVersionsResponse (Maybe Text)
lovrsKeyMarker = lens _lovrsKeyMarker (\ s a -> s{_lovrsKeyMarker = a});

-- | Undocumented member.
lovrsDeleteMarkers :: Lens' ListObjectVersionsResponse [DeleteMarkerEntry]
lovrsDeleteMarkers = lens _lovrsDeleteMarkers (\ s a -> s{_lovrsDeleteMarkers = a}) . _Default . _Coerce;

-- | Undocumented member.
lovrsPrefix :: Lens' ListObjectVersionsResponse (Maybe Text)
lovrsPrefix = lens _lovrsPrefix (\ s a -> s{_lovrsPrefix = a});

-- | Undocumented member.
lovrsCommonPrefixes :: Lens' ListObjectVersionsResponse [CommonPrefix]
lovrsCommonPrefixes = lens _lovrsCommonPrefixes (\ s a -> s{_lovrsCommonPrefixes = a}) . _Default . _Coerce;

-- | Encoding type used by Amazon S3 to encode object keys in the response.
lovrsEncodingType :: Lens' ListObjectVersionsResponse (Maybe EncodingType)
lovrsEncodingType = lens _lovrsEncodingType (\ s a -> s{_lovrsEncodingType = a});

-- | Undocumented member.
lovrsVersions :: Lens' ListObjectVersionsResponse [ObjectVersion]
lovrsVersions = lens _lovrsVersions (\ s a -> s{_lovrsVersions = a}) . _Default . _Coerce;

-- | Undocumented member.
lovrsName :: Lens' ListObjectVersionsResponse (Maybe BucketName)
lovrsName = lens _lovrsName (\ s a -> s{_lovrsName = a});

-- | Use this value for the key marker request parameter in a subsequent
-- request.
lovrsNextKeyMarker :: Lens' ListObjectVersionsResponse (Maybe Text)
lovrsNextKeyMarker = lens _lovrsNextKeyMarker (\ s a -> s{_lovrsNextKeyMarker = a});

-- | Undocumented member.
lovrsVersionIdMarker :: Lens' ListObjectVersionsResponse (Maybe Text)
lovrsVersionIdMarker = lens _lovrsVersionIdMarker (\ s a -> s{_lovrsVersionIdMarker = a});

-- | Undocumented member.
lovrsMaxKeys :: Lens' ListObjectVersionsResponse (Maybe Int)
lovrsMaxKeys = lens _lovrsMaxKeys (\ s a -> s{_lovrsMaxKeys = a});

-- | A flag that indicates whether or not Amazon S3 returned all of the
-- results that satisfied the search criteria. If your results were
-- truncated, you can make a follow-up paginated request using the
-- NextKeyMarker and NextVersionIdMarker response parameters as a starting
-- place in another request to return the rest of the results.
lovrsIsTruncated :: Lens' ListObjectVersionsResponse (Maybe Bool)
lovrsIsTruncated = lens _lovrsIsTruncated (\ s a -> s{_lovrsIsTruncated = a});

-- | Undocumented member.
lovrsDelimiter :: Lens' ListObjectVersionsResponse (Maybe Delimiter)
lovrsDelimiter = lens _lovrsDelimiter (\ s a -> s{_lovrsDelimiter = a});

-- | The response status code.
lovrsResponseStatus :: Lens' ListObjectVersionsResponse Int
lovrsResponseStatus = lens _lovrsResponseStatus (\ s a -> s{_lovrsResponseStatus = a});