{-# LANGUAGE FlexibleContexts #-}
module AWS.RDS.Event
    ( describeEvents
    ) where

import Control.Applicative ((<$>), (<*>))
import Data.Conduit
import Data.Text (Text)
import Data.Time (UTCTime)
import qualified Data.XML.Types as XML

import AWS.Lib.Parser
import AWS.Lib.Query
import AWS.RDS.Internal
import AWS.RDS.Types
import AWS.Util (toText)

describeEvents
    :: (MonadBaseControl IO m, MonadResource m)
    => Maybe Text -- ^ SourceIdentifier
    -> Maybe SourceType -- ^ SourceType
    -> Maybe Int -- ^ Duration
    -> Maybe UTCTime -- ^ StartTime
    -> Maybe UTCTime -- ^ EndTime
    -> [Text] -- ^ EventCategories.member
    -> Maybe Text -- ^ Marker
    -> Maybe Int -- ^ MaxRecords
    -> RDS m [Event]
describeEvents sid stype d start end categories marker maxRecords =
    rdsQuery "DescribeEvents" params $
        elements "Event" eventSink
  where
    params =
        [ "SourceIdentifier" |=? sid
        , "SourceType" |=? sourceTypeToText <$> stype
        , "Duration" |=? toText <$> d
        , "StartTime" |=? toText <$> start
        , "EndTime" |=? toText <$> end
        , "EventCategories" |.+ "member" |.#= categories
        , "Marker" |=? marker
        , "MaxRecords" |=? toText <$> maxRecords
        ]

sourceTypeToText :: SourceType -> Text
sourceTypeToText SourceTypeDBInstance = "db-instance"
sourceTypeToText SourceTypeDBParameterGroup = "db-parameter-group"
sourceTypeToText SourceTypeDBSecurityGroup = "db-security-group"
sourceTypeToText SourceTypeDBSnapshot = "db-snapshot"

eventSink
    :: MonadThrow m
    => GLSink XML.Event m Event
eventSink = Event
    <$> getT "Message"
    <*> getT "SourceType"
    <*> listConsumer "EventCategories" (getT "EventCategory")
    <*> getT "Date"
    <*> getT "SourceIdentifier"