{-# LANGUAGE OverloadedStrings, TemplateHaskell #-}
-- | Alert API.
module Web.Mackerel.Api.Alert (listAlerts, closeAlert) where

import Data.Aeson.TH (deriveJSON)
import qualified Data.ByteString.Char8 as BS
import qualified Data.HashMap.Lazy as HM
import Data.Semigroup ((<>))
import Network.HTTP.Types (StdMethod(..))

import Web.Mackerel.Client
import Web.Mackerel.Internal.Api
import Web.Mackerel.Internal.TH
import Web.Mackerel.Types.Alert

data ListAlertsResponse = ListAlertsResponse { responseAlerts :: [Alert] }
$(deriveJSON options ''ListAlertsResponse)

listAlerts :: Client -> IO (Either ApiError [Alert])
listAlerts client
  = request client GET "/api/v0/alerts" [] emptyBody (createHandler responseAlerts)

closeAlert :: Client -> AlertId -> String -> IO (Either ApiError Alert)
closeAlert client (AlertId alertId') reason = do
  let body = Just $ HM.fromList [("reason", reason) :: (String, String)]
  request client POST ("/api/v0/alerts/" <> BS.pack alertId' <> "/close") [] body (createHandler id)