{-# LANGUAGE OverloadedStrings, TemplateHaskell #-}
-- | GraphAnnotation API.
module Web.Mackerel.Api.GraphAnnotation
  ( listGraphAnnotations
  , createGraphAnnotation
  , updateGraphAnnotation
  , deleteGraphAnnotation
  ) 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.GraphAnnotation

data ListGraphAnnotationsResponse = ListGraphAnnotationsResponse { responseGraphAnnotations :: [GraphAnnotation] }
$(deriveJSON options ''ListGraphAnnotationsResponse)

listGraphAnnotations :: Client -> String -> Integer -> Integer -> IO (Either ApiError [GraphAnnotation])
listGraphAnnotations client service from to = do
  let query = [ ("service", Just $ BS.pack service), ("from", Just $ BS.pack $ show from), ("to", Just $ BS.pack $ show to) ]
  request client GET "/api/v0/graph-annotations" query emptyBody (createHandler responseGraphAnnotations)

createGraphAnnotation :: Client -> GraphAnnotation -> IO (Either ApiError GraphAnnotation)
createGraphAnnotation client graphAnnotation
  = request client POST "/api/v0/graph-annotations" [] (Just graphAnnotation) (createHandler id)

updateGraphAnnotation :: Client -> GraphAnnotation -> IO (Either ApiError GraphAnnotation)
updateGraphAnnotation client graphAnnotation = do
  let Just (GraphAnnotationId graphAnnotationId') = graphAnnotationId graphAnnotation
  request client PUT ("/api/v0/graph-annotations/" <> BS.pack graphAnnotationId') [] (Just graphAnnotation) (createHandler id)

deleteGraphAnnotation :: Client -> GraphAnnotationId -> IO (Either ApiError GraphAnnotation)
deleteGraphAnnotation client (GraphAnnotationId graphAnnotationId')
  = request client DELETE ("/api/v0/graph-annotations/" <> BS.pack graphAnnotationId') [] emptyBody (createHandler id)