{-# LANGUAGE OverloadedStrings, TemplateHaskell #-}
-- | Monitor API.
module Web.Mackerel.Api.Monitor
  ( listMonitors
  , createMonitor
  , updateMonitor
  , deleteMonitor
  ) where

import Data.Aeson (Value)
import Data.Aeson.TH (deriveJSON)
import qualified Data.ByteString.Char8 as BS
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.Monitor

data ListMonitorsResponse = ListMonitorsResponse { responseMonitors :: [Monitor] }
$(deriveJSON options ''ListMonitorsResponse)

listMonitors :: Client -> IO (Either ApiError [Monitor])
listMonitors client
  = request client GET "/api/v0/monitors" [] emptyBody (createHandler responseMonitors)

createMonitor :: Client -> Monitor -> IO (Either ApiError Monitor)
createMonitor client monitor
  = request client POST "/api/v0/monitors" [] (Just monitor) (createHandler id)

updateMonitor :: Client -> Monitor -> IO (Either ApiError Monitor)
updateMonitor client monitor = do
  let Just (MonitorId monitorId') = monitorId monitor
  request client PUT ("/api/v0/monitors/" <> BS.pack monitorId') [] (Just monitor) (createHandler id)

deleteMonitor :: Client -> MonitorId -> IO (Either ApiError Value)
deleteMonitor client (MonitorId monitorId')
  = request client DELETE ("/api/v0/monitors/" <> BS.pack monitorId') [] emptyBody (createHandler id)