{-# LANGUAGE DataKinds                   #-}
{-# LANGUAGE DeriveGeneric               #-}
{-# LANGUAGE FlexibleInstances           #-}
{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
{-# LANGUAGE LambdaCase                  #-}
{-# LANGUAGE NoImplicitPrelude           #-}
{-# LANGUAGE OverloadedStrings           #-}
{-# LANGUAGE RecordWildCards             #-}
{-# LANGUAGE TypeFamilies                #-}

{-# OPTIONS_GHC -fno-warn-unused-imports #-}

-- Module      : Network.AWS.EC2.DescribeVolumes
-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
-- License     : This Source Code Form is subject to the terms of
--               the Mozilla Public License, v. 2.0.
--               A copy of the MPL can be found in the LICENSE file or
--               you can obtain it at http://mozilla.org/MPL/2.0/.
-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--
-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- | Describes the specified Amazon EBS volumes.
--
-- If you are describing a long list of volumes, 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 'DescribeVolumes' request to retrieve
-- the remaining results.
--
-- For more information about Amazon EBS volumes, see <http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSVolumes.html Amazon EBS Volumes> in the /Amazon Elastic Compute Cloud User Guide for Linux/.
--
-- <http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeVolumes.html>
module Network.AWS.EC2.DescribeVolumes
    (
    -- * Request
      DescribeVolumes
    -- ** Request constructor
    , describeVolumes
    -- ** Request lenses
    , dv2DryRun
    , dv2Filters
    , dv2MaxResults
    , dv2NextToken
    , dv2VolumeIds

    -- * Response
    , DescribeVolumesResponse
    -- ** Response constructor
    , describeVolumesResponse
    -- ** Response lenses
    , dvrNextToken
    , dvrVolumes
    ) where

import Network.AWS.Prelude
import Network.AWS.Request.Query
import Network.AWS.EC2.Types
import qualified GHC.Exts

data DescribeVolumes = DescribeVolumes
    { _dv2DryRun     :: Maybe Bool
    , _dv2Filters    :: List "Filter" Filter
    , _dv2MaxResults :: Maybe Int
    , _dv2NextToken  :: Maybe Text
    , _dv2VolumeIds  :: List "VolumeId" Text
    } deriving (Eq, Read, Show)

-- | 'DescribeVolumes' constructor.
--
-- The fields accessible through corresponding lenses are:
--
-- * 'dv2DryRun' @::@ 'Maybe' 'Bool'
--
-- * 'dv2Filters' @::@ ['Filter']
--
-- * 'dv2MaxResults' @::@ 'Maybe' 'Int'
--
-- * 'dv2NextToken' @::@ 'Maybe' 'Text'
--
-- * 'dv2VolumeIds' @::@ ['Text']
--
describeVolumes :: DescribeVolumes
describeVolumes = DescribeVolumes
    { _dv2DryRun     = Nothing
    , _dv2VolumeIds  = mempty
    , _dv2Filters    = mempty
    , _dv2NextToken  = Nothing
    , _dv2MaxResults = Nothing
    }

dv2DryRun :: Lens' DescribeVolumes (Maybe Bool)
dv2DryRun = lens _dv2DryRun (\s a -> s { _dv2DryRun = a })

-- | One or more filters.
--
-- 'attachment.attach-time' - The time stamp when the attachment initiated.
--
-- 'attachment.delete-on-termination' - Whether the volume is deleted on
-- instance termination.
--
-- 'attachment.device' - The device name that is exposed to the instance (for
-- example, '/dev/sda1').
--
-- 'attachment.instance-id' - The ID of the instance the volume is attached to.
--
-- 'attachment.status' - The attachment state ('attaching' | 'attached' | 'detaching'
-- | 'detached').
--
-- 'availability-zone' - The Availability Zone in which the volume was created.
--
-- 'create-time' - The time stamp when the volume was created.
--
-- 'encrypted' - The encryption status of the volume.
--
-- 'size' - The size of the volume, in GiB.
--
-- 'snapshot-id' - The snapshot from which the volume was created.
--
-- 'status' - The status of the volume ('creating' | 'available' | 'in-use' | 'deleting'
-- | 'deleted' | '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 volume ID.
--
-- 'volume-type' - The Amazon EBS volume type. This can be 'gp2' for General
-- Purpose (SSD) volumes, 'io1' for Provisioned IOPS (SSD) volumes, or 'standard'
-- for Magnetic volumes.
--
--
dv2Filters :: Lens' DescribeVolumes [Filter]
dv2Filters = lens _dv2Filters (\s a -> s { _dv2Filters = a }) . _List

-- | The maximum number of volume results returned by 'DescribeVolumes' in paginated
-- output. When this parameter is used, 'DescribeVolumes' 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 'DescribeVolumes' 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 'DescribeVolumes' returns all
-- results. You cannot specify this parameter and the volume IDs parameter in
-- the same request.
dv2MaxResults :: Lens' DescribeVolumes (Maybe Int)
dv2MaxResults = lens _dv2MaxResults (\s a -> s { _dv2MaxResults = a })

-- | The 'NextToken' value returned from a previous paginated 'DescribeVolumes'
-- 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.
dv2NextToken :: Lens' DescribeVolumes (Maybe Text)
dv2NextToken = lens _dv2NextToken (\s a -> s { _dv2NextToken = a })

-- | One or more volume IDs.
dv2VolumeIds :: Lens' DescribeVolumes [Text]
dv2VolumeIds = lens _dv2VolumeIds (\s a -> s { _dv2VolumeIds = a }) . _List

data DescribeVolumesResponse = DescribeVolumesResponse
    { _dvrNextToken :: Maybe Text
    , _dvrVolumes   :: List "item" Volume
    } deriving (Eq, Read, Show)

-- | 'DescribeVolumesResponse' constructor.
--
-- The fields accessible through corresponding lenses are:
--
-- * 'dvrNextToken' @::@ 'Maybe' 'Text'
--
-- * 'dvrVolumes' @::@ ['Volume']
--
describeVolumesResponse :: DescribeVolumesResponse
describeVolumesResponse = DescribeVolumesResponse
    { _dvrVolumes   = mempty
    , _dvrNextToken = Nothing
    }

-- | The 'NextToken' value to include in a future 'DescribeVolumes' request. When the
-- results of a 'DescribeVolumes' 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.
dvrNextToken :: Lens' DescribeVolumesResponse (Maybe Text)
dvrNextToken = lens _dvrNextToken (\s a -> s { _dvrNextToken = a })

dvrVolumes :: Lens' DescribeVolumesResponse [Volume]
dvrVolumes = lens _dvrVolumes (\s a -> s { _dvrVolumes = a }) . _List

instance ToPath DescribeVolumes where
    toPath = const "/"

instance ToQuery DescribeVolumes where
    toQuery DescribeVolumes{..} = mconcat
        [ "DryRun"     =? _dv2DryRun
        , "Filter"     `toQueryList` _dv2Filters
        , "MaxResults" =? _dv2MaxResults
        , "NextToken"  =? _dv2NextToken
        , "VolumeId"   `toQueryList` _dv2VolumeIds
        ]

instance ToHeaders DescribeVolumes

instance AWSRequest DescribeVolumes where
    type Sv DescribeVolumes = EC2
    type Rs DescribeVolumes = DescribeVolumesResponse

    request  = post "DescribeVolumes"
    response = xmlResponse

instance FromXML DescribeVolumesResponse where
    parseXML x = DescribeVolumesResponse
        <$> x .@? "nextToken"
        <*> x .@? "volumeSet" .!@ mempty
