{-# 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.CreateEnvironment
-- 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)
--
-- Launches an environment for the specified application using the
-- specified configuration.
module Network.AWS.ElasticBeanstalk.CreateEnvironment
    (
    -- * Creating a Request
      createEnvironment
    , CreateEnvironment
    -- * Request Lenses
    , cCNAMEPrefix
    , cTemplateName
    , cOptionsToRemove
    , cOptionSettings
    , cVersionLabel
    , cTier
    , cEnvironmentName
    , cSolutionStackName
    , cGroupName
    , cDescription
    , cTags
    , cApplicationName

    -- * 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

-- |
--
-- /See:/ 'createEnvironment' smart constructor.
data CreateEnvironment = CreateEnvironment'
    { _cCNAMEPrefix       :: !(Maybe Text)
    , _cTemplateName      :: !(Maybe Text)
    , _cOptionsToRemove   :: !(Maybe [OptionSpecification])
    , _cOptionSettings    :: !(Maybe [ConfigurationOptionSetting])
    , _cVersionLabel      :: !(Maybe Text)
    , _cTier              :: !(Maybe EnvironmentTier)
    , _cEnvironmentName   :: !(Maybe Text)
    , _cSolutionStackName :: !(Maybe Text)
    , _cGroupName         :: !(Maybe Text)
    , _cDescription       :: !(Maybe Text)
    , _cTags              :: !(Maybe [Tag])
    , _cApplicationName   :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'CreateEnvironment' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cCNAMEPrefix'
--
-- * 'cTemplateName'
--
-- * 'cOptionsToRemove'
--
-- * 'cOptionSettings'
--
-- * 'cVersionLabel'
--
-- * 'cTier'
--
-- * 'cEnvironmentName'
--
-- * 'cSolutionStackName'
--
-- * 'cGroupName'
--
-- * 'cDescription'
--
-- * 'cTags'
--
-- * 'cApplicationName'
createEnvironment
    :: Text -- ^ 'cApplicationName'
    -> CreateEnvironment
createEnvironment pApplicationName_ =
    CreateEnvironment'
    { _cCNAMEPrefix = Nothing
    , _cTemplateName = Nothing
    , _cOptionsToRemove = Nothing
    , _cOptionSettings = Nothing
    , _cVersionLabel = Nothing
    , _cTier = Nothing
    , _cEnvironmentName = Nothing
    , _cSolutionStackName = Nothing
    , _cGroupName = Nothing
    , _cDescription = Nothing
    , _cTags = Nothing
    , _cApplicationName = pApplicationName_
    }

-- | If specified, the environment attempts to use this value as the prefix
-- for the CNAME. If not specified, the CNAME is generated automatically by
-- appending a random alphanumeric string to the environment name.
cCNAMEPrefix :: Lens' CreateEnvironment (Maybe Text)
cCNAMEPrefix = lens _cCNAMEPrefix (\ s a -> s{_cCNAMEPrefix = a});

-- | The name of the configuration template to use in deployment. If no
-- configuration template is found with this name, AWS Elastic Beanstalk
-- returns an 'InvalidParameterValue' error.
--
-- Condition: You must specify either this parameter or a
-- 'SolutionStackName', but not both. If you specify both, AWS Elastic
-- Beanstalk returns an 'InvalidParameterCombination' error. If you do not
-- specify either, AWS Elastic Beanstalk returns a
-- 'MissingRequiredParameter' error.
cTemplateName :: Lens' CreateEnvironment (Maybe Text)
cTemplateName = lens _cTemplateName (\ s a -> s{_cTemplateName = a});

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

-- | If specified, AWS Elastic Beanstalk sets the specified configuration
-- options to the requested value in the configuration set for the new
-- environment. These override the values obtained from the solution stack
-- or the configuration template.
cOptionSettings :: Lens' CreateEnvironment [ConfigurationOptionSetting]
cOptionSettings = lens _cOptionSettings (\ s a -> s{_cOptionSettings = a}) . _Default . _Coerce;

-- | The name of the application version to deploy.
--
-- If the specified application has no associated application versions, AWS
-- Elastic Beanstalk 'UpdateEnvironment' returns an 'InvalidParameterValue'
-- error.
--
-- Default: If not specified, AWS Elastic Beanstalk attempts to launch the
-- sample application in the container.
cVersionLabel :: Lens' CreateEnvironment (Maybe Text)
cVersionLabel = lens _cVersionLabel (\ s a -> s{_cVersionLabel = a});

-- | This specifies the tier to use for creating this environment.
cTier :: Lens' CreateEnvironment (Maybe EnvironmentTier)
cTier = lens _cTier (\ s a -> s{_cTier = a});

-- | A unique name for the deployment environment. Used in the application
-- URL.
--
-- Constraint: Must be from 4 to 23 characters in length. The name can
-- contain only letters, numbers, and hyphens. It cannot start or end with
-- a hyphen. This name must be unique in your account. If the specified
-- name already exists, AWS Elastic Beanstalk returns an
-- 'InvalidParameterValue' error.
--
-- Default: If the CNAME parameter is not specified, the environment name
-- becomes part of the CNAME, and therefore part of the visible URL for
-- your application.
cEnvironmentName :: Lens' CreateEnvironment (Maybe Text)
cEnvironmentName = lens _cEnvironmentName (\ s a -> s{_cEnvironmentName = a});

-- | This is an alternative to specifying a template name. If specified, AWS
-- Elastic Beanstalk sets the configuration values to the default values
-- associated with the specified solution stack.
--
-- Condition: You must specify either this or a 'TemplateName', but not
-- both. If you specify both, AWS Elastic Beanstalk returns an
-- 'InvalidParameterCombination' error. If you do not specify either, AWS
-- Elastic Beanstalk returns a 'MissingRequiredParameter' error.
cSolutionStackName :: Lens' CreateEnvironment (Maybe Text)
cSolutionStackName = lens _cSolutionStackName (\ s a -> s{_cSolutionStackName = 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 parameter. See
-- <http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/environment-mgmt-compose.html#environment-mgmt-compose-envyaml Environment Manifest (env.yaml)>
-- for details.
cGroupName :: Lens' CreateEnvironment (Maybe Text)
cGroupName = lens _cGroupName (\ s a -> s{_cGroupName = a});

-- | Describes this environment.
cDescription :: Lens' CreateEnvironment (Maybe Text)
cDescription = lens _cDescription (\ s a -> s{_cDescription = a});

-- | This specifies the tags applied to resources in the environment.
cTags :: Lens' CreateEnvironment [Tag]
cTags = lens _cTags (\ s a -> s{_cTags = a}) . _Default . _Coerce;

-- | The name of the application that contains the version to be deployed.
--
-- If no application is found with this name, 'CreateEnvironment' returns
-- an 'InvalidParameterValue' error.
cApplicationName :: Lens' CreateEnvironment Text
cApplicationName = lens _cApplicationName (\ s a -> s{_cApplicationName = a});

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

instance Hashable CreateEnvironment

instance ToHeaders CreateEnvironment where
        toHeaders = const mempty

instance ToPath CreateEnvironment where
        toPath = const "/"

instance ToQuery CreateEnvironment where
        toQuery CreateEnvironment'{..}
          = mconcat
              ["Action" =: ("CreateEnvironment" :: ByteString),
               "Version" =: ("2010-12-01" :: ByteString),
               "CNAMEPrefix" =: _cCNAMEPrefix,
               "TemplateName" =: _cTemplateName,
               "OptionsToRemove" =:
                 toQuery (toQueryList "member" <$> _cOptionsToRemove),
               "OptionSettings" =:
                 toQuery (toQueryList "member" <$> _cOptionSettings),
               "VersionLabel" =: _cVersionLabel, "Tier" =: _cTier,
               "EnvironmentName" =: _cEnvironmentName,
               "SolutionStackName" =: _cSolutionStackName,
               "GroupName" =: _cGroupName,
               "Description" =: _cDescription,
               "Tags" =: toQuery (toQueryList "member" <$> _cTags),
               "ApplicationName" =: _cApplicationName]