{-# LANGUAGE TemplateHaskell #-}
module AWS.CloudWatch.Types
    where

import AWS.Lib.FromText

data Metric = Metric
    { metricDimensions :: [Dimension]
    , metricName :: Text
    , metricNameSpace :: Text
    }
  deriving (Show, Eq)

data Dimension = Dimension
    { dimensionName :: Text
    , dimensionValue :: Text
    }
  deriving (Show, Eq)

type DimensionFilter = (Text, Text)

data Datapoint = Datapoint
    { datapointTimestamp :: UTCTime
    , datapointSampleCount :: Maybe Double
    , datapointUnit :: Text
    , datapointMinimum :: Maybe Double
    , datapointMaximum :: Maybe Double
    , datapointSum :: Maybe Double
    , datapointAverage :: Maybe Double
    }
  deriving (Show, Eq)

data Statistic
    = StatisticAverage
    | StatisticSum
    | StatisticSampleCount
    | StatisticMaximum
    | StatisticMinimum
  deriving (Show, Eq, Read)
deriveFromText "Statistic" ["Average", "Sum", "SampleCount", "Maximum", "Minimum"]

allStatistics :: [Statistic]
allStatistics =
    [ StatisticAverage
    , StatisticSum
    , StatisticSampleCount
    , StatisticMaximum
    , StatisticMinimum
    ]

data AlarmNameSpec
    = AlarmSpecNothing
    | AlarmSpecNamePrefix Text
    | AlarmSpecNames [Text]
  deriving (Show, Eq)

data StateValue
    = StateValueOk
    | StateValueAlarm
    | StateValueInsufficientData
  deriving (Show, Eq, Read)
deriveFromText "StateValue" ["OK", "ALARM", "INSUFFICIENT_DATA"]

data ComparisonOperator
    = GreaterThanOrEqualToThreshold
    | GreaterThanThreshold
    | LessThanThreshold
    | LessThanOrEqualToThreshold
  deriving (Show, Eq, Read)
deriveFromText "ComparisonOperator"
    [ "GreaterThanOrEqualToThreshold"
    , "GreaterThanThreshold"
    , "LessThanThreshold"
    , "LessThanOrEqualToThreshold"
    ]

data MetricAlarm = MetricAlarm
    { metricAlarmAlarmDescription :: Maybe Text
    , metricAlarmStateUpdatedTimestamp :: UTCTime
    , metricAlarmInsufficientDataActions :: [Text]
    , metricAlarmStateReasonData :: Maybe Text
    , metricAlarmAlarmArn :: Text
    , metricAlarmConfigurationUpdatedTimestamp :: UTCTime
    , metricAlarmAlarmName :: Text
    , metricAlarmStateValue :: StateValue
    , metricAlarmPeriod :: Int
    , metricAlarmOKActions :: [Text]
    , metricAlarmActionsEnabled :: Bool
    , metricAlarmNamespace :: Text
    , metricAlarmThreshold :: Double
    , metricAlarmEvaluationPeriods :: Int
    , metricAlarmStatistic :: Statistic
    , metricAlarmAlarmActions :: [Text]
    , metricAlarmUnit :: Maybe Text
    , metricAlarmStateReason :: Maybe Text
    , metricAlarmDimensions :: [Dimension]
    , metricAlarmComparisonOperator :: ComparisonOperator
    , metricAlarmMetricName :: Text
    }
  deriving (Show, Eq)

data PutMetricAlarmRequest = PutMetricAlarmRequest
    { putMetricAlarmActionsEnabled :: Maybe Bool
    , putMetricAlarmAlarmActions :: [Text]
    , putMetricAlarmAlarmDescription :: Maybe Text
    , putMetricAlarmAlarmName :: Text
    , putMetricAlarmComparisonOperator :: ComparisonOperator
    , putMetricAlarmDimensions :: [Dimension]
    , putMetricAlarmEvaluationPeriods :: Int
    , putMetricAlarmInsufficientDataActions :: [Text]
    , putMetricAlarmMetricName :: Text
    , putMetricAlarmNamespace :: Text
    , putMetricAlarmOKActions :: [Text]
    , putMetricAlarmPeriod :: Int
    , putMetricAlarmStatistic :: Statistic
    , putMetricAlarmThreshold :: Double
    , putMetricAlarmUnit :: Maybe Text
    }
  deriving (Show, Eq)

data AlarmHistory = AlarmHistory
    { alarmHistoryTimestamp :: UTCTime
    , alarmHistoryHistoryItemType :: HistoryType
    , alarmHistoryAlarmName :: Text
    , alarmHistoryHistoryData :: Text
    , alarmHistoryHistorySummary :: Text
    }
  deriving (Show, Eq)

data HistoryType
    = HistoryTypeConfigurationUpdate
    | HistoryTypeStateUpdate
    | HistoryTypeAction
  deriving (Show, Eq, Read)
deriveFromText "HistoryType" ["ConfigurationUpdate", "StateUpdate", "Action"]

data MetricDatum = MetricDatum
    { metricDatumDimensions :: [Dimension]
    , metricDatumMetricName :: Text
    , metricDatumTimestamp :: Maybe UTCTime
    , metricDatumUnit :: Maybe Text
    , metricDatumValue :: MetricDatumValue
    }
  deriving (Show, Eq)

data MetricDatumValue
    = MetricDatumValue Double
    | MetricDatumStatisticValues StatisticSet
  deriving (Show, Eq)

data StatisticSet = StatisticSet
    { statisticSetMaximum :: Double
    , statisticSetMinimum :: Double
    , statisticSetSampleCount :: Double
    , statisticSetSum :: Double
    }
  deriving (Show, Eq)