module Gitlab.Core where

import           Data.Yaml
import           Network.HTTP.Simple
import           Network.HTTP.Conduit
import           Network.HTTP.Types
import           RIO
import qualified RIO.Text                      as Text

class HasGitlabConfig a where
  gitlabConfigL :: Lens' a GitlabConfig

data GitlabConfig = GitlabConfig {
  glBaseUrl :: Text
, glToken   :: Text
} deriving (Eq, Show)

instance HasGitlabConfig GitlabConfig where
  gitlabConfigL = id

type MonadGitlab env m = (MonadReader env m, HasGitlabConfig env, MonadIO m, MonadThrow m)

gitlabRequest
  :: (MonadGitlab env m, FromJSON a)
  => ByteString
  -> ByteString
  -> RequestBody
  -> m a
gitlabRequest method path body = do
  conf     <- ask . view $ gitlabConfigL
  request' <- parseRequest $ Text.unpack $ glBaseUrl conf
  let headers =
        [ ("PRIVATE-TOKEN", fromString . Text.unpack $ glToken conf)
        , ("Content-Type" , "application/json; charset=utf-8")
        ]
  let request =
        setRequestMethod method
          $ setRequestPath ("/api/v4" <> path)
          $ setRequestHeaders headers
          $ setRequestBody body request'
  response <- httpJSON request
  return $ getResponseBody response

rParam x = urlEncode False (fromString . Text.unpack $ x)