{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}

-- | The ElasticLoadBalancing HealthCheck is an embedded property of the
-- AWS::ElasticLoadBalancing::LoadBalancer type.

module Stratosphere.ResourceProperties.HealthCheck where

import Control.Lens
import Data.Aeson
import Data.Aeson.Types
import Data.Text
import GHC.Generics

import Stratosphere.Values


-- | Full data type definition for HealthCheck. See 'healthCheck' for a more
-- convenient constructor.
data HealthCheck =
  HealthCheck
  { _healthCheckHealthyThreshold :: Val Text
  , _healthCheckInterval :: Val Text
  , _healthCheckTarget :: Val Text
  , _healthCheckTimeout :: Val Text
  , _healthCheckUnhealthyThreshold :: Val Text
  } deriving (Show, Generic)

instance ToJSON HealthCheck where
  toJSON = genericToJSON defaultOptions { fieldLabelModifier = Prelude.drop 12, omitNothingFields = True }

instance FromJSON HealthCheck where
  parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = Prelude.drop 12, omitNothingFields = True }

-- | Constructor for 'HealthCheck' containing required fields as arguments.
healthCheck
  :: Val Text -- ^ 'hcHealthyThreshold'
  -> Val Text -- ^ 'hcInterval'
  -> Val Text -- ^ 'hcTarget'
  -> Val Text -- ^ 'hcTimeout'
  -> Val Text -- ^ 'hcUnhealthyThreshold'
  -> HealthCheck
healthCheck healthyThresholdarg intervalarg targetarg timeoutarg unhealthyThresholdarg =
  HealthCheck
  { _healthCheckHealthyThreshold = healthyThresholdarg
  , _healthCheckInterval = intervalarg
  , _healthCheckTarget = targetarg
  , _healthCheckTimeout = timeoutarg
  , _healthCheckUnhealthyThreshold = unhealthyThresholdarg
  }

-- | Specifies the number of consecutive health probe successes required
-- before moving the instance to the Healthy state.
hcHealthyThreshold :: Lens' HealthCheck (Val Text)
hcHealthyThreshold = lens _healthCheckHealthyThreshold (\s a -> s { _healthCheckHealthyThreshold = a })

-- | Specifies the approximate interval, in seconds, between health checks of
-- an individual instance.
hcInterval :: Lens' HealthCheck (Val Text)
hcInterval = lens _healthCheckInterval (\s a -> s { _healthCheckInterval = a })

-- | Specifies the instance's protocol and port to check. The protocol can be
-- TCP, HTTP, HTTPS, or SSL. The range of valid ports is 1 through 65535.
hcTarget :: Lens' HealthCheck (Val Text)
hcTarget = lens _healthCheckTarget (\s a -> s { _healthCheckTarget = a })

-- | Specifies the amount of time, in seconds, during which no response means
-- a failed health probe. This value must be less than the value for Interval.
hcTimeout :: Lens' HealthCheck (Val Text)
hcTimeout = lens _healthCheckTimeout (\s a -> s { _healthCheckTimeout = a })

-- | Specifies the number of consecutive health probe failures required before
-- moving the instance to the Unhealthy state.
hcUnhealthyThreshold :: Lens' HealthCheck (Val Text)
hcUnhealthyThreshold = lens _healthCheckUnhealthyThreshold (\s a -> s { _healthCheckUnhealthyThreshold = a })