{-# 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.CreateReplicationInstance
-- 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 the replication instance using the specified parameters.
--
module Network.AWS.DMS.CreateReplicationInstance
    (
    -- * Creating a Request
      createReplicationInstance
    , CreateReplicationInstance
    -- * Request Lenses
    , criEngineVersion
    , criPubliclyAccessible
    , criAutoMinorVersionUpgrade
    , criReplicationSubnetGroupIdentifier
    , criPreferredMaintenanceWindow
    , criKMSKeyId
    , criAvailabilityZone
    , criAllocatedStorage
    , criTags
    , criReplicationInstanceIdentifier
    , criReplicationInstanceClass

    -- * Destructuring the Response
    , createReplicationInstanceResponse
    , CreateReplicationInstanceResponse
    -- * Response Lenses
    , crirsReplicationInstance
    , crirsResponseStatus
    ) 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:/ 'createReplicationInstance' smart constructor.
data CreateReplicationInstance = CreateReplicationInstance'
    { _criEngineVersion                    :: !(Maybe Text)
    , _criPubliclyAccessible               :: !(Maybe Bool)
    , _criAutoMinorVersionUpgrade          :: !(Maybe Bool)
    , _criReplicationSubnetGroupIdentifier :: !(Maybe Text)
    , _criPreferredMaintenanceWindow       :: !(Maybe Text)
    , _criKMSKeyId                         :: !(Maybe Text)
    , _criAvailabilityZone                 :: !(Maybe Text)
    , _criAllocatedStorage                 :: !(Maybe Int)
    , _criTags                             :: !(Maybe [Tag])
    , _criReplicationInstanceIdentifier    :: !Text
    , _criReplicationInstanceClass         :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'CreateReplicationInstance' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'criEngineVersion'
--
-- * 'criPubliclyAccessible'
--
-- * 'criAutoMinorVersionUpgrade'
--
-- * 'criReplicationSubnetGroupIdentifier'
--
-- * 'criPreferredMaintenanceWindow'
--
-- * 'criKMSKeyId'
--
-- * 'criAvailabilityZone'
--
-- * 'criAllocatedStorage'
--
-- * 'criTags'
--
-- * 'criReplicationInstanceIdentifier'
--
-- * 'criReplicationInstanceClass'
createReplicationInstance
    :: Text -- ^ 'criReplicationInstanceIdentifier'
    -> Text -- ^ 'criReplicationInstanceClass'
    -> CreateReplicationInstance
createReplicationInstance pReplicationInstanceIdentifier_ pReplicationInstanceClass_ =
    CreateReplicationInstance'
    { _criEngineVersion = Nothing
    , _criPubliclyAccessible = Nothing
    , _criAutoMinorVersionUpgrade = Nothing
    , _criReplicationSubnetGroupIdentifier = Nothing
    , _criPreferredMaintenanceWindow = Nothing
    , _criKMSKeyId = Nothing
    , _criAvailabilityZone = Nothing
    , _criAllocatedStorage = Nothing
    , _criTags = Nothing
    , _criReplicationInstanceIdentifier = pReplicationInstanceIdentifier_
    , _criReplicationInstanceClass = pReplicationInstanceClass_
    }

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

-- | Specifies the accessibility options for the replication instance. A
-- value of 'true' represents an instance with a public IP address. A value
-- of 'false' represents an instance with a private IP address. The default
-- value is 'true'.
criPubliclyAccessible :: Lens' CreateReplicationInstance (Maybe Bool)
criPubliclyAccessible = lens _criPubliclyAccessible (\ s a -> s{_criPubliclyAccessible = a});

-- | Indicates that minor engine upgrades will be applied automatically to
-- the replication instance during the maintenance window.
--
-- Default: 'true'
criAutoMinorVersionUpgrade :: Lens' CreateReplicationInstance (Maybe Bool)
criAutoMinorVersionUpgrade = lens _criAutoMinorVersionUpgrade (\ s a -> s{_criAutoMinorVersionUpgrade = a});

-- | A subnet group to associate with the replication instance.
criReplicationSubnetGroupIdentifier :: Lens' CreateReplicationInstance (Maybe Text)
criReplicationSubnetGroupIdentifier = lens _criReplicationSubnetGroupIdentifier (\ s a -> s{_criReplicationSubnetGroupIdentifier = a});

-- | The weekly time range during which system maintenance can occur, in
-- Universal Coordinated Time (UTC).
--
-- Format: 'ddd:hh24:mi-ddd:hh24:mi'
--
-- Default: A 30-minute window selected at random from an 8-hour block of
-- time per region, occurring on a random day of the week.
--
-- Valid Days: Mon, Tue, Wed, Thu, Fri, Sat, Sun
--
-- Constraints: Minimum 30-minute window.
criPreferredMaintenanceWindow :: Lens' CreateReplicationInstance (Maybe Text)
criPreferredMaintenanceWindow = lens _criPreferredMaintenanceWindow (\ s a -> s{_criPreferredMaintenanceWindow = a});

-- | The KMS key identifier that will be used to encrypt the content on the
-- replication instance. If you do not specify a value for the KmsKeyId
-- parameter, then AWS DMS will use your default encryption key. AWS KMS
-- creates the default encryption key for your AWS account. Your AWS
-- account has a different default encryption key for each AWS region.
criKMSKeyId :: Lens' CreateReplicationInstance (Maybe Text)
criKMSKeyId = lens _criKMSKeyId (\ s a -> s{_criKMSKeyId = a});

-- | The EC2 Availability Zone that the replication instance will be created
-- in.
--
-- Default: A random, system-chosen Availability Zone in the endpoint\'s
-- region.
--
-- Example: 'us-east-1d'
criAvailabilityZone :: Lens' CreateReplicationInstance (Maybe Text)
criAvailabilityZone = lens _criAvailabilityZone (\ s a -> s{_criAvailabilityZone = a});

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

-- | Tags to be associated with the replication instance.
criTags :: Lens' CreateReplicationInstance [Tag]
criTags = lens _criTags (\ s a -> s{_criTags = a}) . _Default . _Coerce;

-- | The replication instance identifier. This parameter is stored as a
-- lowercase string.
--
-- Constraints:
--
-- -   Must contain from 1 to 63 alphanumeric characters or hyphens.
-- -   First character must be a letter.
-- -   Cannot end with a hyphen or contain two consecutive hyphens.
--
-- Example: 'myrepinstance'
criReplicationInstanceIdentifier :: Lens' CreateReplicationInstance Text
criReplicationInstanceIdentifier = lens _criReplicationInstanceIdentifier (\ s a -> s{_criReplicationInstanceIdentifier = a});

-- | The compute and memory capacity of the replication instance as specified
-- by the replication instance class.
--
-- 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 '
criReplicationInstanceClass :: Lens' CreateReplicationInstance Text
criReplicationInstanceClass = lens _criReplicationInstanceClass (\ s a -> s{_criReplicationInstanceClass = a});

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

instance Hashable CreateReplicationInstance

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

instance ToJSON CreateReplicationInstance where
        toJSON CreateReplicationInstance'{..}
          = object
              (catMaybes
                 [("EngineVersion" .=) <$> _criEngineVersion,
                  ("PubliclyAccessible" .=) <$> _criPubliclyAccessible,
                  ("AutoMinorVersionUpgrade" .=) <$>
                    _criAutoMinorVersionUpgrade,
                  ("ReplicationSubnetGroupIdentifier" .=) <$>
                    _criReplicationSubnetGroupIdentifier,
                  ("PreferredMaintenanceWindow" .=) <$>
                    _criPreferredMaintenanceWindow,
                  ("KmsKeyId" .=) <$> _criKMSKeyId,
                  ("AvailabilityZone" .=) <$> _criAvailabilityZone,
                  ("AllocatedStorage" .=) <$> _criAllocatedStorage,
                  ("Tags" .=) <$> _criTags,
                  Just
                    ("ReplicationInstanceIdentifier" .=
                       _criReplicationInstanceIdentifier),
                  Just
                    ("ReplicationInstanceClass" .=
                       _criReplicationInstanceClass)])

instance ToPath CreateReplicationInstance where
        toPath = const "/"

instance ToQuery CreateReplicationInstance where
        toQuery = const mempty

-- | /See:/ 'createReplicationInstanceResponse' smart constructor.
data CreateReplicationInstanceResponse = CreateReplicationInstanceResponse'
    { _crirsReplicationInstance :: !(Maybe ReplicationInstance)
    , _crirsResponseStatus      :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'CreateReplicationInstanceResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'crirsReplicationInstance'
--
-- * 'crirsResponseStatus'
createReplicationInstanceResponse
    :: Int -- ^ 'crirsResponseStatus'
    -> CreateReplicationInstanceResponse
createReplicationInstanceResponse pResponseStatus_ =
    CreateReplicationInstanceResponse'
    { _crirsReplicationInstance = Nothing
    , _crirsResponseStatus = pResponseStatus_
    }

-- | The replication instance that was created.
crirsReplicationInstance :: Lens' CreateReplicationInstanceResponse (Maybe ReplicationInstance)
crirsReplicationInstance = lens _crirsReplicationInstance (\ s a -> s{_crirsReplicationInstance = a});

-- | The response status code.
crirsResponseStatus :: Lens' CreateReplicationInstanceResponse Int
crirsResponseStatus = lens _crirsResponseStatus (\ s a -> s{_crirsResponseStatus = a});