{-# LANGUAGE FlexibleContexts, RankNTypes #-}

module AWS.CloudWatch
    ( -- * CloudWatch Environment
      CloudWatch
    , runCloudWatch
    , runCloudWatchwithManager
    , setRegion
    , apiVersion
      -- * Metric
    , module AWS.CloudWatch.Metric
    , module AWS.CloudWatch.Alarm
    ) where

import Data.Text (Text)
import Data.Conduit
import Control.Monad.IO.Class (MonadIO)
import qualified Control.Monad.State as State
import qualified Network.HTTP.Conduit as HTTP
import Data.Monoid ((<>))

import AWS.Class
import AWS.Lib.Query (textToBS)

import AWS
import AWS.CloudWatch.Internal
import AWS.CloudWatch.Metric
import AWS.CloudWatch.Alarm

initialCloudWatchContext :: HTTP.Manager -> AWSContext
initialCloudWatchContext mgr = AWSContext
    { manager = mgr
    , endpoint = "monitoring.amazonaws.com"
    , lastRequestId = Nothing
    }

runCloudWatch :: MonadIO m => Credential -> CloudWatch m a -> m a
runCloudWatch = runAWS initialCloudWatchContext

runCloudWatchwithManager :: Monad m
    => HTTP.Manager -> Credential -> CloudWatch m a -> m a
runCloudWatchwithManager mgr =
    runAWSwithManager mgr initialCloudWatchContext

setRegion
    :: (MonadBaseControl IO m, MonadResource m)
    => Text -> CloudWatch m ()
setRegion region = do
    ctx <- State.get
    State.put
        ctx { endpoint =
            "monitoring." <> textToBS region <> ".amazonaws.com"
            }