{-# 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.SES.SetIdentityMailFromDomain
-- 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)
--
-- Enables or disables the custom MAIL FROM domain setup for a verified
-- identity (email address or domain).
--
-- To send emails using the specified MAIL FROM domain, you must add an MX
-- record to your MAIL FROM domain\'s DNS settings. If you want your emails
-- to pass Sender Policy Framework (SPF) checks, you must also add or
-- update an SPF record. For more information, see the
-- <http://docs.aws.amazon.com/ses/latest/DeveloperGuide/mail-from-set.html Amazon SES Developer Guide>.
--
-- This action is throttled at one request per second.
module Network.AWS.SES.SetIdentityMailFromDomain
    (
    -- * Creating a Request
      setIdentityMailFromDomain
    , SetIdentityMailFromDomain
    -- * Request Lenses
    , simfdMailFromDomain
    , simfdBehaviorOnMXFailure
    , simfdIdentity

    -- * Destructuring the Response
    , setIdentityMailFromDomainResponse
    , SetIdentityMailFromDomainResponse
    -- * Response Lenses
    , simfdrsResponseStatus
    ) where

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

-- | /See:/ 'setIdentityMailFromDomain' smart constructor.
data SetIdentityMailFromDomain = SetIdentityMailFromDomain'
    { _simfdMailFromDomain      :: !(Maybe Text)
    , _simfdBehaviorOnMXFailure :: !(Maybe BehaviorOnMXFailure)
    , _simfdIdentity            :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'SetIdentityMailFromDomain' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'simfdMailFromDomain'
--
-- * 'simfdBehaviorOnMXFailure'
--
-- * 'simfdIdentity'
setIdentityMailFromDomain
    :: Text -- ^ 'simfdIdentity'
    -> SetIdentityMailFromDomain
setIdentityMailFromDomain pIdentity_ =
    SetIdentityMailFromDomain'
    { _simfdMailFromDomain = Nothing
    , _simfdBehaviorOnMXFailure = Nothing
    , _simfdIdentity = pIdentity_
    }

-- | The custom MAIL FROM domain that you want the verified identity to use.
-- The MAIL FROM domain must 1) be a subdomain of the verified identity, 2)
-- not be used in a \"From\" address if the MAIL FROM domain is the
-- destination of email feedback forwarding (for more information, see the
-- <http://docs.aws.amazon.com/ses/latest/DeveloperGuide/mail-from.html Amazon SES Developer Guide>),
-- and 3) not be used to receive emails. A value of 'null' disables the
-- custom MAIL FROM setting for the identity.
simfdMailFromDomain :: Lens' SetIdentityMailFromDomain (Maybe Text)
simfdMailFromDomain = lens _simfdMailFromDomain (\ s a -> s{_simfdMailFromDomain = a});

-- | The action that you want Amazon SES to take if it cannot successfully
-- read the required MX record when you send an email. If you choose
-- 'UseDefaultValue', Amazon SES will use amazonses.com (or a subdomain of
-- that) as the MAIL FROM domain. If you choose 'RejectMessage', Amazon SES
-- will return a 'MailFromDomainNotVerified' error and not send the email.
--
-- The action specified in 'BehaviorOnMXFailure' is taken when the custom
-- MAIL FROM domain setup is in the 'Pending', 'Failed', and
-- 'TemporaryFailure' states.
simfdBehaviorOnMXFailure :: Lens' SetIdentityMailFromDomain (Maybe BehaviorOnMXFailure)
simfdBehaviorOnMXFailure = lens _simfdBehaviorOnMXFailure (\ s a -> s{_simfdBehaviorOnMXFailure = a});

-- | The verified identity for which you want to enable or disable the
-- specified custom MAIL FROM domain.
simfdIdentity :: Lens' SetIdentityMailFromDomain Text
simfdIdentity = lens _simfdIdentity (\ s a -> s{_simfdIdentity = a});

instance AWSRequest SetIdentityMailFromDomain where
        type Rs SetIdentityMailFromDomain =
             SetIdentityMailFromDomainResponse
        request = postQuery ses
        response
          = receiveXMLWrapper "SetIdentityMailFromDomainResult"
              (\ s h x ->
                 SetIdentityMailFromDomainResponse' <$>
                   (pure (fromEnum s)))

instance Hashable SetIdentityMailFromDomain

instance NFData SetIdentityMailFromDomain

instance ToHeaders SetIdentityMailFromDomain where
        toHeaders = const mempty

instance ToPath SetIdentityMailFromDomain where
        toPath = const "/"

instance ToQuery SetIdentityMailFromDomain where
        toQuery SetIdentityMailFromDomain'{..}
          = mconcat
              ["Action" =:
                 ("SetIdentityMailFromDomain" :: ByteString),
               "Version" =: ("2010-12-01" :: ByteString),
               "MailFromDomain" =: _simfdMailFromDomain,
               "BehaviorOnMXFailure" =: _simfdBehaviorOnMXFailure,
               "Identity" =: _simfdIdentity]

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

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

-- | The response status code.
simfdrsResponseStatus :: Lens' SetIdentityMailFromDomainResponse Int
simfdrsResponseStatus = lens _simfdrsResponseStatus (\ s a -> s{_simfdrsResponseStatus = a});

instance NFData SetIdentityMailFromDomainResponse