{-|
Module      : SimFin.Util
Description : Common utilities.
Copyright   : (c) Owen Shepherd, 2022
License     : MIT
Maintainer  : owen@owen.cafe
-}

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}

module SimFin.Util
  ( createDefaultContext
  , apiKeyEnvVariable
  ) where

import Control.Monad.IO.Class
import qualified Data.ByteString.UTF8 as BSU
import Network.HTTP.Client.TLS
import System.Environment (lookupEnv)

import SimFin.Internal

-- | The environment variable 'createDefaultContext' will try to get your
-- API key from.

apiKeyEnvVariable :: String
apiKeyEnvVariable :: String
apiKeyEnvVariable = String
"SIM_FIN_API_KEY"

-- | Try to make a new http-client manager, and parse your api key from 
-- 'apiKeyEnvVariable'.

createDefaultContext :: (MonadFail m, MonadIO m) => m SimFinContext
createDefaultContext :: m SimFinContext
createDefaultContext = do
  Manager
manager <- m Manager
forall (m :: * -> *). MonadIO m => m Manager
newTlsManager
  Maybe String
apiKeyOpt <- IO (Maybe String) -> m (Maybe String)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Maybe String) -> m (Maybe String))
-> IO (Maybe String) -> m (Maybe String)
forall a b. (a -> b) -> a -> b
$ String -> IO (Maybe String)
lookupEnv String
apiKeyEnvVariable
  case Maybe String
apiKeyOpt of
    Maybe String
Nothing -> String -> m SimFinContext
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> m SimFinContext) -> String -> m SimFinContext
forall a b. (a -> b) -> a -> b
$ String
"Couldn't find environment variable '" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
apiKeyEnvVariable String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"'"
    Just String
apiKey -> SimFinContext -> m SimFinContext
forall (f :: * -> *) a. Applicative f => a -> f a
pure (SimFinContext -> m SimFinContext)
-> SimFinContext -> m SimFinContext
forall a b. (a -> b) -> a -> b
$ ByteString -> Manager -> SimFinContext
SimFinContext (String -> ByteString
BSU.fromString String
apiKey) Manager
manager