{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards   #-}

module Periodic.Server.FuncStat
  ( FuncStat (..)
  , funcStat
  , FuncStatList
  ) where

import           Data.Byteable
import qualified Data.ByteString.Char8 as B (intercalate, pack)
import           Data.Int              (Int64)
import           Metro.IOHashMap       (IOHashMap)
import           Periodic.Types        (FuncName (..))

data FuncStat = FuncStat
    { FuncStat -> Int64
sSchedAt   :: Int64
    , FuncStat -> Int64
sWorker    :: Int64
    , FuncStat -> Int64
sJob       :: Int64
    , FuncStat -> Int64
sRunning   :: Int64
    , FuncStat -> Int64
sLocking   :: Int64
    , FuncStat -> FuncName
sFuncName  :: FuncName
    , FuncStat -> Bool
sBroadcast :: Bool
    }

instance Byteable FuncStat where
  toBytes :: FuncStat -> ByteString
toBytes FuncStat{..} = ByteString -> [ByteString] -> ByteString
B.intercalate ","
    [ FuncName -> ByteString
unFN FuncName
sFuncName
    , String -> ByteString
B.pack (String -> ByteString) -> String -> ByteString
forall a b. (a -> b) -> a -> b
$ Int64 -> String
forall a. Show a => a -> String
show Int64
sWorker
    , String -> ByteString
B.pack (String -> ByteString) -> String -> ByteString
forall a b. (a -> b) -> a -> b
$ Int64 -> String
forall a. Show a => a -> String
show Int64
sJob
    , String -> ByteString
B.pack (String -> ByteString) -> String -> ByteString
forall a b. (a -> b) -> a -> b
$ Int64 -> String
forall a. Show a => a -> String
show Int64
sRunning
    , String -> ByteString
B.pack (String -> ByteString) -> String -> ByteString
forall a b. (a -> b) -> a -> b
$ Int64 -> String
forall a. Show a => a -> String
show Int64
sLocking
    , String -> ByteString
B.pack (String -> ByteString) -> String -> ByteString
forall a b. (a -> b) -> a -> b
$ Int64 -> String
forall a. Show a => a -> String
show Int64
sSchedAt
    ]

type FuncStatList = IOHashMap FuncName FuncStat

funcStat :: FuncName -> FuncStat
funcStat :: FuncName -> FuncStat
funcStat sFuncName :: FuncName
sFuncName = FuncStat :: Int64
-> Int64 -> Int64 -> Int64 -> Int64 -> FuncName -> Bool -> FuncStat
FuncStat
  { sSchedAt :: Int64
sSchedAt = 0, sWorker :: Int64
sWorker = 0, sJob :: Int64
sJob = 0, sRunning :: Int64
sRunning = 0, sLocking :: Int64
sLocking = 0, sBroadcast :: Bool
sBroadcast = Bool
False, .. }