-- | 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 = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
    [ String
"Client {client_accessToken = "
    , ShowS
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
  Client -> IO Client
forall (m :: * -> *) a. Monad m => a -> m a
return Client :: String -> (Request -> IO (Response ByteString)) -> Client
Client
    { client_accessToken :: String
client_accessToken = String -> (Text -> String) -> Maybe Text -> String
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 = (Request -> Manager -> IO (Response ByteString))
-> Manager -> Request -> IO (Response ByteString)
forall a b c. (a -> b -> c) -> b -> a -> c
flip Request -> Manager -> IO (Response ByteString)
httpLbs Manager
manager
    }