{-# LANGUAGE OverloadedLabels  #-}
{-# LANGUAGE OverloadedStrings #-}

module Drone.Endpoints.Node where

import           Data.Text        (Text)
import           Drone.Client
import           Drone.Types
import           Lens.Micro       ((^.))
import           Network.HTTP.Req

getNode :: (MonadHttp m, Client c) => c -> Text -> m (JsonResponse Node)
getNode c name = req GET url NoReqBody jsonResponse opt
  where
    url = mkUrl c $ format (paths ^. #pathNode) name
    opt = mkHeader c

getNodes :: (MonadHttp m, Client c) => c -> m (JsonResponse [Node])
getNodes c = req GET url NoReqBody jsonResponse opt
  where
    url = mkUrl c $ format (paths ^. #pathNodes)
    opt = mkHeader c

createNode :: (MonadHttp m, Client c) => c -> Node -> m (JsonResponse Node)
createNode c node = req POST url (ReqBodyJson node) jsonResponse opt
  where
    url = mkUrl c $ format (paths ^. #pathNodes)
    opt = mkHeader c

deleteNode ::
  (MonadHttp m, Client c) => c -> Text -> m IgnoreResponse
deleteNode c name = req DELETE url NoReqBody ignoreResponse opt
  where
    url = mkUrl c $ format (paths ^. #pathNode) name
    opt = mkHeader c

updateNode ::
  (MonadHttp m, Client c) => c -> Text -> NodePatch -> m (JsonResponse Node)
updateNode c name patch = req PATCH url (ReqBodyJson patch) jsonResponse opt
  where
    url = mkUrl c $ format (paths ^. #pathNode) name
    opt = mkHeader c