{-# 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.CreateHostedZone
-- 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)
--
-- This action creates a new hosted zone.
--
-- To create a new hosted zone, send a 'POST' request to the '\/Route 53 API version\/hostedzone' resource. The request body must include a document with a 'CreateHostedZoneRequest' element. The response returns the 'CreateHostedZoneResponse' element that contains metadata about the hosted zone.
--
-- Amazon Route 53 automatically creates a default SOA record and four NS records for the zone. The NS records in the hosted zone are the name servers you give your registrar to delegate your domain to. For more information about SOA and NS records, see <http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/SOA-NSrecords.html NS and SOA Records that Amazon Route 53 Creates for a Hosted Zone> in the /Amazon Route 53 Developer Guide/.
--
-- When you create a zone, its initial status is 'PENDING'. This means that it is not yet available on all DNS servers. The status of the zone changes to 'INSYNC' when the NS and SOA records are available on all Amazon Route 53 DNS servers.
--
-- When trying to create a hosted zone using a reusable delegation set, you could specify an optional DelegationSetId, and Route53 would assign those 4 NS records for the zone, instead of alloting a new one.
module Network.AWS.Route53.CreateHostedZone
    (
    -- * Creating a Request
      createHostedZone
    , CreateHostedZone
    -- * Request Lenses
    , chzDelegationSetId
    , chzVPC
    , chzHostedZoneConfig
    , chzName
    , chzCallerReference

    -- * Destructuring the Response
    , createHostedZoneResponse
    , CreateHostedZoneResponse
    -- * Response Lenses
    , chzrsVPC
    , chzrsResponseStatus
    , chzrsHostedZone
    , chzrsChangeInfo
    , chzrsDelegationSet
    , chzrsLocation
    ) 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 request to create a hosted zone.
--
-- /See:/ 'createHostedZone' smart constructor.
data CreateHostedZone = CreateHostedZone'
    { _chzDelegationSetId  :: !(Maybe Text)
    , _chzVPC              :: !(Maybe VPC)
    , _chzHostedZoneConfig :: !(Maybe HostedZoneConfig)
    , _chzName             :: !Text
    , _chzCallerReference  :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'CreateHostedZone' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'chzDelegationSetId'
--
-- * 'chzVPC'
--
-- * 'chzHostedZoneConfig'
--
-- * 'chzName'
--
-- * 'chzCallerReference'
createHostedZone
    :: Text -- ^ 'chzName'
    -> Text -- ^ 'chzCallerReference'
    -> CreateHostedZone
createHostedZone pName_ pCallerReference_ =
    CreateHostedZone'
    { _chzDelegationSetId = Nothing
    , _chzVPC = Nothing
    , _chzHostedZoneConfig = Nothing
    , _chzName = pName_
    , _chzCallerReference = pCallerReference_
    }

-- | The delegation set id of the reusable delgation set whose NS records you want to assign to the new hosted zone.
chzDelegationSetId :: Lens' CreateHostedZone (Maybe Text)
chzDelegationSetId = lens _chzDelegationSetId (\ s a -> s{_chzDelegationSetId = a});

-- | The VPC that you want your hosted zone to be associated with. By providing this parameter, your newly created hosted cannot be resolved anywhere other than the given VPC.
chzVPC :: Lens' CreateHostedZone (Maybe VPC)
chzVPC = lens _chzVPC (\ s a -> s{_chzVPC = a});

-- | A complex type that contains an optional comment about your hosted zone.
chzHostedZoneConfig :: Lens' CreateHostedZone (Maybe HostedZoneConfig)
chzHostedZoneConfig = lens _chzHostedZoneConfig (\ s a -> s{_chzHostedZoneConfig = a});

-- | The name of the domain. This must be a fully-specified domain, for example, www.example.com. The trailing dot is optional; Amazon Route 53 assumes that the domain name is fully qualified. This means that Amazon Route 53 treats www.example.com (without a trailing dot) and www.example.com. (with a trailing dot) as identical.
--
-- This is the name you have registered with your DNS registrar. You should ask your registrar to change the authoritative name servers for your domain to the set of 'NameServers' elements returned in 'DelegationSet'.
chzName :: Lens' CreateHostedZone Text
chzName = lens _chzName (\ s a -> s{_chzName = a});

-- | A unique string that identifies the request and that allows failed 'CreateHostedZone' requests to be retried without the risk of executing the operation twice. You must use a unique 'CallerReference' string every time you create a hosted zone. 'CallerReference' can be any unique string; you might choose to use a string that identifies your project, such as 'DNSMigration_01'.
--
-- Valid characters are any Unicode code points that are legal in an XML 1.0 document. The UTF-8 encoding of the value must be less than 128 bytes.
chzCallerReference :: Lens' CreateHostedZone Text
chzCallerReference = lens _chzCallerReference (\ s a -> s{_chzCallerReference = a});

instance AWSRequest CreateHostedZone where
        type Rs CreateHostedZone = CreateHostedZoneResponse
        request = postXML route53
        response
          = receiveXML
              (\ s h x ->
                 CreateHostedZoneResponse' <$>
                   (x .@? "VPC") <*> (pure (fromEnum s)) <*>
                     (x .@ "HostedZone")
                     <*> (x .@ "ChangeInfo")
                     <*> (x .@ "DelegationSet")
                     <*> (h .# "Location"))

instance Hashable CreateHostedZone

instance NFData CreateHostedZone

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

instance ToHeaders CreateHostedZone where
        toHeaders = const mempty

instance ToPath CreateHostedZone where
        toPath = const "/2013-04-01/hostedzone"

instance ToQuery CreateHostedZone where
        toQuery = const mempty

instance ToXML CreateHostedZone where
        toXML CreateHostedZone'{..}
          = mconcat
              ["DelegationSetId" @= _chzDelegationSetId,
               "VPC" @= _chzVPC,
               "HostedZoneConfig" @= _chzHostedZoneConfig,
               "Name" @= _chzName,
               "CallerReference" @= _chzCallerReference]

-- | A complex type containing the response information for the new hosted zone.
--
-- /See:/ 'createHostedZoneResponse' smart constructor.
data CreateHostedZoneResponse = CreateHostedZoneResponse'
    { _chzrsVPC            :: !(Maybe VPC)
    , _chzrsResponseStatus :: !Int
    , _chzrsHostedZone     :: !HostedZone
    , _chzrsChangeInfo     :: !ChangeInfo
    , _chzrsDelegationSet  :: !DelegationSet
    , _chzrsLocation       :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'CreateHostedZoneResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'chzrsVPC'
--
-- * 'chzrsResponseStatus'
--
-- * 'chzrsHostedZone'
--
-- * 'chzrsChangeInfo'
--
-- * 'chzrsDelegationSet'
--
-- * 'chzrsLocation'
createHostedZoneResponse
    :: Int -- ^ 'chzrsResponseStatus'
    -> HostedZone -- ^ 'chzrsHostedZone'
    -> ChangeInfo -- ^ 'chzrsChangeInfo'
    -> DelegationSet -- ^ 'chzrsDelegationSet'
    -> Text -- ^ 'chzrsLocation'
    -> CreateHostedZoneResponse
createHostedZoneResponse pResponseStatus_ pHostedZone_ pChangeInfo_ pDelegationSet_ pLocation_ =
    CreateHostedZoneResponse'
    { _chzrsVPC = Nothing
    , _chzrsResponseStatus = pResponseStatus_
    , _chzrsHostedZone = pHostedZone_
    , _chzrsChangeInfo = pChangeInfo_
    , _chzrsDelegationSet = pDelegationSet_
    , _chzrsLocation = pLocation_
    }

-- | Undocumented member.
chzrsVPC :: Lens' CreateHostedZoneResponse (Maybe VPC)
chzrsVPC = lens _chzrsVPC (\ s a -> s{_chzrsVPC = a});

-- | The response status code.
chzrsResponseStatus :: Lens' CreateHostedZoneResponse Int
chzrsResponseStatus = lens _chzrsResponseStatus (\ s a -> s{_chzrsResponseStatus = a});

-- | A complex type that contains identifying information about the hosted zone.
chzrsHostedZone :: Lens' CreateHostedZoneResponse HostedZone
chzrsHostedZone = lens _chzrsHostedZone (\ s a -> s{_chzrsHostedZone = a});

-- | A complex type that contains information about the request to create a hosted zone. This includes an ID that you use when you call the < GetChange> action to get the current status of the change request.
chzrsChangeInfo :: Lens' CreateHostedZoneResponse ChangeInfo
chzrsChangeInfo = lens _chzrsChangeInfo (\ s a -> s{_chzrsChangeInfo = a});

-- | A complex type that contains name server information.
chzrsDelegationSet :: Lens' CreateHostedZoneResponse DelegationSet
chzrsDelegationSet = lens _chzrsDelegationSet (\ s a -> s{_chzrsDelegationSet = a});

-- | The unique URL representing the new hosted zone.
chzrsLocation :: Lens' CreateHostedZoneResponse Text
chzrsLocation = lens _chzrsLocation (\ s a -> s{_chzrsLocation = a});

instance NFData CreateHostedZoneResponse