{-# LANGUAGE OverloadedStrings #-}

module Prosper.Internal.Request where

import           Network.Http.Client
import           OpenSSL
import           System.IO.Streams     (InputStream)

import           Data.ByteString       (ByteString)
import qualified Data.ByteString.Char8 as C
import           Data.Monoid           ((<>))

import           Prosper.User

apiUrl :: ByteString
apiUrl = "api.prosper.com"

issueRequest
    :: User
    -> ByteString
    -> Method
    -> ContentType
    -> (Response -> InputStream ByteString -> IO a)
    -> [(ByteString, ByteString)]
    -> IO a
issueRequest (User user pass) url method ct handler params = withOpenSSL $ do
    ctx <- baselineContextSSL
    con <- openConnectionSSL ctx apiUrl 443
    req <- buildRequest $ do
        http method $ "/api/" <> url
        setAuthorizationBasic user pass
        setContentType ct
    sendRequest con req (setBody params)
    resp <- receiveResponse con handler
    closeConnection con
    return resp
  where
    setBody [] = emptyBody
    setBody xs = encodedFormBody xs