-- | Types and functions for dealing with the API client itself.
module Strive.Client
  ( Client(..)
  , buildClient
  ) where

import Data.ByteString.Lazy (ByteString)
import Data.Text (Text, unpack)
import Network.HTTP.Client (Request, Response, httpLbs, newManager)
import Network.HTTP.Client.TLS (tlsManagerSettings)

-- | Strava V3 API client.
data Client = Client
  { Client -> String
client_accessToken :: String
  , Client -> Request -> IO (Response ByteString)
client_requester :: Request -> IO (Response ByteString)
  }

instance Show Client where
  show :: Client -> String
show Client
client = forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
    [String
"Client {client_accessToken = ", forall a. Show a => a -> String
show (Client -> String
client_accessToken Client
client), String
"}"]

-- | Build a new client using the default HTTP manager to make requests.
buildClient :: Maybe Text -> IO Client
buildClient :: Maybe Text -> IO Client
buildClient Maybe Text
accessToken = do
  Manager
manager <- ManagerSettings -> IO Manager
newManager ManagerSettings
tlsManagerSettings
  forall (m :: * -> *) a. Monad m => a -> m a
return Client
    { client_accessToken :: String
client_accessToken = forall b a. b -> (a -> b) -> Maybe a -> b
maybe String
"" Text -> String
unpack Maybe Text
accessToken
    , client_requester :: Request -> IO (Response ByteString)
client_requester = forall a b c. (a -> b -> c) -> b -> a -> c
flip Request -> Manager -> IO (Response ByteString)
httpLbs Manager
manager
    }