{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric      #-}
{-# LANGUAGE OverloadedStrings  #-}
{-# LANGUAGE RecordWildCards    #-}
{-# LANGUAGE TypeFamilies       #-}

{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Network.AWS.CloudWatchEvents.PutRule
-- Copyright   : (c) 2013-2016 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Creates or updates a rule. Rules are enabled by default, or based on value of the State parameter. You can disable a rule using < DisableRule>.
--
-- __Note:__ When you create or update a rule, incoming events might not immediately start matching to new or updated rules. Please allow a short period of time for changes to take effect.
--
-- A rule must contain at least an EventPattern or ScheduleExpression. Rules with EventPatterns are triggered when a matching event is observed. Rules with ScheduleExpressions self-trigger based on the given schedule. A rule can have both an EventPattern and a ScheduleExpression, in which case the rule will trigger on matching events as well as on a schedule.
--
-- __Note:__ Most services in AWS treat : or \/ as the same character in Amazon Resource Names (ARNs). However, CloudWatch Events uses an exact match in event patterns and rules. Be sure to use the correct ARN characters when creating event patterns so that they match the ARN syntax in the event you want to match.
module Network.AWS.CloudWatchEvents.PutRule
    (
    -- * Creating a Request
      putRule
    , PutRule
    -- * Request Lenses
    , prEventPattern
    , prState
    , prScheduleExpression
    , prDescription
    , prRoleARN
    , prName

    -- * Destructuring the Response
    , putRuleResponse
    , PutRuleResponse
    -- * Response Lenses
    , prrsRuleARN
    , prrsResponseStatus
    ) where

import           Network.AWS.CloudWatchEvents.Types
import           Network.AWS.CloudWatchEvents.Types.Product
import           Network.AWS.Lens
import           Network.AWS.Prelude
import           Network.AWS.Request
import           Network.AWS.Response

-- | Container for the parameters to the < PutRule> operation.
--
-- /See:/ 'putRule' smart constructor.
data PutRule = PutRule'
    { _prEventPattern       :: !(Maybe Text)
    , _prState              :: !(Maybe RuleState)
    , _prScheduleExpression :: !(Maybe Text)
    , _prDescription        :: !(Maybe Text)
    , _prRoleARN            :: !(Maybe Text)
    , _prName               :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'PutRule' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'prEventPattern'
--
-- * 'prState'
--
-- * 'prScheduleExpression'
--
-- * 'prDescription'
--
-- * 'prRoleARN'
--
-- * 'prName'
putRule
    :: Text -- ^ 'prName'
    -> PutRule
putRule pName_ =
    PutRule'
    { _prEventPattern = Nothing
    , _prState = Nothing
    , _prScheduleExpression = Nothing
    , _prDescription = Nothing
    , _prRoleARN = Nothing
    , _prName = pName_
    }

-- | The event pattern.
prEventPattern :: Lens' PutRule (Maybe Text)
prEventPattern = lens _prEventPattern (\ s a -> s{_prEventPattern = a});

-- | Indicates whether the rule is enabled or disabled.
prState :: Lens' PutRule (Maybe RuleState)
prState = lens _prState (\ s a -> s{_prState = a});

-- | The scheduling expression. For example, \"cron(0 20 * * ? *)\", \"rate(5 minutes)\".
prScheduleExpression :: Lens' PutRule (Maybe Text)
prScheduleExpression = lens _prScheduleExpression (\ s a -> s{_prScheduleExpression = a});

-- | A description of the rule.
prDescription :: Lens' PutRule (Maybe Text)
prDescription = lens _prDescription (\ s a -> s{_prDescription = a});

-- | The Amazon Resource Name (ARN) of the IAM role associated with the rule.
prRoleARN :: Lens' PutRule (Maybe Text)
prRoleARN = lens _prRoleARN (\ s a -> s{_prRoleARN = a});

-- | The name of the rule that you are creating or updating.
prName :: Lens' PutRule Text
prName = lens _prName (\ s a -> s{_prName = a});

instance AWSRequest PutRule where
        type Rs PutRule = PutRuleResponse
        request = postJSON cloudWatchEvents
        response
          = receiveJSON
              (\ s h x ->
                 PutRuleResponse' <$>
                   (x .?> "RuleArn") <*> (pure (fromEnum s)))

instance Hashable PutRule

instance NFData PutRule

instance ToHeaders PutRule where
        toHeaders
          = const
              (mconcat
                 ["X-Amz-Target" =#
                    ("AWSEvents.PutRule" :: ByteString),
                  "Content-Type" =#
                    ("application/x-amz-json-1.1" :: ByteString)])

instance ToJSON PutRule where
        toJSON PutRule'{..}
          = object
              (catMaybes
                 [("EventPattern" .=) <$> _prEventPattern,
                  ("State" .=) <$> _prState,
                  ("ScheduleExpression" .=) <$> _prScheduleExpression,
                  ("Description" .=) <$> _prDescription,
                  ("RoleArn" .=) <$> _prRoleARN,
                  Just ("Name" .= _prName)])

instance ToPath PutRule where
        toPath = const "/"

instance ToQuery PutRule where
        toQuery = const mempty

-- | The result of the < PutRule> operation.
--
-- /See:/ 'putRuleResponse' smart constructor.
data PutRuleResponse = PutRuleResponse'
    { _prrsRuleARN        :: !(Maybe Text)
    , _prrsResponseStatus :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'PutRuleResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'prrsRuleARN'
--
-- * 'prrsResponseStatus'
putRuleResponse
    :: Int -- ^ 'prrsResponseStatus'
    -> PutRuleResponse
putRuleResponse pResponseStatus_ =
    PutRuleResponse'
    { _prrsRuleARN = Nothing
    , _prrsResponseStatus = pResponseStatus_
    }

-- | The Amazon Resource Name (ARN) that identifies the rule.
prrsRuleARN :: Lens' PutRuleResponse (Maybe Text)
prrsRuleARN = lens _prrsRuleARN (\ s a -> s{_prrsRuleARN = a});

-- | The response status code.
prrsResponseStatus :: Lens' PutRuleResponse Int
prrsResponseStatus = lens _prrsResponseStatus (\ s a -> s{_prrsResponseStatus = a});

instance NFData PutRuleResponse