{-# 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.ApplicationAutoScaling.DeleteScalingPolicy
-- 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)
--
-- Deletes an Application Auto Scaling scaling policy that was previously created. If you are no longer using a scaling policy, you can delete it with this operation.
--
-- Deleting a policy deletes the underlying alarm action, but does not delete the CloudWatch alarm, even if it no longer has an associated action.
--
-- To create a new scaling policy or update an existing one, see < PutScalingPolicy>.
module Network.AWS.ApplicationAutoScaling.DeleteScalingPolicy
    (
    -- * Creating a Request
      deleteScalingPolicy
    , DeleteScalingPolicy
    -- * Request Lenses
    , dspPolicyName
    , dspServiceNamespace
    , dspResourceId
    , dspScalableDimension

    -- * Destructuring the Response
    , deleteScalingPolicyResponse
    , DeleteScalingPolicyResponse
    -- * Response Lenses
    , dsprsResponseStatus
    ) where

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

-- | /See:/ 'deleteScalingPolicy' smart constructor.
data DeleteScalingPolicy = DeleteScalingPolicy'
    { _dspPolicyName        :: !Text
    , _dspServiceNamespace  :: !ServiceNamespace
    , _dspResourceId        :: !Text
    , _dspScalableDimension :: !ScalableDimension
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'DeleteScalingPolicy' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'dspPolicyName'
--
-- * 'dspServiceNamespace'
--
-- * 'dspResourceId'
--
-- * 'dspScalableDimension'
deleteScalingPolicy
    :: Text -- ^ 'dspPolicyName'
    -> ServiceNamespace -- ^ 'dspServiceNamespace'
    -> Text -- ^ 'dspResourceId'
    -> ScalableDimension -- ^ 'dspScalableDimension'
    -> DeleteScalingPolicy
deleteScalingPolicy pPolicyName_ pServiceNamespace_ pResourceId_ pScalableDimension_ =
    DeleteScalingPolicy'
    { _dspPolicyName = pPolicyName_
    , _dspServiceNamespace = pServiceNamespace_
    , _dspResourceId = pResourceId_
    , _dspScalableDimension = pScalableDimension_
    }

-- | The name of the scaling policy to delete.
dspPolicyName :: Lens' DeleteScalingPolicy Text
dspPolicyName = lens _dspPolicyName (\ s a -> s{_dspPolicyName = a});

-- | The namespace for the AWS service that the scaling policy is associated with. For more information, see <http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#genref-aws-service-namespaces AWS Service Namespaces> in the Amazon Web Services General Reference.
dspServiceNamespace :: Lens' DeleteScalingPolicy ServiceNamespace
dspServiceNamespace = lens _dspServiceNamespace (\ s a -> s{_dspServiceNamespace = a});

-- | The unique identifier string for the resource associated with the scaling policy. For Amazon ECS services, this value is the resource type, followed by the cluster name and service name, such as 'service\/default\/sample-webapp'.
dspResourceId :: Lens' DeleteScalingPolicy Text
dspResourceId = lens _dspResourceId (\ s a -> s{_dspResourceId = a});

-- | The scalable dimension associated with the scaling policy. The scalable dimension contains the service namespace, resource type, and scaling property, such as 'ecs:service:DesiredCount' for the desired task count of an Amazon ECS service.
dspScalableDimension :: Lens' DeleteScalingPolicy ScalableDimension
dspScalableDimension = lens _dspScalableDimension (\ s a -> s{_dspScalableDimension = a});

instance AWSRequest DeleteScalingPolicy where
        type Rs DeleteScalingPolicy =
             DeleteScalingPolicyResponse
        request = postJSON applicationAutoScaling
        response
          = receiveEmpty
              (\ s h x ->
                 DeleteScalingPolicyResponse' <$> (pure (fromEnum s)))

instance Hashable DeleteScalingPolicy

instance NFData DeleteScalingPolicy

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

instance ToJSON DeleteScalingPolicy where
        toJSON DeleteScalingPolicy'{..}
          = object
              (catMaybes
                 [Just ("PolicyName" .= _dspPolicyName),
                  Just ("ServiceNamespace" .= _dspServiceNamespace),
                  Just ("ResourceId" .= _dspResourceId),
                  Just ("ScalableDimension" .= _dspScalableDimension)])

instance ToPath DeleteScalingPolicy where
        toPath = const "/"

instance ToQuery DeleteScalingPolicy where
        toQuery = const mempty

-- | /See:/ 'deleteScalingPolicyResponse' smart constructor.
newtype DeleteScalingPolicyResponse = DeleteScalingPolicyResponse'
    { _dsprsResponseStatus :: Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'DeleteScalingPolicyResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'dsprsResponseStatus'
deleteScalingPolicyResponse
    :: Int -- ^ 'dsprsResponseStatus'
    -> DeleteScalingPolicyResponse
deleteScalingPolicyResponse pResponseStatus_ =
    DeleteScalingPolicyResponse'
    { _dsprsResponseStatus = pResponseStatus_
    }

-- | The response status code.
dsprsResponseStatus :: Lens' DeleteScalingPolicyResponse Int
dsprsResponseStatus = lens _dsprsResponseStatus (\ s a -> s{_dsprsResponseStatus = a});

instance NFData DeleteScalingPolicyResponse