{-# LANGUAGE FlexibleContexts, RankNTypes, RecordWildCards #-}

module AWS.CloudWatch.Internal
    where

import Control.Applicative
import Data.ByteString (ByteString)
import Data.Text (Text)
import Data.Conduit
import Data.Monoid ((<>))
import Data.XML.Types (Event(..))

import AWS.Class
import AWS.Lib.Query
import AWS.Lib.Parser
import AWS.CloudWatch.Types

-- | Ver.2010-08-01
apiVersion :: ByteString
apiVersion = "2010-08-01"

type CloudWatch m a = AWS AWSContext m a

cloudWatchQuery
    :: (MonadBaseControl IO m, MonadResource m)
    => ByteString -- ^ Action
    -> [QueryParam]
    -> Consumer Event m a
    -> CloudWatch m a
cloudWatchQuery = commonQuery apiVersion

elements :: MonadThrow m
    => Text
    -> Consumer Event m a
    -> Consumer Event m [a]
elements name f = element (name <> "s") $ listConsumer name f

sinkDimension :: MonadThrow m => Consumer Event m Dimension
sinkDimension = Dimension <$> getT "Name" <*> getT "Value"

fromDimension :: Dimension -> [QueryParam]
fromDimension Dimension{..} =
    [ "Name" |= dimensionName
    , "Value" |= dimensionValue
    ]

stringifyStatistic :: Statistic -> Text
stringifyStatistic StatisticAverage     = "Average"
stringifyStatistic StatisticSum         = "Sum"
stringifyStatistic StatisticSampleCount = "SampleCount"
stringifyStatistic StatisticMaximum     = "Maximum"
stringifyStatistic StatisticMinimum     = "Minimum"