module Mollie.API
    ( Mollie
    , Env
    , createEnv
    , runMollie
    , Reader.liftIO
    ) where

import qualified Control.Monad.Reader        as Reader
import qualified Data.Text                   as Text
import           Mollie.API.Internal
import qualified Network.HTTP.Client         as HTTP
import qualified Network.HTTP.Client.OpenSSL as HTTP
import qualified OpenSSL.Session             as OpenSSL
-- import qualified Paths_mollie_api_haskell    as Self

{-|
  Create a new Env from a Mollie API key.

  This key should start with either `test_` or `live_`.
-}
createEnv :: Text.Text -- ^ key
          -> IO Env
createEnv key = HTTP.withOpenSSL $ do
    sslContext <- OpenSSL.context
    -- TODO: re-enable cacert verification, disabled because it required the app to run on the build machine
    -- OpenSSL.contextSetVerificationMode sslContext OpenSSL.VerifyPeer
    --     { OpenSSL.vpFailIfNoPeerCert = True
    --     , OpenSSL.vpClientOnce       = False
    --     , OpenSSL.vpCallback         = Nothing
    --     }
    -- cacert <- Self.getDataFileName "data/cacert.pem"
    -- OpenSSL.contextSetCAFile sslContext cacert
    manager <- HTTP.newManager . HTTP.opensslManagerSettings $ return sslContext
    return Env
        { env_key     = key
        , env_manager = manager
        }

{-|
  Runs handlers with the provided environment against the Mollie API.
-}
runMollie :: Env -> Mollie a -> IO a
runMollie env query = Reader.runReaderT query env