{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies    #-}

module Network.Livy.Client.Batch.GetBatchLogs
  ( -- * The request
    GetBatchLogs (..)
  , getBatchLogs
    -- ** Request lenses
  , gblFrom
  , gblSize
    -- * The response
  , GetBatchLogsResponse (..)
    -- ** Response lenses
  , gblrId
  , gblrFrom
  , gblrSize
  , gblrLog
  ) where

import           Control.Lens
import           Data.Aeson.TH
import qualified Data.ByteString.Char8 as C
import           Data.Maybe (isJust)
import           Data.Text (Text)
import           Data.Typeable

import           Network.Livy.Client.Internal.JSON
import           Network.Livy.Client.Types.Batch
import           Network.Livy.Internal.Text
import           Network.Livy.Request
import           Network.Livy.Types


-- | The 'GetBatchLogs' request object.
data GetBatchLogs = GetBatchLogs
  { _gblBatchId :: BatchId -- ^ Id of the batch session.
  , _gblFrom    :: Maybe Int -- ^ Offset.
  , _gblSize    :: Maybe Int -- ^ Max number of log lines to return.
  } deriving (Eq, Show, Typeable)

makeLenses ''GetBatchLogs

instance ToPath GetBatchLogs where
  toPath r = toPath ["batches", toText $ r ^. gblBatchId, "log"]

instance ToQuery GetBatchLogs where
  toQueryString r = filter (isJust . snd)
              [ ("from", C.pack . show <$> r ^. gblFrom)
              , ("size", C.pack . show <$> r ^. gblSize)
              ]

instance LivyRequest GetBatchLogs where
  request = getQuery


-- | Creates a value of 'GetBatchLogs' with the minimum fields required to make a request.
getBatchLogs :: BatchId -> GetBatchLogs
getBatchLogs bid = GetBatchLogs bid Nothing Nothing


-- | The 'GetBatchLogs' response body.
data GetBatchLogsResponse = GetBatchLogsResponse
  { _gblrId   :: !BatchId -- ^ The batch session id.
  , _gblrFrom :: !Int -- ^ Offset from start of log.
  , _gblrSize :: !(Maybe Int) -- ^ Max number of log lines.
  , _gblrLog  :: ![Text] -- ^ The log lines.
  } deriving (Eq, Show, Typeable)

makeLenses ''GetBatchLogsResponse
deriveFromJSON (recordPrefixOptions 5) ''GetBatchLogsResponse
type instance LivyResponse GetBatchLogs = GetBatchLogsResponse