{-# LANGUAGE OverloadedStrings, TemplateHaskell #-}
-- | Dashboard API.
module Web.Mackerel.Api.Dashboard
  ( listDashboards
  , getDashboard
  , createDashboard
  , updateDashboard
  , deleteDashboard
  ) where

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.Dashboard

data ListDashboardsResponse = ListDashboardsResponse { responseDashboards :: [Dashboard] }
$(deriveJSON options ''ListDashboardsResponse)

listDashboards :: Client -> IO (Either ApiError [Dashboard])
listDashboards client
  = request client GET "/api/v0/dashboards" [] emptyBody (createHandler responseDashboards)

getDashboard :: Client -> DashboardId -> IO (Either ApiError Dashboard)
getDashboard client (DashboardId dashboardId')
  = request client GET ("/api/v0/dashboards/" <> BS.pack dashboardId') [] emptyBody (createHandler id)

createDashboard :: Client -> DashboardCreate -> IO (Either ApiError Dashboard)
createDashboard client dashboard
  = request client POST "/api/v0/dashboards" [] (Just dashboard) (createHandler id)

updateDashboard :: Client -> Dashboard -> IO (Either ApiError Dashboard)
updateDashboard client dashboard = do
  let (DashboardId dashboardId') = dashboardId dashboard
  request client PUT ("/api/v0/dashboards/" <> BS.pack dashboardId') [] (Just dashboard) (createHandler id)

deleteDashboard :: Client -> DashboardId -> IO (Either ApiError Dashboard)
deleteDashboard client (DashboardId dashboardId')
  = request client DELETE ("/api/v0/dashboards/" <> BS.pack dashboardId') [] emptyBody (createHandler id)