module Yam.Server(
    actuatorEndpoint
  , ActuatorEndpoint
  , ActuatorConfig(..)
  ) where

import           Salak
import           Servant
import           Yam.App
import           Yam.Logger
import           Yam.Server.Health
import           Yam.Server.Refresh
import           Yam.Swagger

data ActuatorConfig = ActuatorConfig
  { enabled :: Bool
  , refresh :: Bool
  , health  :: Bool
  }

instance MonadCatch m => FromProp m ActuatorConfig where
  fromProp = ActuatorConfig
    <$> "enabled"         .?= False
    <*> "refresh.enabled" .?= True
    <*> "health.enabled"  .?= True

type ActuatorEndpoint = SwaggerTag "actuator" "Actuator API" :> "actuator" :>
  (    RefreshEndpoint
  :<|> HealthEndpoint
  )

actuatorEndpoint ::  (HasSalaks cxt, HasLogger cxt) => IO HealthResult -> ActuatorConfig -> ServerT ActuatorEndpoint (AppV cxt IO)
actuatorEndpoint rr ActuatorConfig{..} = refreshEndpoint refresh :<|> healthEndpoint rr health