module System.Nix.Store.Remote.Types (
    MonadStore
  , Logger(..)
  , Field(..)
  , getLog
  , flushLog
  , gotError
  , getError) where


import qualified Data.ByteString.Lazy      as LBS
import           Network.Socket            (Socket)
import           Control.Monad.Except
import           Control.Monad.Reader
import           Control.Monad.State

type MonadStore a = ExceptT String (StateT [Logger] (ReaderT Socket IO)) a

type ActivityID = Int
type ActivityParentID = Int
type ActivityType = Int
type Verbosity = Int
type ResultType = Int

data Field = LogStr LBS.ByteString | LogInt Int
  deriving (Eq, Ord, Show)

data Logger =
    Next          LBS.ByteString
  | Read          Int            -- data needed from source
  | Write         LBS.ByteString -- data for sink
  | Last
  | Error         Int LBS.ByteString
  | StartActivity ActivityID Verbosity ActivityType LBS.ByteString [Field] ActivityParentID
  | StopActivity  ActivityID
  | Result        ActivityID ResultType [Field]
  deriving (Eq, Ord, Show)

isError :: Logger -> Bool
isError (Error _ _) = True
isError _           = False

gotError :: MonadStore Bool
gotError = any isError <$> get

getError :: MonadStore [Logger]
getError = filter isError <$> get

getLog :: MonadStore [Logger]
getLog = get

flushLog :: MonadStore ()
flushLog = put []