{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
-- | Implementation of "Imm.HTTP" based on "Network.HTTP.Client".
module Imm.HTTP.Simple (defaultManager, module Reexport) where

-- {{{ Imports
import           Imm.HTTP
import           Imm.Prelude
import           Imm.Pretty

import           Control.Monad.Trans.Reader
import           Data.CaseInsensitive
import           Network.Connection         as Reexport
import           Network.HTTP.Client        as Reexport
import           Network.HTTP.Client.TLS    as Reexport
import           URI.ByteString
-- }}}

-- | Monad capable of performing HTTP GET requests.
instance MonadHttpClient (ReaderT Manager IO) where
  httpGet uri = do
    manager <- ask
    lift $ httpGet' manager uri

-- | Default manager uses TLS and no proxy
defaultManager :: IO Manager
defaultManager = newManager $ mkManagerSettings (TLSSettingsSimple False False False) Nothing


-- | Perform an HTTP GET request and return the response body
httpGet' :: Manager -> URI -> IO LByteString
httpGet' manager uri = do
  request <- makeRequest uri
  responseBody <$> httpLbs request manager
    -- codec'   <- reader $ view (config.codec)
    -- return $ response $=+ decode codec'

parseRequest' :: (MonadThrow m) => URI -> m Request
parseRequest' = parseRequest . show . prettyURI

-- | Build an HTTP request for given URI
makeRequest :: URI -> IO Request
makeRequest uri = do
  req <- parseRequest' uri
  return $ req { requestHeaders = [
    (mk "User-Agent", "Mozilla/4.0"),
    (mk "Accept", "*/*")]}