{-# LANGUAGE ConstraintKinds   #-}
{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TemplateHaskell   #-}

-- | Context objects for monad transformers.
--
module Network.AWS.Wolf.Types.Ctx where

import Control.Monad.Trans.AWS
import Network.AWS.SWF
import Network.AWS.Wolf.Prelude
import Network.AWS.Wolf.Types.Product

-- | ConfCtx
--
-- Configuration context.
--
data ConfCtx = ConfCtx
  { _ccStatsCtx :: StatsCtx
    -- ^ Parent context.
  , _ccConf     :: Conf
    -- ^ Configuration parameters.
  }

$(makeClassyConstraints ''ConfCtx [''HasStatsCtx])

instance HasStatsCtx ConfCtx where
  statsCtx = ccStatsCtx

instance HasCtx ConfCtx where
  ctx = statsCtx . ctx

type MonadConf c m =
  ( MonadStatsCtx c m
  , HasConfCtx c
  )

-- | AmazonCtx
--
-- Amazon context.
--
data AmazonCtx = AmazonCtx
  { _acCtx :: Ctx
    -- ^ Parent context.
  , _acEnv :: Env
    -- ^ Amazon environment.
  }

$(makeClassyConstraints ''AmazonCtx [''HasCtx, ''HasEnv])

instance HasCtx AmazonCtx where
  ctx = acCtx

instance HasEnv AmazonCtx where
  environment = acEnv

type MonadAmazon c m =
  ( MonadCtx c m
  , HasAmazonCtx c
  , AWSConstraint c m
  )

-- | AmazonStoreCtx
--
-- Amazon store context.
--
data AmazonStoreCtx = AmazonStoreCtx
  { _ascConfCtx :: ConfCtx
    -- ^ Parent context.
  , _ascPrefix  :: Text
    -- ^ Object prefix.
  }

$(makeClassyConstraints ''AmazonStoreCtx [''HasConfCtx])

instance HasConfCtx AmazonStoreCtx where
  confCtx = ascConfCtx

instance HasStatsCtx AmazonStoreCtx where
  statsCtx = confCtx . statsCtx

instance HasCtx AmazonStoreCtx where
  ctx = statsCtx . ctx

type MonadAmazonStore c m =
   ( MonadConf c m
   , HasAmazonStoreCtx c
   )

-- | AmazonWorkCtx
--
-- Amazon work context.
--
data AmazonWorkCtx = AmazonWorkCtx
  { _awcConfCtx :: ConfCtx
    -- ^ Parent context.
  , _awcQueue   :: Text
    -- ^ Workflow queue.
  }

$(makeClassyConstraints ''AmazonWorkCtx [''HasConfCtx])

instance HasConfCtx AmazonWorkCtx where
   confCtx = awcConfCtx

instance HasStatsCtx AmazonWorkCtx where
  statsCtx = confCtx . statsCtx

instance HasCtx AmazonWorkCtx where
  ctx = statsCtx . ctx

type MonadAmazonWork c m =
   ( MonadConf c m
   , HasAmazonWorkCtx c
   )

-- | AmazonDecisionCtx
--
-- Amazon decision context.
--
data AmazonDecisionCtx = AmazonDecisionCtx
  { _adcConfCtx :: ConfCtx
    -- ^ Parent context.
  , _adcPlan    :: Plan
    -- ^ Decision plan.
  , _adcEvents  :: [HistoryEvent]
    -- ^ History events.
  }

$(makeClassyConstraints ''AmazonDecisionCtx [''HasConfCtx])

instance HasConfCtx AmazonDecisionCtx where
   confCtx = adcConfCtx

instance HasStatsCtx AmazonDecisionCtx where
  statsCtx = confCtx . statsCtx

instance HasCtx AmazonDecisionCtx where
  ctx = statsCtx . ctx

type MonadAmazonDecision c m =
   ( MonadConf c m
   , HasAmazonDecisionCtx c
   )