module Belka.Potoki.Transform
where

import Belka.Prelude
import Potoki.Transform
import qualified Network.HTTP.Client as A
import qualified Network.HTTP.Client.TLS as A
import qualified Belka.Request as B
import qualified Belka.ParseHead as C
import qualified Belka.ParseBody as D
import qualified Belka.TransportError as G
import qualified Belka.IO as H
import qualified Belka.Interact as I


{-|
Given a specification of how to parse the response,
execute the requests, producing the parsed responses.
-}
request :: C.ParseHead (D.ParseBody response) -> Transform B.Request (Either Text (Either G.TransportError response))
request parse =
  arr (\ request -> A.newTlsManager >>= \ manager -> H.interact manager (I.request request parse) <* A.closeManager manager) >>>
  executeIO

{-|
Given an HTTP manager, a specification of how to parse the response,
execute the requests, producing the parsed responses.
-}
requestUsingManager :: A.Manager -> C.ParseHead (D.ParseBody response) -> Transform B.Request (Either Text (Either G.TransportError response))
requestUsingManager manager parse =
  arr (\ request -> H.interact manager (I.request request parse)) >>>
  executeIO

{-|
Perform 'requestUsingManager' using a new manager.
-}
requestUsingNewManager :: C.ParseHead (D.ParseBody response) -> Transform B.Request (Either Text (Either G.TransportError response))
requestUsingNewManager parse =
  ioTransform $ do
    manager <- A.newTlsManagerWith settings
    return (requestUsingManager manager parse)
  where
    settings =
      A.tlsManagerSettings

{-|
Perform 'requestUsingManager' using a global manager.
-}
requestUsingGlobalManager :: C.ParseHead (D.ParseBody response) -> Transform B.Request (Either Text (Either G.TransportError response))
requestUsingGlobalManager parse =
  ioTransform $ do
    manager <- A.getGlobalManager
    return (requestUsingManager manager parse)