{-# LANGUAGE OverloadedStrings #-}
module Network.HTTP.Dispatch.Core
       ( HTTPRequest(..)
       , HTTPResponse(..)
       , runRequest
       , get
       , post
       , patch
       , delete
       , put
       , simpleGet
       , postString
       , postAeson
       ) where

import qualified Data.Aeson                    as Aeson (ToJSON, encode)
import qualified Data.ByteString.Lazy          as LBS
import qualified Data.ByteString.Lazy.Char8    as LBSC
import           Network.HTTP.Dispatch.Request
import           Network.HTTP.Dispatch.Types

type Url = String

-- Request API

get :: Url -> [Header] -> HTTPRequest
get url headers = HTTPRequest GET url headers Nothing

simpleGet :: Url -> HTTPRequest
simpleGet url = HTTPRequest GET url [] Nothing

-- Post request with a lazy bytestring payload
post :: Url -> [Header] -> LBS.ByteString -> HTTPRequest
post url headers body = HTTPRequest POST url headers (pure body)

-- Post request with a string payload
postString :: String -> [Header] -> String -> HTTPRequest
postString url headers body = HTTPRequest POST url headers (pure . LBSC.pack $ body)

-- Post request where the payload is some type that has a ToJSON instance defined
postAeson :: Aeson.ToJSON a => Url -> [Header] -> a -> HTTPRequest
postAeson url headers body = HTTPRequest POST url headers (pure $ Aeson.encode body)

put :: String -> [Header] -> LBS.ByteString -> HTTPRequest
put url headers body = HTTPRequest PUT url headers (pure body)

delete :: String -> [Header] -> Maybe LBS.ByteString -> HTTPRequest
delete url headers = HTTPRequest DELETE url headers

patch :: String -> [Header] -> LBS.ByteString -> HTTPRequest
patch url headers body = HTTPRequest PATCH url headers (pure body)