{-# LANGUAGE OverloadedStrings #-}

{-|
Downtime prevents all alerting related to specific Datadog scopes.
-}
module Network.Datadog.Downtime
( DowntimeSpec(..)
, Downtime
, minimalDowntimeSpec
, scheduleDowntime
, updateDowntime
, cancelDowntime
, loadDowntime
, loadDowntimes
, HasScope(..)
, HasSpec(..)
, HasMessage(..)
, HasStart(..)
, HasEnd(..)
, HasId'(..)
, DowntimeId
) where


import Control.Monad (void)
import Data.Aeson
import Network.HTTP.Types
import Network.Datadog.Internal

-- | Creates the most basic possible downtime specification, which just
-- contains the scope to which the downtime applies.
minimalDowntimeSpec :: Tag -> DowntimeSpec
minimalDowntimeSpec :: Tag -> DowntimeSpec
minimalDowntimeSpec = Maybe UTCTime -> Maybe UTCTime -> Maybe Text -> Tag -> DowntimeSpec
DowntimeSpec Maybe UTCTime
forall a. Maybe a
Nothing Maybe UTCTime
forall a. Maybe a
Nothing Maybe Text
forall a. Maybe a
Nothing

-- | Schedule a new downtime in Datadog.
scheduleDowntime :: Environment -> DowntimeSpec -> IO Downtime
scheduleDowntime :: Environment -> DowntimeSpec -> IO Downtime
scheduleDowntime Environment
env DowntimeSpec
dspec =
  let path :: p
path = p
"downtime"
  in Environment
-> String
-> [(String, String)]
-> StdMethod
-> Maybe ByteString
-> IO ByteString
datadogHttp Environment
env String
forall p. IsString p => p
path [] StdMethod
POST (ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString) -> ByteString -> Maybe ByteString
forall a b. (a -> b) -> a -> b
$ DowntimeSpec -> ByteString
forall a. ToJSON a => a -> ByteString
encode DowntimeSpec
dspec) IO ByteString -> (ByteString -> IO Downtime) -> IO Downtime
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
     String -> ByteString -> IO Downtime
forall a. FromJSON a => String -> ByteString -> IO a
decodeDatadog String
"scheduleDowntime"


-- | Update the specification of a downtime in Datadog.
updateDowntime :: Environment -> DowntimeId -> DowntimeSpec -> IO Downtime
updateDowntime :: Environment -> DowntimeId -> DowntimeSpec -> IO Downtime
updateDowntime Environment
env DowntimeId
did DowntimeSpec
dspec =
  let path :: String
path = String
"downtime/" String -> String -> String
forall a. [a] -> [a] -> [a]
++ DowntimeId -> String
forall a. Show a => a -> String
show DowntimeId
did
  in Environment
-> String
-> [(String, String)]
-> StdMethod
-> Maybe ByteString
-> IO ByteString
datadogHttp Environment
env String
path [] StdMethod
PUT (ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString) -> ByteString -> Maybe ByteString
forall a b. (a -> b) -> a -> b
$ DowntimeSpec -> ByteString
forall a. ToJSON a => a -> ByteString
encode DowntimeSpec
dspec) IO ByteString -> (ByteString -> IO Downtime) -> IO Downtime
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
     String -> ByteString -> IO Downtime
forall a. FromJSON a => String -> ByteString -> IO a
decodeDatadog String
"updateDowntime"


-- | Cancel scheduled downtime in Datadog.
cancelDowntime :: Environment -> DowntimeId -> IO ()
cancelDowntime :: Environment -> DowntimeId -> IO ()
cancelDowntime Environment
env DowntimeId
downtimeId =
  let path :: String
path = String
"downtime/" String -> String -> String
forall a. [a] -> [a] -> [a]
++ DowntimeId -> String
forall a. Show a => a -> String
show DowntimeId
downtimeId
  in IO ByteString -> IO ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (IO ByteString -> IO ()) -> IO ByteString -> IO ()
forall a b. (a -> b) -> a -> b
$ Environment
-> String
-> [(String, String)]
-> StdMethod
-> Maybe ByteString
-> IO ByteString
datadogHttp Environment
env String
path [] StdMethod
DELETE Maybe ByteString
forall a. Maybe a
Nothing


-- | Load a scheduled downtime from Datadog by its ID.
loadDowntime :: Environment -> DowntimeId -> IO Downtime
loadDowntime :: Environment -> DowntimeId -> IO Downtime
loadDowntime Environment
env DowntimeId
downtimeId =
  let path :: String
path = String
"downtime/" String -> String -> String
forall a. [a] -> [a] -> [a]
++ DowntimeId -> String
forall a. Show a => a -> String
show DowntimeId
downtimeId
  in Environment
-> String
-> [(String, String)]
-> StdMethod
-> Maybe ByteString
-> IO ByteString
datadogHttp Environment
env String
path [] StdMethod
GET Maybe ByteString
forall a. Maybe a
Nothing IO ByteString -> (ByteString -> IO Downtime) -> IO Downtime
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
     String -> ByteString -> IO Downtime
forall a. FromJSON a => String -> ByteString -> IO a
decodeDatadog String
"loadDowntime"


-- | Load all scheduled downtimes, optionally filtering for only downtimes that
-- are currently active.
loadDowntimes :: Environment -> Bool -> IO [Downtime]
loadDowntimes :: Environment -> Bool -> IO [Downtime]
loadDowntimes Environment
env Bool
active =
  let path :: p
path = p
"downtime"
      q :: [(String, String)]
q = [(String
"current_only", String
"true") | Bool
active]
  in Environment
-> String
-> [(String, String)]
-> StdMethod
-> Maybe ByteString
-> IO ByteString
datadogHttp Environment
env String
forall p. IsString p => p
path [(String, String)]
q StdMethod
GET Maybe ByteString
forall a. Maybe a
Nothing IO ByteString -> (ByteString -> IO [Downtime]) -> IO [Downtime]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
     String -> ByteString -> IO [Downtime]
forall a. FromJSON a => String -> ByteString -> IO a
decodeDatadog String
"loadDowntimes"