{-# LANGUAGE OverloadedStrings #-}

module Network.Bitcoin.Api.Client ( T.Client (..)
                                  , withClient ) where

import           Control.Lens              ((&), (?~))
import qualified Network.Wreq              as W
import qualified Network.Wreq.Session      as WS

import qualified Data.Text                 as T
import qualified Data.Text.Encoding        as TE

import qualified Network.Bitcoin.Api.Types as T

-- | Initializes a client and prepares it for making requests against the
--   Bitcoin RPC API. Connection reuse is provided, and cleanup of any acquired
--   resources is handled automatically.
withClient :: String -> Int -> T.Text -> T.Text -> (T.Client -> IO a) -> IO a
withClient host port user pass callback =
  let options :: W.Options
      options = W.defaults & applyAuth

      applyAuth = W.auth ?~ W.basicAuth (TE.encodeUtf8 user) (TE.encodeUtf8 pass)

      generateUrl :: String
      generateUrl = "http://" ++ host ++ ":" ++ show port

  in WS.withSession (callback . T.Client generateUrl options)