{-# 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.DMS.ModifyReplicationInstance
-- 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)
--
-- Modifies the replication instance to apply new settings. You can change
-- one or more parameters by specifying these parameters and the new values
-- in the request.
--
-- Some settings are applied during the maintenance window.
--
module Network.AWS.DMS.ModifyReplicationInstance
    (
    -- * Creating a Request
      modifyReplicationInstance
    , ModifyReplicationInstance
    -- * Request Lenses
    , mriEngineVersion
    , mriAutoMinorVersionUpgrade
    , mriAllowMajorVersionUpgrade
    , mriPreferredMaintenanceWindow
    , mriAllocatedStorage
    , mriApplyImmediately
    , mriReplicationInstanceClass
    , mriReplicationInstanceIdentifier
    , mriReplicationInstanceARN

    -- * Destructuring the Response
    , modifyReplicationInstanceResponse
    , ModifyReplicationInstanceResponse
    -- * Response Lenses
    , mrirsReplicationInstance
    , mrirsResponseStatus
    ) where

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

-- | /See:/ 'modifyReplicationInstance' smart constructor.
data ModifyReplicationInstance = ModifyReplicationInstance'
    { _mriEngineVersion                 :: !(Maybe Text)
    , _mriAutoMinorVersionUpgrade       :: !(Maybe Bool)
    , _mriAllowMajorVersionUpgrade      :: !(Maybe Bool)
    , _mriPreferredMaintenanceWindow    :: !(Maybe Text)
    , _mriAllocatedStorage              :: !(Maybe Int)
    , _mriApplyImmediately              :: !(Maybe Bool)
    , _mriReplicationInstanceClass      :: !(Maybe Text)
    , _mriReplicationInstanceIdentifier :: !(Maybe Text)
    , _mriReplicationInstanceARN        :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'ModifyReplicationInstance' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'mriEngineVersion'
--
-- * 'mriAutoMinorVersionUpgrade'
--
-- * 'mriAllowMajorVersionUpgrade'
--
-- * 'mriPreferredMaintenanceWindow'
--
-- * 'mriAllocatedStorage'
--
-- * 'mriApplyImmediately'
--
-- * 'mriReplicationInstanceClass'
--
-- * 'mriReplicationInstanceIdentifier'
--
-- * 'mriReplicationInstanceARN'
modifyReplicationInstance
    :: Text -- ^ 'mriReplicationInstanceARN'
    -> ModifyReplicationInstance
modifyReplicationInstance pReplicationInstanceARN_ =
    ModifyReplicationInstance'
    { _mriEngineVersion = Nothing
    , _mriAutoMinorVersionUpgrade = Nothing
    , _mriAllowMajorVersionUpgrade = Nothing
    , _mriPreferredMaintenanceWindow = Nothing
    , _mriAllocatedStorage = Nothing
    , _mriApplyImmediately = Nothing
    , _mriReplicationInstanceClass = Nothing
    , _mriReplicationInstanceIdentifier = Nothing
    , _mriReplicationInstanceARN = pReplicationInstanceARN_
    }

-- | The engine version number of the replication instance.
mriEngineVersion :: Lens' ModifyReplicationInstance (Maybe Text)
mriEngineVersion = lens _mriEngineVersion (\ s a -> s{_mriEngineVersion = a});

-- | Indicates that minor version upgrades will be applied automatically to
-- the replication instance during the maintenance window. Changing this
-- parameter does not result in an outage except in the following case and
-- the change is asynchronously applied as soon as possible. An outage will
-- result if this parameter is set to 'true' during the maintenance window,
-- and a newer minor version is available, and AWS DMS has enabled auto
-- patching for that engine version.
mriAutoMinorVersionUpgrade :: Lens' ModifyReplicationInstance (Maybe Bool)
mriAutoMinorVersionUpgrade = lens _mriAutoMinorVersionUpgrade (\ s a -> s{_mriAutoMinorVersionUpgrade = a});

-- | Indicates that major version upgrades are allowed. Changing this
-- parameter does not result in an outage and the change is asynchronously
-- applied as soon as possible.
--
-- Constraints: This parameter must be set to true when specifying a value
-- for the 'EngineVersion' parameter that is a different major version than
-- the replication instance\'s current version.
mriAllowMajorVersionUpgrade :: Lens' ModifyReplicationInstance (Maybe Bool)
mriAllowMajorVersionUpgrade = lens _mriAllowMajorVersionUpgrade (\ s a -> s{_mriAllowMajorVersionUpgrade = a});

-- | The weekly time range (in UTC) during which system maintenance can
-- occur, which might result in an outage. Changing this parameter does not
-- result in an outage, except in the following situation, and the change
-- is asynchronously applied as soon as possible. If moving this window to
-- the current time, there must be at least 30 minutes between the current
-- time and end of the window to ensure pending changes are applied.
--
-- Default: Uses existing setting
--
-- Format: ddd:hh24:mi-ddd:hh24:mi
--
-- Valid Days: Mon | Tue | Wed | Thu | Fri | Sat | Sun
--
-- Constraints: Must be at least 30 minutes
mriPreferredMaintenanceWindow :: Lens' ModifyReplicationInstance (Maybe Text)
mriPreferredMaintenanceWindow = lens _mriPreferredMaintenanceWindow (\ s a -> s{_mriPreferredMaintenanceWindow = a});

-- | The amount of storage (in gigabytes) to be allocated for the replication
-- instance.
mriAllocatedStorage :: Lens' ModifyReplicationInstance (Maybe Int)
mriAllocatedStorage = lens _mriAllocatedStorage (\ s a -> s{_mriAllocatedStorage = a});

-- | Indicates whether the changes should be applied immediately or during
-- the next maintenance window.
mriApplyImmediately :: Lens' ModifyReplicationInstance (Maybe Bool)
mriApplyImmediately = lens _mriApplyImmediately (\ s a -> s{_mriApplyImmediately = a});

-- | The compute and memory capacity of the replication instance.
--
-- Valid Values:
-- 'dms.t2.micro | dms.t2.small | dms.t2.medium | dms.t2.large | dms.c4.large | dms.c4.xlarge | dms.c4.2xlarge | dms.c4.4xlarge '
mriReplicationInstanceClass :: Lens' ModifyReplicationInstance (Maybe Text)
mriReplicationInstanceClass = lens _mriReplicationInstanceClass (\ s a -> s{_mriReplicationInstanceClass = a});

-- | The replication instance identifier. This parameter is stored as a
-- lowercase string.
mriReplicationInstanceIdentifier :: Lens' ModifyReplicationInstance (Maybe Text)
mriReplicationInstanceIdentifier = lens _mriReplicationInstanceIdentifier (\ s a -> s{_mriReplicationInstanceIdentifier = a});

-- | The Amazon Resource Name (ARN) of the replication instance.
mriReplicationInstanceARN :: Lens' ModifyReplicationInstance Text
mriReplicationInstanceARN = lens _mriReplicationInstanceARN (\ s a -> s{_mriReplicationInstanceARN = a});

instance AWSRequest ModifyReplicationInstance where
        type Rs ModifyReplicationInstance =
             ModifyReplicationInstanceResponse
        request = postJSON dms
        response
          = receiveJSON
              (\ s h x ->
                 ModifyReplicationInstanceResponse' <$>
                   (x .?> "ReplicationInstance") <*>
                     (pure (fromEnum s)))

instance Hashable ModifyReplicationInstance

instance ToHeaders ModifyReplicationInstance where
        toHeaders
          = const
              (mconcat
                 ["X-Amz-Target" =#
                    ("AmazonDMSv20160101.ModifyReplicationInstance" ::
                       ByteString),
                  "Content-Type" =#
                    ("application/x-amz-json-1.1" :: ByteString)])

instance ToJSON ModifyReplicationInstance where
        toJSON ModifyReplicationInstance'{..}
          = object
              (catMaybes
                 [("EngineVersion" .=) <$> _mriEngineVersion,
                  ("AutoMinorVersionUpgrade" .=) <$>
                    _mriAutoMinorVersionUpgrade,
                  ("AllowMajorVersionUpgrade" .=) <$>
                    _mriAllowMajorVersionUpgrade,
                  ("PreferredMaintenanceWindow" .=) <$>
                    _mriPreferredMaintenanceWindow,
                  ("AllocatedStorage" .=) <$> _mriAllocatedStorage,
                  ("ApplyImmediately" .=) <$> _mriApplyImmediately,
                  ("ReplicationInstanceClass" .=) <$>
                    _mriReplicationInstanceClass,
                  ("ReplicationInstanceIdentifier" .=) <$>
                    _mriReplicationInstanceIdentifier,
                  Just
                    ("ReplicationInstanceArn" .=
                       _mriReplicationInstanceARN)])

instance ToPath ModifyReplicationInstance where
        toPath = const "/"

instance ToQuery ModifyReplicationInstance where
        toQuery = const mempty

-- | /See:/ 'modifyReplicationInstanceResponse' smart constructor.
data ModifyReplicationInstanceResponse = ModifyReplicationInstanceResponse'
    { _mrirsReplicationInstance :: !(Maybe ReplicationInstance)
    , _mrirsResponseStatus      :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'ModifyReplicationInstanceResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'mrirsReplicationInstance'
--
-- * 'mrirsResponseStatus'
modifyReplicationInstanceResponse
    :: Int -- ^ 'mrirsResponseStatus'
    -> ModifyReplicationInstanceResponse
modifyReplicationInstanceResponse pResponseStatus_ =
    ModifyReplicationInstanceResponse'
    { _mrirsReplicationInstance = Nothing
    , _mrirsResponseStatus = pResponseStatus_
    }

-- | The modified replication instance.
mrirsReplicationInstance :: Lens' ModifyReplicationInstanceResponse (Maybe ReplicationInstance)
mrirsReplicationInstance = lens _mrirsReplicationInstance (\ s a -> s{_mrirsReplicationInstance = a});

-- | The response status code.
mrirsResponseStatus :: Lens' ModifyReplicationInstanceResponse Int
mrirsResponseStatus = lens _mrirsResponseStatus (\ s a -> s{_mrirsResponseStatus = a});