{-# LANGUAGE FlexibleContexts #-}

module AWS.EC2.Volume
    ( describeVolumes
    ) where

import Data.Text (Text)

import Data.XML.Types (Event)
import Data.Conduit
import Control.Monad.Trans.Control (MonadBaseControl)
import Control.Applicative

import AWS.EC2.Types
import AWS.EC2.Class
import AWS.EC2.Query
import AWS.EC2.Parser
import AWS.Util

describeVolumes
    :: (MonadResource m, MonadBaseControl IO m)
    => [Text] -- ^ VolumeIds
    -> [Filter] -- ^ Filters
    -> EC2 m (Source m Volume)
describeVolumes vids filters =
    ec2QuerySource "DescribeVolumes" params volumeSet
  where
    params =
        [ ArrayParams "VolumeId" vids
        , FilterParams filters
        ]
    volumeSet :: MonadThrow m
        => GLConduit Event m Volume
    volumeSet = itemConduit "volumeSet" $
        volume
        <$> getT "volumeId"
        <*> getF "size" textToInt
        <*> getMT "snapshotId"
        <*> getT "availabilityZone"
        <*> getF "status" volumeStatus
        <*> getF "createTime" textToTime
        <*> itemsSet "attachmentSet" (
            attachment
            <$> getT "volumeId"
            <*> getT "instanceId"
            <*> getT "device"
            <*> getF "status" attachmentStatus
            <*> getF "attachTime" textToTime
            <*> getF "deleteOnTermination" textToBool
            )
        <*> resourceTagSink
        <*> volumeTypeSink