{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards   #-}

module Google.Cloud.Internal.HTTP where


import Control.Monad.Reader
import Control.Monad.Except

import Data.ByteString (ByteString)
import Data.ByteString.Lazy (toStrict)

import Data.Aeson

import Network.HTTP.Types.Header
import Network.HTTP.Client

import Google.Cloud.Internal.Types



runRequest :: Request -> Cloud ByteString
runRequest req = do
    manager <- asks hManager
    cloudIO $ do
        res <- httpLbs req manager
        return $ toStrict $ responseBody res


post :: String -> RequestHeaders -> ByteString -> Cloud ByteString
post url headers body = do
    req <- cloudIO $ do
        req <- parseUrl url
        return $ req
            { method         = "POST"
            , requestHeaders = headers
            , requestBody    = RequestBodyBS body
            }

    runRequest req


get :: String -> RequestHeaders -> Cloud ByteString
get url headers = do
    req <- cloudIO $ do
        req <- parseUrl url
        return $ req
            { method         = "GET"
            , requestHeaders = headers
            }

    runRequest req


getJSON :: (FromJSON a) => String -> RequestHeaders -> Cloud a
getJSON url headers = do
    body <- get url headers
    case eitherDecodeStrict body of
        Left e -> throwError $ DecodeError e
        Right r -> return r