{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TupleSections #-}

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricstat.html

module Stratosphere.ResourceProperties.CloudWatchAlarmMetricStat where

import Stratosphere.ResourceImports
import Stratosphere.ResourceProperties.CloudWatchAlarmMetric

-- | Full data type definition for CloudWatchAlarmMetricStat. See
-- 'cloudWatchAlarmMetricStat' for a more convenient constructor.
data CloudWatchAlarmMetricStat =
  CloudWatchAlarmMetricStat
  { _cloudWatchAlarmMetricStatMetric :: CloudWatchAlarmMetric
  , _cloudWatchAlarmMetricStatPeriod :: Val Integer
  , _cloudWatchAlarmMetricStatStat :: Val Text
  , _cloudWatchAlarmMetricStatUnit :: Maybe (Val Text)
  } deriving (Show, Eq)

instance ToJSON CloudWatchAlarmMetricStat where
  toJSON CloudWatchAlarmMetricStat{..} =
    object $
    catMaybes
    [ (Just . ("Metric",) . toJSON) _cloudWatchAlarmMetricStatMetric
    , (Just . ("Period",) . toJSON) _cloudWatchAlarmMetricStatPeriod
    , (Just . ("Stat",) . toJSON) _cloudWatchAlarmMetricStatStat
    , fmap (("Unit",) . toJSON) _cloudWatchAlarmMetricStatUnit
    ]

-- | Constructor for 'CloudWatchAlarmMetricStat' containing required fields as
-- arguments.
cloudWatchAlarmMetricStat
  :: CloudWatchAlarmMetric -- ^ 'cwamsMetric'
  -> Val Integer -- ^ 'cwamsPeriod'
  -> Val Text -- ^ 'cwamsStat'
  -> CloudWatchAlarmMetricStat
cloudWatchAlarmMetricStat metricarg periodarg statarg =
  CloudWatchAlarmMetricStat
  { _cloudWatchAlarmMetricStatMetric = metricarg
  , _cloudWatchAlarmMetricStatPeriod = periodarg
  , _cloudWatchAlarmMetricStatStat = statarg
  , _cloudWatchAlarmMetricStatUnit = Nothing
  }

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricstat.html#cfn-cloudwatch-alarm-metricstat-metric
cwamsMetric :: Lens' CloudWatchAlarmMetricStat CloudWatchAlarmMetric
cwamsMetric = lens _cloudWatchAlarmMetricStatMetric (\s a -> s { _cloudWatchAlarmMetricStatMetric = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricstat.html#cfn-cloudwatch-alarm-metricstat-period
cwamsPeriod :: Lens' CloudWatchAlarmMetricStat (Val Integer)
cwamsPeriod = lens _cloudWatchAlarmMetricStatPeriod (\s a -> s { _cloudWatchAlarmMetricStatPeriod = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricstat.html#cfn-cloudwatch-alarm-metricstat-stat
cwamsStat :: Lens' CloudWatchAlarmMetricStat (Val Text)
cwamsStat = lens _cloudWatchAlarmMetricStatStat (\s a -> s { _cloudWatchAlarmMetricStatStat = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudwatch-alarm-metricstat.html#cfn-cloudwatch-alarm-metricstat-unit
cwamsUnit :: Lens' CloudWatchAlarmMetricStat (Maybe (Val Text))
cwamsUnit = lens _cloudWatchAlarmMetricStatUnit (\s a -> s { _cloudWatchAlarmMetricStatUnit = a })