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

-- |

module Stratosphere.ResourceAttributes.ResourceSignal 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 ResourceSignal. See 'resourceSignal' for a
-- more convenient constructor.
data ResourceSignal =
  ResourceSignal
  { _resourceSignalCount :: Maybe (Val Integer')
  , _resourceSignalTimeout :: Maybe (Val Text)
  } deriving (Show, Generic)

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

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

-- | Constructor for 'ResourceSignal' containing required fields as arguments.
resourceSignal
  :: ResourceSignal
resourceSignal  =
  ResourceSignal
  { _resourceSignalCount = Nothing
  , _resourceSignalTimeout = Nothing
  }

-- | The number of success signals AWS CloudFormation must receive before it
-- sets the resource status as CREATE_COMPLETE. If the resource receives a
-- failure signal or doesn't receive the specified number of signals before
-- the timeout period expires, the resource creation fails and AWS
-- CloudFormation rolls the stack back.
rsCount :: Lens' ResourceSignal (Maybe (Val Integer'))
rsCount = lens _resourceSignalCount (\s a -> s { _resourceSignalCount = a })

-- | The length of time that AWS CloudFormation waits for the number of
-- signals that was specified in the Count property. The timeout period starts
-- after AWS CloudFormation starts creating the resource, and the timeout
-- expires no sooner than the time you specify but can occur shortly
-- thereafter. The maximum time that you can specify is 12 hours. The value
-- must be in ISO8601 duration format, in the form: "PT#H#M#S", where each #
-- is the number of hours, minutes, and seconds, respectively. For best
-- results, specify a period of time that gives your instances plenty of time
-- to get up and running. A shorter timeout can cause a rollback.
rsTimeout :: Lens' ResourceSignal (Maybe (Val Text))
rsTimeout = lens _resourceSignalTimeout (\s a -> s { _resourceSignalTimeout = a })