{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}

-- | SWF Counter logic.
--
module Network.AWS.Wolf.Count
  ( count
  , countMain
  ) where

import Network.AWS.Wolf.Ctx
import Network.AWS.Wolf.File
import Network.AWS.Wolf.Prelude
import Network.AWS.Wolf.SWF
import Network.AWS.Wolf.Types

-- | Count pending activities.
--
countActivity :: MonadConf c m => Task -> m ()
countActivity t = do
  traceInfo "count-act" [ "task" .= t ]
  let queue = t ^. tQueue
  runAmazonWorkCtx queue $ do
    c <- countActivities
    traceInfo "count-activities" [ "task" .= t, "count" .= c ]
    statsGauge "wolf.act.queue.depth" c [ "queue" =. queue ]

-- | Count open workflows.
--
countDecision :: MonadConf c m => Task -> m ()
countDecision t = do
  traceInfo "count-decision" [ "task" .= t ]
  let queue = t ^. tQueue
  runAmazonWorkCtx queue $ do
    c <- countDecisions
    traceInfo "count-decisions" [ "task" .= t, "count" .= c ]
    statsGauge "wolf.decide.queue.depth" c [ "queue" =. queue ]

-- | Counter logic - count all the queues.
--
count :: MonadConf c m => Plan -> m ()
count p =
  preConfCtx [ "label" .= LabelCount ] $ do
    countDecision (p ^. pStart)
    mapM_ countActivity (p ^. pTasks)

-- | Run counter from main with config file.
--
countMain :: MonadControl m => FilePath -> FilePath -> Maybe Text -> m ()
countMain cf pf domain =
  runCtx $ runTop $ do
    conf <- readYaml cf
    let conf' = override cDomain domain conf
    runConfCtx conf' $ do
      plans <- readYaml pf
      mapM_ count (plans :: [Plan])