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

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html

module Stratosphere.Resources.CloudWatchAnomalyDetector where

import Stratosphere.ResourceImports
import Stratosphere.ResourceProperties.CloudWatchAnomalyDetectorConfiguration
import Stratosphere.ResourceProperties.CloudWatchAnomalyDetectorDimension

-- | Full data type definition for CloudWatchAnomalyDetector. See
-- 'cloudWatchAnomalyDetector' for a more convenient constructor.
data CloudWatchAnomalyDetector =
  CloudWatchAnomalyDetector
  { _cloudWatchAnomalyDetectorConfiguration :: Maybe CloudWatchAnomalyDetectorConfiguration
  , _cloudWatchAnomalyDetectorDimensions :: Maybe [CloudWatchAnomalyDetectorDimension]
  , _cloudWatchAnomalyDetectorMetricName :: Val Text
  , _cloudWatchAnomalyDetectorNamespace :: Val Text
  , _cloudWatchAnomalyDetectorStat :: Val Text
  } deriving (Show, Eq)

instance ToResourceProperties CloudWatchAnomalyDetector where
  toResourceProperties CloudWatchAnomalyDetector{..} =
    ResourceProperties
    { resourcePropertiesType = "AWS::CloudWatch::AnomalyDetector"
    , resourcePropertiesProperties =
        hashMapFromList $ catMaybes
        [ fmap (("Configuration",) . toJSON) _cloudWatchAnomalyDetectorConfiguration
        , fmap (("Dimensions",) . toJSON) _cloudWatchAnomalyDetectorDimensions
        , (Just . ("MetricName",) . toJSON) _cloudWatchAnomalyDetectorMetricName
        , (Just . ("Namespace",) . toJSON) _cloudWatchAnomalyDetectorNamespace
        , (Just . ("Stat",) . toJSON) _cloudWatchAnomalyDetectorStat
        ]
    }

-- | Constructor for 'CloudWatchAnomalyDetector' containing required fields as
-- arguments.
cloudWatchAnomalyDetector
  :: Val Text -- ^ 'cwadMetricName'
  -> Val Text -- ^ 'cwadNamespace'
  -> Val Text -- ^ 'cwadStat'
  -> CloudWatchAnomalyDetector
cloudWatchAnomalyDetector metricNamearg namespacearg statarg =
  CloudWatchAnomalyDetector
  { _cloudWatchAnomalyDetectorConfiguration = Nothing
  , _cloudWatchAnomalyDetectorDimensions = Nothing
  , _cloudWatchAnomalyDetectorMetricName = metricNamearg
  , _cloudWatchAnomalyDetectorNamespace = namespacearg
  , _cloudWatchAnomalyDetectorStat = statarg
  }

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-configuration
cwadConfiguration :: Lens' CloudWatchAnomalyDetector (Maybe CloudWatchAnomalyDetectorConfiguration)
cwadConfiguration = lens _cloudWatchAnomalyDetectorConfiguration (\s a -> s { _cloudWatchAnomalyDetectorConfiguration = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-dimensions
cwadDimensions :: Lens' CloudWatchAnomalyDetector (Maybe [CloudWatchAnomalyDetectorDimension])
cwadDimensions = lens _cloudWatchAnomalyDetectorDimensions (\s a -> s { _cloudWatchAnomalyDetectorDimensions = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-metricname
cwadMetricName :: Lens' CloudWatchAnomalyDetector (Val Text)
cwadMetricName = lens _cloudWatchAnomalyDetectorMetricName (\s a -> s { _cloudWatchAnomalyDetectorMetricName = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-namespace
cwadNamespace :: Lens' CloudWatchAnomalyDetector (Val Text)
cwadNamespace = lens _cloudWatchAnomalyDetectorNamespace (\s a -> s { _cloudWatchAnomalyDetectorNamespace = a })

-- | http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudwatch-anomalydetector.html#cfn-cloudwatch-anomalydetector-stat
cwadStat :: Lens' CloudWatchAnomalyDetector (Val Text)
cwadStat = lens _cloudWatchAnomalyDetectorStat (\s a -> s { _cloudWatchAnomalyDetectorStat = a })