-- | The backend record the worker suites run over.
module Arbiter.Test.Worker.Backend (TestBackend (..)) where

import Arbiter.Core.Job.Types (JobRead)
import Arbiter.Core.MonadArbiter (JobHandler, ResultOf)
import Data.ByteString (ByteString)
import Data.Text (Text)

-- | A backend's payloads, envs, and runner for the generic worker suites.
data TestBackend payload m env = TestBackend
  { forall payload (m :: * -> *) env. TestBackend payload m env -> Text
schema :: Text
  , forall payload (m :: * -> *) env. TestBackend payload m env -> Text
table :: Text
  -- ^ The queue table under test.
  , forall payload (m :: * -> *) env.
TestBackend payload m env -> ByteString
connStr :: ByteString
  -- ^ For raw side connections.
  , forall payload (m :: * -> *) env.
TestBackend payload m env -> Text -> payload
mkSimple :: Text -> payload
  -- ^ A payload told apart by its text.
  , forall payload (m :: * -> *) env.
TestBackend payload m env -> Int -> payload
mkFailing :: Int -> payload
  -- ^ A payload tagged by an @Int@, for jobs a suite's handler fails.
  , forall payload (m :: * -> *) env.
TestBackend payload m env -> IO env
mkEnv :: IO env
  -- ^ The suite's shared env over an emptied queue table.
  , forall payload (m :: * -> *) env.
TestBackend payload m env -> env -> env
pollOnly :: env -> env
  -- ^ The env with its listener removed.
  , forall payload (m :: * -> *) env.
TestBackend payload m env -> IO env
mkFreshEnv :: IO env
  -- ^ An env over a pool of its own and an emptied queue table.
  , forall payload (m :: * -> *) env.
TestBackend payload m env -> env -> IO ()
destroyEnv :: env -> IO ()
  -- ^ Release a fresh env's pool.
  , forall payload (m :: * -> *) env.
TestBackend payload m env
-> (JobRead payload -> m (ResultOf m payload))
-> JobHandler m payload (ResultOf m payload)
mkHandler :: (JobRead payload -> m (ResultOf m payload)) -> JobHandler m payload (ResultOf m payload)
  -- ^ Adapt a plain job action into the backend's 'JobHandler' shape.
  , forall payload (m :: * -> *) env.
TestBackend payload m env -> Text -> m ()
runCommand :: Text -> m ()
  -- ^ Run one SQL command, such as @COMMIT@, on the monad's current connection.
  , forall payload (m :: * -> *) env.
TestBackend payload m env -> forall a. env -> m a -> IO a
runM :: forall a. env -> m a -> IO a
  -- ^ Run a backend action in 'IO'.
  }