{-# 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.EC2.DescribeSnapshots
-- 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)
--
-- Describes one or more of the EBS snapshots available to you. Available
-- snapshots include public snapshots available for any AWS account to
-- launch, private snapshots that you own, and private snapshots owned by
-- another AWS account but for which you\'ve been given explicit create
-- volume permissions.
--
-- The create volume permissions fall into the following categories:
--
-- -   /public/: The owner of the snapshot granted create volume
--     permissions for the snapshot to the 'all' group. All AWS accounts
--     have create volume permissions for these snapshots.
-- -   /explicit/: The owner of the snapshot granted create volume
--     permissions to a specific AWS account.
-- -   /implicit/: An AWS account has implicit create volume permissions
--     for all snapshots it owns.
--
-- The list of snapshots returned can be modified by specifying snapshot
-- IDs, snapshot owners, or AWS accounts with create volume permissions. If
-- no options are specified, Amazon EC2 returns all snapshots for which you
-- have create volume permissions.
--
-- If you specify one or more snapshot IDs, only snapshots that have the
-- specified IDs are returned. If you specify an invalid snapshot ID, an
-- error is returned. If you specify a snapshot ID for which you do not
-- have access, it is not included in the returned results.
--
-- If you specify one or more snapshot owners, only snapshots from the
-- specified owners and for which you have access are returned. The results
-- can include the AWS account IDs of the specified owners, 'amazon' for
-- snapshots owned by Amazon, or 'self' for snapshots that you own.
--
-- If you specify a list of restorable users, only snapshots with create
-- snapshot permissions for those users are returned. You can specify AWS
-- account IDs (if you own the snapshots), 'self' for snapshots for which
-- you own or have explicit permissions, or 'all' for public snapshots.
--
-- If you are describing a long list of snapshots, you can paginate the
-- output to make the list more manageable. The 'MaxResults' parameter sets
-- the maximum number of results returned in a single page. If the list of
-- results exceeds your 'MaxResults' value, then that number of results is
-- returned along with a 'NextToken' value that can be passed to a
-- subsequent 'DescribeSnapshots' request to retrieve the remaining
-- results.
--
-- For more information about EBS snapshots, see
-- <http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSSnapshots.html Amazon EBS Snapshots>
-- in the /Amazon Elastic Compute Cloud User Guide/.
--
-- /See:/ <http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeSnapshots.html AWS API Reference> for DescribeSnapshots.
--
-- This operation returns paginated results.
module Network.AWS.EC2.DescribeSnapshots
    (
    -- * Creating a Request
      describeSnapshots
    , DescribeSnapshots
    -- * Request Lenses
    , dssOwnerIds
    , dssFilters
    , dssNextToken
    , dssSnapshotIds
    , dssRestorableByUserIds
    , dssDryRun
    , dssMaxResults

    -- * Destructuring the Response
    , describeSnapshotsResponse
    , DescribeSnapshotsResponse
    -- * Response Lenses
    , dssrsNextToken
    , dssrsSnapshots
    , dssrsResponseStatus
    ) where

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

-- | /See:/ 'describeSnapshots' smart constructor.
data DescribeSnapshots = DescribeSnapshots'
    { _dssOwnerIds            :: !(Maybe [Text])
    , _dssFilters             :: !(Maybe [Filter])
    , _dssNextToken           :: !(Maybe Text)
    , _dssSnapshotIds         :: !(Maybe [Text])
    , _dssRestorableByUserIds :: !(Maybe [Text])
    , _dssDryRun              :: !(Maybe Bool)
    , _dssMaxResults          :: !(Maybe Int)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'DescribeSnapshots' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'dssOwnerIds'
--
-- * 'dssFilters'
--
-- * 'dssNextToken'
--
-- * 'dssSnapshotIds'
--
-- * 'dssRestorableByUserIds'
--
-- * 'dssDryRun'
--
-- * 'dssMaxResults'
describeSnapshots
    :: DescribeSnapshots
describeSnapshots =
    DescribeSnapshots'
    { _dssOwnerIds = Nothing
    , _dssFilters = Nothing
    , _dssNextToken = Nothing
    , _dssSnapshotIds = Nothing
    , _dssRestorableByUserIds = Nothing
    , _dssDryRun = Nothing
    , _dssMaxResults = Nothing
    }

-- | Returns the snapshots owned by the specified owner. Multiple owners can
-- be specified.
dssOwnerIds :: Lens' DescribeSnapshots [Text]
dssOwnerIds = lens _dssOwnerIds (\ s a -> s{_dssOwnerIds = a}) . _Default . _Coerce;

-- | One or more filters.
--
-- -   'description' - A description of the snapshot.
--
-- -   'owner-alias' - The AWS account alias (for example, 'amazon') that
--     owns the snapshot.
--
-- -   'owner-id' - The ID of the AWS account that owns the snapshot.
--
-- -   'progress' - The progress of the snapshot, as a percentage (for
--     example, 80%).
--
-- -   'snapshot-id' - The snapshot ID.
--
-- -   'start-time' - The time stamp when the snapshot was initiated.
--
-- -   'status' - The status of the snapshot ('pending' | 'completed' |
--     'error').
--
-- -   'tag':/key/=/value/ - The key\/value combination of a tag assigned
--     to the resource.
--
-- -   'tag-key' - The key of a tag assigned to the resource. This filter
--     is independent of the 'tag-value' filter. For example, if you use
--     both the filter \"tag-key=Purpose\" and the filter \"tag-value=X\",
--     you get any resources assigned both the tag key Purpose (regardless
--     of what the tag\'s value is), and the tag value X (regardless of
--     what the tag\'s key is). If you want to list only resources where
--     Purpose is X, see the 'tag':/key/=/value/ filter.
--
-- -   'tag-value' - The value of a tag assigned to the resource. This
--     filter is independent of the 'tag-key' filter.
--
-- -   'volume-id' - The ID of the volume the snapshot is for.
--
-- -   'volume-size' - The size of the volume, in GiB.
--
dssFilters :: Lens' DescribeSnapshots [Filter]
dssFilters = lens _dssFilters (\ s a -> s{_dssFilters = a}) . _Default . _Coerce;

-- | The 'NextToken' value returned from a previous paginated
-- 'DescribeSnapshots' request where 'MaxResults' was used and the results
-- exceeded the value of that parameter. Pagination continues from the end
-- of the previous results that returned the 'NextToken' value. This value
-- is 'null' when there are no more results to return.
dssNextToken :: Lens' DescribeSnapshots (Maybe Text)
dssNextToken = lens _dssNextToken (\ s a -> s{_dssNextToken = a});

-- | One or more snapshot IDs.
--
-- Default: Describes snapshots for which you have launch permissions.
dssSnapshotIds :: Lens' DescribeSnapshots [Text]
dssSnapshotIds = lens _dssSnapshotIds (\ s a -> s{_dssSnapshotIds = a}) . _Default . _Coerce;

-- | One or more AWS accounts IDs that can create volumes from the snapshot.
dssRestorableByUserIds :: Lens' DescribeSnapshots [Text]
dssRestorableByUserIds = lens _dssRestorableByUserIds (\ s a -> s{_dssRestorableByUserIds = a}) . _Default . _Coerce;

-- | Checks whether you have the required permissions for the action, without
-- actually making the request, and provides an error response. If you have
-- the required permissions, the error response is 'DryRunOperation'.
-- Otherwise, it is 'UnauthorizedOperation'.
dssDryRun :: Lens' DescribeSnapshots (Maybe Bool)
dssDryRun = lens _dssDryRun (\ s a -> s{_dssDryRun = a});

-- | The maximum number of snapshot results returned by 'DescribeSnapshots'
-- in paginated output. When this parameter is used, 'DescribeSnapshots'
-- only returns 'MaxResults' results in a single page along with a
-- 'NextToken' response element. The remaining results of the initial
-- request can be seen by sending another 'DescribeSnapshots' request with
-- the returned 'NextToken' value. This value can be between 5 and 1000; if
-- 'MaxResults' is given a value larger than 1000, only 1000 results are
-- returned. If this parameter is not used, then 'DescribeSnapshots'
-- returns all results. You cannot specify this parameter and the snapshot
-- IDs parameter in the same request.
dssMaxResults :: Lens' DescribeSnapshots (Maybe Int)
dssMaxResults = lens _dssMaxResults (\ s a -> s{_dssMaxResults = a});

instance AWSPager DescribeSnapshots where
        page rq rs
          | stop (rs ^. dssrsNextToken) = Nothing
          | stop (rs ^. dssrsSnapshots) = Nothing
          | otherwise =
            Just $ rq & dssNextToken .~ rs ^. dssrsNextToken

instance AWSRequest DescribeSnapshots where
        type Rs DescribeSnapshots = DescribeSnapshotsResponse
        request = postQuery eC2
        response
          = receiveXML
              (\ s h x ->
                 DescribeSnapshotsResponse' <$>
                   (x .@? "nextToken") <*>
                     (x .@? "snapshotSet" .!@ mempty >>=
                        may (parseXMLList "item"))
                     <*> (pure (fromEnum s)))

instance ToHeaders DescribeSnapshots where
        toHeaders = const mempty

instance ToPath DescribeSnapshots where
        toPath = const "/"

instance ToQuery DescribeSnapshots where
        toQuery DescribeSnapshots'{..}
          = mconcat
              ["Action" =: ("DescribeSnapshots" :: ByteString),
               "Version" =: ("2015-10-01" :: ByteString),
               toQuery (toQueryList "Owner" <$> _dssOwnerIds),
               toQuery (toQueryList "Filter" <$> _dssFilters),
               "NextToken" =: _dssNextToken,
               toQuery
                 (toQueryList "SnapshotId" <$> _dssSnapshotIds),
               toQuery
                 (toQueryList "RestorableBy" <$>
                    _dssRestorableByUserIds),
               "DryRun" =: _dssDryRun,
               "MaxResults" =: _dssMaxResults]

-- | /See:/ 'describeSnapshotsResponse' smart constructor.
data DescribeSnapshotsResponse = DescribeSnapshotsResponse'
    { _dssrsNextToken      :: !(Maybe Text)
    , _dssrsSnapshots      :: !(Maybe [Snapshot])
    , _dssrsResponseStatus :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'DescribeSnapshotsResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'dssrsNextToken'
--
-- * 'dssrsSnapshots'
--
-- * 'dssrsResponseStatus'
describeSnapshotsResponse
    :: Int -- ^ 'dssrsResponseStatus'
    -> DescribeSnapshotsResponse
describeSnapshotsResponse pResponseStatus_ =
    DescribeSnapshotsResponse'
    { _dssrsNextToken = Nothing
    , _dssrsSnapshots = Nothing
    , _dssrsResponseStatus = pResponseStatus_
    }

-- | The 'NextToken' value to include in a future 'DescribeSnapshots'
-- request. When the results of a 'DescribeSnapshots' request exceed
-- 'MaxResults', this value can be used to retrieve the next page of
-- results. This value is 'null' when there are no more results to return.
dssrsNextToken :: Lens' DescribeSnapshotsResponse (Maybe Text)
dssrsNextToken = lens _dssrsNextToken (\ s a -> s{_dssrsNextToken = a});

-- | Information about the snapshots.
dssrsSnapshots :: Lens' DescribeSnapshotsResponse [Snapshot]
dssrsSnapshots = lens _dssrsSnapshots (\ s a -> s{_dssrsSnapshots = a}) . _Default . _Coerce;

-- | The response status code.
dssrsResponseStatus :: Lens' DescribeSnapshotsResponse Int
dssrsResponseStatus = lens _dssrsResponseStatus (\ s a -> s{_dssrsResponseStatus = a});