{-# LANGUAGE BangPatterns          #-}
{-# LANGUAGE DeriveDataTypeable    #-}
{-# LANGUAGE DeriveGeneric         #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE OverloadedStrings     #-}

module HNormalise.Torque.Internal where

--------------------------------------------------------------------------------
import           Data.Text
import           GHC.Generics (Generic)

--------------------------------------------------------------------------------


data TorqueJobShortNode = TorqueJobShortNode
    { number :: !Int
    , ppn    :: !(Maybe Int)
    } deriving (Show, Eq, Generic)

--------------------------------------------------------------------------------
data TorqueJobFQNode = TorqueJobFQNode
    { name :: !Text
    , ppn  :: !Int
    } deriving (Show, Eq, Generic)

--------------------------------------------------------------------------------
data TorqueExecHost = TorqueExecHost
    { name      :: !Text
    , lowerCore :: !Int
    , upperCore :: !Int
    } deriving (Show, Eq, Generic)

--------------------------------------------------------------------------------
data TorqueWalltime = TorqueWalltime
    { days    :: !Int
    , hours   :: !Int
    , minutes :: !Int
    , seconds :: !Int
    } deriving (Show, Eq, Generic)

--------------------------------------------------------------------------------
data TorqueResourceRequest = TorqueResourceRequest
    { nodes     :: !(Either TorqueJobShortNode [TorqueJobFQNode])
    , vmem      :: !Integer
    , nodeCount :: !Int
    , neednodes :: !(Either TorqueJobShortNode [TorqueJobFQNode])
    , nice      :: !(Maybe Int)
    , walltime  :: !TorqueWalltime
    } deriving (Show, Eq, Generic)

--------------------------------------------------------------------------------
data TorqueResourceUsage = TorqueResourceUsage
    { cputime  :: !Integer
    , energy   :: !Integer
    , mem      :: !Integer
    , vmem     :: !Integer
    , walltime :: !TorqueWalltime
    } deriving (Show, Eq, Generic)

--------------------------------------------------------------------------------
data TorqueJobTime = TorqueJobTime
    { ctime     :: !Integer
    , qtime     :: !Integer
    , etime     :: !Integer
    , startTime :: !Integer
    , endTime   :: !Integer
    } deriving (Show, Eq, Generic)

--------------------------------------------------------------------------------
data TorqueJobExit = TorqueJobExit
    { name                :: !TorqueJobName
    , user                :: !Text
    , group               :: !Text
    , jobname             :: !Text
    , queue               :: !Text
    , startCount          :: !(Maybe Int)
    , owner               :: !Text
    , session             :: !Integer
    , times               :: !TorqueJobTime
    , resourceRequest     :: !TorqueResourceRequest
    , resourceUsage       :: !TorqueResourceUsage
    , totalExecutionSlots :: !Int
    , uniqueNodeCount     :: !Int
    , exitStatus          :: !Int
    } deriving (Show, Eq, Generic)

--------------------------------------------------------------------------------
data TorqueJobName = TorqueJobName
    { number   :: !Integer
    , array_id :: !(Maybe Integer)
    , master   :: !Text
    , cluster  :: !Text
    } deriving (Show, Eq, Generic)