{-# 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.Route53.CreateTrafficPolicy
-- 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 a traffic policy, which you use to create multiple DNS resource
-- record sets for one domain name (such as example.com) or one subdomain
-- name (such as www.example.com).
--
-- To create a traffic policy, send a 'POST' request to the
-- '\/Route 53 API version\/trafficpolicy' resource. The request body must
-- include a document with a 'CreateTrafficPolicyRequest' element. The
-- response includes the 'CreateTrafficPolicyResponse' element, which
-- contains information about the new traffic policy.
module Network.AWS.Route53.CreateTrafficPolicy
    (
    -- * Creating a Request
      createTrafficPolicy
    , CreateTrafficPolicy
    -- * Request Lenses
    , ctpComment
    , ctpName
    , ctpDocument

    -- * Destructuring the Response
    , createTrafficPolicyResponse
    , CreateTrafficPolicyResponse
    -- * Response Lenses
    , ctprsResponseStatus
    , ctprsTrafficPolicy
    , ctprsLocation
    ) where

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

-- | A complex type that contains information about the traffic policy that
-- you want to create.
--
-- /See:/ 'createTrafficPolicy' smart constructor.
data CreateTrafficPolicy = CreateTrafficPolicy'
    { _ctpComment  :: !(Maybe Text)
    , _ctpName     :: !Text
    , _ctpDocument :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'CreateTrafficPolicy' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ctpComment'
--
-- * 'ctpName'
--
-- * 'ctpDocument'
createTrafficPolicy
    :: Text -- ^ 'ctpName'
    -> Text -- ^ 'ctpDocument'
    -> CreateTrafficPolicy
createTrafficPolicy pName_ pDocument_ =
    CreateTrafficPolicy'
    { _ctpComment = Nothing
    , _ctpName = pName_
    , _ctpDocument = pDocument_
    }

-- | Any comments that you want to include about the traffic policy.
ctpComment :: Lens' CreateTrafficPolicy (Maybe Text)
ctpComment = lens _ctpComment (\ s a -> s{_ctpComment = a});

-- | The name of the traffic policy.
ctpName :: Lens' CreateTrafficPolicy Text
ctpName = lens _ctpName (\ s a -> s{_ctpName = a});

-- | The definition of this traffic policy in JSON format.
ctpDocument :: Lens' CreateTrafficPolicy Text
ctpDocument = lens _ctpDocument (\ s a -> s{_ctpDocument = a});

instance AWSRequest CreateTrafficPolicy where
        type Rs CreateTrafficPolicy =
             CreateTrafficPolicyResponse
        request = postXML route53
        response
          = receiveXML
              (\ s h x ->
                 CreateTrafficPolicyResponse' <$>
                   (pure (fromEnum s)) <*> (x .@ "TrafficPolicy") <*>
                     (h .# "Location"))

instance Hashable CreateTrafficPolicy

instance ToElement CreateTrafficPolicy where
        toElement
          = mkElement
              "{https://route53.amazonaws.com/doc/2013-04-01/}CreateTrafficPolicyRequest"

instance ToHeaders CreateTrafficPolicy where
        toHeaders = const mempty

instance ToPath CreateTrafficPolicy where
        toPath = const "/2013-04-01/trafficpolicy"

instance ToQuery CreateTrafficPolicy where
        toQuery = const mempty

instance ToXML CreateTrafficPolicy where
        toXML CreateTrafficPolicy'{..}
          = mconcat
              ["Comment" @= _ctpComment, "Name" @= _ctpName,
               "Document" @= _ctpDocument]

-- | A complex type that contains the response information for the
-- 'CreateTrafficPolicy' request.
--
-- /See:/ 'createTrafficPolicyResponse' smart constructor.
data CreateTrafficPolicyResponse = CreateTrafficPolicyResponse'
    { _ctprsResponseStatus :: !Int
    , _ctprsTrafficPolicy  :: !TrafficPolicy
    , _ctprsLocation       :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'CreateTrafficPolicyResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ctprsResponseStatus'
--
-- * 'ctprsTrafficPolicy'
--
-- * 'ctprsLocation'
createTrafficPolicyResponse
    :: Int -- ^ 'ctprsResponseStatus'
    -> TrafficPolicy -- ^ 'ctprsTrafficPolicy'
    -> Text -- ^ 'ctprsLocation'
    -> CreateTrafficPolicyResponse
createTrafficPolicyResponse pResponseStatus_ pTrafficPolicy_ pLocation_ =
    CreateTrafficPolicyResponse'
    { _ctprsResponseStatus = pResponseStatus_
    , _ctprsTrafficPolicy = pTrafficPolicy_
    , _ctprsLocation = pLocation_
    }

-- | The response status code.
ctprsResponseStatus :: Lens' CreateTrafficPolicyResponse Int
ctprsResponseStatus = lens _ctprsResponseStatus (\ s a -> s{_ctprsResponseStatus = a});

-- | A complex type that contains settings for the new traffic policy.
ctprsTrafficPolicy :: Lens' CreateTrafficPolicyResponse TrafficPolicy
ctprsTrafficPolicy = lens _ctprsTrafficPolicy (\ s a -> s{_ctprsTrafficPolicy = a});

-- | Undocumented member.
ctprsLocation :: Lens' CreateTrafficPolicyResponse Text
ctprsLocation = lens _ctprsLocation (\ s a -> s{_ctprsLocation = a});