{-# 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.ElasticBeanstalk.UpdateEnvironment
-- 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)
--
-- Updates the environment description, deploys a new application version, updates the configuration settings to an entirely new configuration template, or updates select configuration option values in the running environment.
--
-- Attempting to update both the release and configuration is not allowed and AWS Elastic Beanstalk returns an 'InvalidParameterCombination' error.
--
-- When updating the configuration settings to a new template or individual settings, a draft configuration is created and < DescribeConfigurationSettings> for this environment returns two setting descriptions with different 'DeploymentStatus' values.
module Network.AWS.ElasticBeanstalk.UpdateEnvironment
    (
    -- * Creating a Request
      updateEnvironment
    , UpdateEnvironment
    -- * Request Lenses
    , ueTemplateName
    , ueOptionsToRemove
    , ueOptionSettings
    , ueVersionLabel
    , ueTier
    , ueEnvironmentName
    , ueApplicationName
    , ueSolutionStackName
    , ueEnvironmentId
    , ueGroupName
    , ueDescription

    -- * Destructuring the Response
    , environmentDescription
    , EnvironmentDescription
    -- * Response Lenses
    , eStatus
    , eCNAME
    , eTemplateName
    , eAbortableOperationInProgress
    , eEndpointURL
    , eResources
    , eDateUpdated
    , eDateCreated
    , eHealth
    , eVersionLabel
    , eTier
    , eEnvironmentName
    , eApplicationName
    , eSolutionStackName
    , eEnvironmentId
    , eHealthStatus
    , eEnvironmentLinks
    , eDescription
    ) where

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

-- | Request to update an environment.
--
-- /See:/ 'updateEnvironment' smart constructor.
data UpdateEnvironment = UpdateEnvironment'
    { _ueTemplateName      :: !(Maybe Text)
    , _ueOptionsToRemove   :: !(Maybe [OptionSpecification])
    , _ueOptionSettings    :: !(Maybe [ConfigurationOptionSetting])
    , _ueVersionLabel      :: !(Maybe Text)
    , _ueTier              :: !(Maybe EnvironmentTier)
    , _ueEnvironmentName   :: !(Maybe Text)
    , _ueApplicationName   :: !(Maybe Text)
    , _ueSolutionStackName :: !(Maybe Text)
    , _ueEnvironmentId     :: !(Maybe Text)
    , _ueGroupName         :: !(Maybe Text)
    , _ueDescription       :: !(Maybe Text)
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'UpdateEnvironment' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ueTemplateName'
--
-- * 'ueOptionsToRemove'
--
-- * 'ueOptionSettings'
--
-- * 'ueVersionLabel'
--
-- * 'ueTier'
--
-- * 'ueEnvironmentName'
--
-- * 'ueApplicationName'
--
-- * 'ueSolutionStackName'
--
-- * 'ueEnvironmentId'
--
-- * 'ueGroupName'
--
-- * 'ueDescription'
updateEnvironment
    :: UpdateEnvironment
updateEnvironment =
    UpdateEnvironment'
    { _ueTemplateName = Nothing
    , _ueOptionsToRemove = Nothing
    , _ueOptionSettings = Nothing
    , _ueVersionLabel = Nothing
    , _ueTier = Nothing
    , _ueEnvironmentName = Nothing
    , _ueApplicationName = Nothing
    , _ueSolutionStackName = Nothing
    , _ueEnvironmentId = Nothing
    , _ueGroupName = Nothing
    , _ueDescription = Nothing
    }

-- | If this parameter is specified, AWS Elastic Beanstalk deploys this configuration template to the environment. If no such configuration template is found, AWS Elastic Beanstalk returns an 'InvalidParameterValue' error.
ueTemplateName :: Lens' UpdateEnvironment (Maybe Text)
ueTemplateName = lens _ueTemplateName (\ s a -> s{_ueTemplateName = a});

-- | A list of custom user-defined configuration options to remove from the configuration set for this environment.
ueOptionsToRemove :: Lens' UpdateEnvironment [OptionSpecification]
ueOptionsToRemove = lens _ueOptionsToRemove (\ s a -> s{_ueOptionsToRemove = a}) . _Default . _Coerce;

-- | If specified, AWS Elastic Beanstalk updates the configuration set associated with the running environment and sets the specified configuration options to the requested value.
ueOptionSettings :: Lens' UpdateEnvironment [ConfigurationOptionSetting]
ueOptionSettings = lens _ueOptionSettings (\ s a -> s{_ueOptionSettings = a}) . _Default . _Coerce;

-- | If this parameter is specified, AWS Elastic Beanstalk deploys the named application version to the environment. If no such application version is found, returns an 'InvalidParameterValue' error.
ueVersionLabel :: Lens' UpdateEnvironment (Maybe Text)
ueVersionLabel = lens _ueVersionLabel (\ s a -> s{_ueVersionLabel = a});

-- | This specifies the tier to use to update the environment.
--
-- Condition: At this time, if you change the tier version, name, or type, AWS Elastic Beanstalk returns 'InvalidParameterValue' error.
ueTier :: Lens' UpdateEnvironment (Maybe EnvironmentTier)
ueTier = lens _ueTier (\ s a -> s{_ueTier = a});

-- | The name of the environment to update. If no environment with this name exists, AWS Elastic Beanstalk returns an 'InvalidParameterValue' error.
--
-- Condition: You must specify either this or an EnvironmentId, or both. If you do not specify either, AWS Elastic Beanstalk returns 'MissingRequiredParameter' error.
ueEnvironmentName :: Lens' UpdateEnvironment (Maybe Text)
ueEnvironmentName = lens _ueEnvironmentName (\ s a -> s{_ueEnvironmentName = a});

-- | The name of the application with which the environment is associated.
ueApplicationName :: Lens' UpdateEnvironment (Maybe Text)
ueApplicationName = lens _ueApplicationName (\ s a -> s{_ueApplicationName = a});

-- | This specifies the platform version that the environment will run after the environment is updated.
ueSolutionStackName :: Lens' UpdateEnvironment (Maybe Text)
ueSolutionStackName = lens _ueSolutionStackName (\ s a -> s{_ueSolutionStackName = a});

-- | The ID of the environment to update.
--
-- If no environment with this ID exists, AWS Elastic Beanstalk returns an 'InvalidParameterValue' error.
--
-- Condition: You must specify either this or an EnvironmentName, or both. If you do not specify either, AWS Elastic Beanstalk returns 'MissingRequiredParameter' error.
ueEnvironmentId :: Lens' UpdateEnvironment (Maybe Text)
ueEnvironmentId = lens _ueEnvironmentId (\ s a -> s{_ueEnvironmentId = a});

-- | The name of the group to which the target environment belongs. Specify a group name only if the environment\'s name is specified in an environment manifest and not with the environment name or environment ID parameters. See <http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environment-cfg-manifest.html Environment Manifest (env.yaml)> for details.
ueGroupName :: Lens' UpdateEnvironment (Maybe Text)
ueGroupName = lens _ueGroupName (\ s a -> s{_ueGroupName = a});

-- | If this parameter is specified, AWS Elastic Beanstalk updates the description of this environment.
ueDescription :: Lens' UpdateEnvironment (Maybe Text)
ueDescription = lens _ueDescription (\ s a -> s{_ueDescription = a});

instance AWSRequest UpdateEnvironment where
        type Rs UpdateEnvironment = EnvironmentDescription
        request = postQuery elasticBeanstalk
        response
          = receiveXMLWrapper "UpdateEnvironmentResult"
              (\ s h x -> parseXML x)

instance Hashable UpdateEnvironment

instance NFData UpdateEnvironment

instance ToHeaders UpdateEnvironment where
        toHeaders = const mempty

instance ToPath UpdateEnvironment where
        toPath = const "/"

instance ToQuery UpdateEnvironment where
        toQuery UpdateEnvironment'{..}
          = mconcat
              ["Action" =: ("UpdateEnvironment" :: ByteString),
               "Version" =: ("2010-12-01" :: ByteString),
               "TemplateName" =: _ueTemplateName,
               "OptionsToRemove" =:
                 toQuery
                   (toQueryList "member" <$> _ueOptionsToRemove),
               "OptionSettings" =:
                 toQuery (toQueryList "member" <$> _ueOptionSettings),
               "VersionLabel" =: _ueVersionLabel, "Tier" =: _ueTier,
               "EnvironmentName" =: _ueEnvironmentName,
               "ApplicationName" =: _ueApplicationName,
               "SolutionStackName" =: _ueSolutionStackName,
               "EnvironmentId" =: _ueEnvironmentId,
               "GroupName" =: _ueGroupName,
               "Description" =: _ueDescription]