{-# 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.RDS.RestoreDBInstanceToPointInTime
-- Copyright   : (c) 2013-2015 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)
--
-- Restores a DB instance to an arbitrary point-in-time. Users can restore
-- to any point in time before the LatestRestorableTime for up to
-- BackupRetentionPeriod days. The target database is created with the most
-- of original configuration, but in a system chosen availability zone with
-- the default security group, the default subnet group, and the default DB
-- parameter group. By default, the new DB instance is created as a
-- single-AZ deployment except when the instance is a SQL Server instance
-- that has an option group that is associated with mirroring; in this
-- case, the instance becomes a mirrored deployment and not a single-AZ
-- deployment.
--
-- /See:/ <http://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceToPointInTime.html AWS API Reference> for RestoreDBInstanceToPointInTime.
module Network.AWS.RDS.RestoreDBInstanceToPointInTime
    (
    -- * Creating a Request
      restoreDBInstanceToPointInTime
    , RestoreDBInstanceToPointInTime
    -- * Request Lenses
    , rditpitDBSecurityGroups
    , rditpitUseLatestRestorableTime
    , rditpitPubliclyAccessible
    , rditpitAutoMinorVersionUpgrade
    , rditpitDBSubnetGroupName
    , rditpitRestoreTime
    , rditpitIOPS
    , rditpitDomain
    , rditpitEngine
    , rditpitTDECredentialPassword
    , rditpitDBInstanceClass
    , rditpitLicenseModel
    , rditpitAvailabilityZone
    , rditpitVPCSecurityGroupIds
    , rditpitMultiAZ
    , rditpitOptionGroupName
    , rditpitCopyTagsToSnapshot
    , rditpitTDECredentialARN
    , rditpitTags
    , rditpitPort
    , rditpitStorageType
    , rditpitDBName
    , rditpitSourceDBInstanceIdentifier
    , rditpitTargetDBInstanceIdentifier

    -- * Destructuring the Response
    , restoreDBInstanceToPointInTimeResponse
    , RestoreDBInstanceToPointInTimeResponse
    -- * Response Lenses
    , rditpitrsDBInstance
    , rditpitrsResponseStatus
    ) where

import           Network.AWS.Prelude
import           Network.AWS.RDS.Types
import           Network.AWS.RDS.Types.Product
import           Network.AWS.Request
import           Network.AWS.Response

-- |
--
-- /See:/ 'restoreDBInstanceToPointInTime' smart constructor.
data RestoreDBInstanceToPointInTime = RestoreDBInstanceToPointInTime'
    { _rditpitDBSecurityGroups           :: !(Maybe [Text])
    , _rditpitUseLatestRestorableTime    :: !(Maybe Bool)
    , _rditpitPubliclyAccessible         :: !(Maybe Bool)
    , _rditpitAutoMinorVersionUpgrade    :: !(Maybe Bool)
    , _rditpitDBSubnetGroupName          :: !(Maybe Text)
    , _rditpitRestoreTime                :: !(Maybe ISO8601)
    , _rditpitIOPS                       :: !(Maybe Int)
    , _rditpitDomain                     :: !(Maybe Text)
    , _rditpitEngine                     :: !(Maybe Text)
    , _rditpitTDECredentialPassword      :: !(Maybe Text)
    , _rditpitDBInstanceClass            :: !(Maybe Text)
    , _rditpitLicenseModel               :: !(Maybe Text)
    , _rditpitAvailabilityZone           :: !(Maybe Text)
    , _rditpitVPCSecurityGroupIds        :: !(Maybe [Text])
    , _rditpitMultiAZ                    :: !(Maybe Bool)
    , _rditpitOptionGroupName            :: !(Maybe Text)
    , _rditpitCopyTagsToSnapshot         :: !(Maybe Bool)
    , _rditpitTDECredentialARN           :: !(Maybe Text)
    , _rditpitTags                       :: !(Maybe [Tag])
    , _rditpitPort                       :: !(Maybe Int)
    , _rditpitStorageType                :: !(Maybe Text)
    , _rditpitDBName                     :: !(Maybe Text)
    , _rditpitSourceDBInstanceIdentifier :: !Text
    , _rditpitTargetDBInstanceIdentifier :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'RestoreDBInstanceToPointInTime' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'rditpitDBSecurityGroups'
--
-- * 'rditpitUseLatestRestorableTime'
--
-- * 'rditpitPubliclyAccessible'
--
-- * 'rditpitAutoMinorVersionUpgrade'
--
-- * 'rditpitDBSubnetGroupName'
--
-- * 'rditpitRestoreTime'
--
-- * 'rditpitIOPS'
--
-- * 'rditpitDomain'
--
-- * 'rditpitEngine'
--
-- * 'rditpitTDECredentialPassword'
--
-- * 'rditpitDBInstanceClass'
--
-- * 'rditpitLicenseModel'
--
-- * 'rditpitAvailabilityZone'
--
-- * 'rditpitVPCSecurityGroupIds'
--
-- * 'rditpitMultiAZ'
--
-- * 'rditpitOptionGroupName'
--
-- * 'rditpitCopyTagsToSnapshot'
--
-- * 'rditpitTDECredentialARN'
--
-- * 'rditpitTags'
--
-- * 'rditpitPort'
--
-- * 'rditpitStorageType'
--
-- * 'rditpitDBName'
--
-- * 'rditpitSourceDBInstanceIdentifier'
--
-- * 'rditpitTargetDBInstanceIdentifier'
restoreDBInstanceToPointInTime
    :: Text -- ^ 'rditpitSourceDBInstanceIdentifier'
    -> Text -- ^ 'rditpitTargetDBInstanceIdentifier'
    -> RestoreDBInstanceToPointInTime
restoreDBInstanceToPointInTime pSourceDBInstanceIdentifier_ pTargetDBInstanceIdentifier_ =
    RestoreDBInstanceToPointInTime'
    { _rditpitDBSecurityGroups = Nothing
    , _rditpitUseLatestRestorableTime = Nothing
    , _rditpitPubliclyAccessible = Nothing
    , _rditpitAutoMinorVersionUpgrade = Nothing
    , _rditpitDBSubnetGroupName = Nothing
    , _rditpitRestoreTime = Nothing
    , _rditpitIOPS = Nothing
    , _rditpitDomain = Nothing
    , _rditpitEngine = Nothing
    , _rditpitTDECredentialPassword = Nothing
    , _rditpitDBInstanceClass = Nothing
    , _rditpitLicenseModel = Nothing
    , _rditpitAvailabilityZone = Nothing
    , _rditpitVPCSecurityGroupIds = Nothing
    , _rditpitMultiAZ = Nothing
    , _rditpitOptionGroupName = Nothing
    , _rditpitCopyTagsToSnapshot = Nothing
    , _rditpitTDECredentialARN = Nothing
    , _rditpitTags = Nothing
    , _rditpitPort = Nothing
    , _rditpitStorageType = Nothing
    , _rditpitDBName = Nothing
    , _rditpitSourceDBInstanceIdentifier = pSourceDBInstanceIdentifier_
    , _rditpitTargetDBInstanceIdentifier = pTargetDBInstanceIdentifier_
    }

-- | A list of DB security groups to associate with this DB instance.
--
-- Default: The default DB security group for the database engine.
rditpitDBSecurityGroups :: Lens' RestoreDBInstanceToPointInTime [Text]
rditpitDBSecurityGroups = lens _rditpitDBSecurityGroups (\ s a -> s{_rditpitDBSecurityGroups = a}) . _Default . _Coerce;

-- | Specifies whether ('true') or not ('false') the DB instance is restored
-- from the latest backup time.
--
-- Default: 'false'
--
-- Constraints: Cannot be specified if RestoreTime parameter is provided.
rditpitUseLatestRestorableTime :: Lens' RestoreDBInstanceToPointInTime (Maybe Bool)
rditpitUseLatestRestorableTime = lens _rditpitUseLatestRestorableTime (\ s a -> s{_rditpitUseLatestRestorableTime = a});

-- | Specifies the accessibility options for the DB instance. A value of true
-- specifies an Internet-facing instance with a publicly resolvable DNS
-- name, which resolves to a public IP address. A value of false specifies
-- an internal instance with a DNS name that resolves to a private IP
-- address.
--
-- Default: The default behavior varies depending on whether a VPC has been
-- requested or not. The following list shows the default behavior in each
-- case.
--
-- -   __Default VPC:__true
-- -   __VPC:__false
--
-- If no DB subnet group has been specified as part of the request and the
-- PubliclyAccessible value has not been set, the DB instance will be
-- publicly accessible. If a specific DB subnet group has been specified as
-- part of the request and the PubliclyAccessible value has not been set,
-- the DB instance will be private.
rditpitPubliclyAccessible :: Lens' RestoreDBInstanceToPointInTime (Maybe Bool)
rditpitPubliclyAccessible = lens _rditpitPubliclyAccessible (\ s a -> s{_rditpitPubliclyAccessible = a});

-- | Indicates that minor version upgrades will be applied automatically to
-- the DB instance during the maintenance window.
rditpitAutoMinorVersionUpgrade :: Lens' RestoreDBInstanceToPointInTime (Maybe Bool)
rditpitAutoMinorVersionUpgrade = lens _rditpitAutoMinorVersionUpgrade (\ s a -> s{_rditpitAutoMinorVersionUpgrade = a});

-- | The DB subnet group name to use for the new instance.
rditpitDBSubnetGroupName :: Lens' RestoreDBInstanceToPointInTime (Maybe Text)
rditpitDBSubnetGroupName = lens _rditpitDBSubnetGroupName (\ s a -> s{_rditpitDBSubnetGroupName = a});

-- | The date and time to restore from.
--
-- Valid Values: Value must be a time in Universal Coordinated Time (UTC)
-- format
--
-- Constraints:
--
-- -   Must be before the latest restorable time for the DB instance
-- -   Cannot be specified if UseLatestRestorableTime parameter is true
--
-- Example: '2009-09-07T23:45:00Z'
rditpitRestoreTime :: Lens' RestoreDBInstanceToPointInTime (Maybe UTCTime)
rditpitRestoreTime = lens _rditpitRestoreTime (\ s a -> s{_rditpitRestoreTime = a}) . mapping _Time;

-- | The amount of Provisioned IOPS (input\/output operations per second) to
-- be initially allocated for the DB instance.
--
-- Constraints: Must be an integer greater than 1000.
--
-- __SQL Server__
--
-- Setting the IOPS value for the SQL Server database engine is not
-- supported.
rditpitIOPS :: Lens' RestoreDBInstanceToPointInTime (Maybe Int)
rditpitIOPS = lens _rditpitIOPS (\ s a -> s{_rditpitIOPS = a});

-- | Specify the Active Directory Domain to restore the instance in.
rditpitDomain :: Lens' RestoreDBInstanceToPointInTime (Maybe Text)
rditpitDomain = lens _rditpitDomain (\ s a -> s{_rditpitDomain = a});

-- | The database engine to use for the new instance.
--
-- Default: The same as source
--
-- Constraint: Must be compatible with the engine of the source
--
-- Valid Values: 'MySQL' | 'oracle-se1' | 'oracle-se' | 'oracle-ee' |
-- 'sqlserver-ee' | 'sqlserver-se' | 'sqlserver-ex' | 'sqlserver-web' |
-- 'postgres'
rditpitEngine :: Lens' RestoreDBInstanceToPointInTime (Maybe Text)
rditpitEngine = lens _rditpitEngine (\ s a -> s{_rditpitEngine = a});

-- | The password for the given ARN from the Key Store in order to access the
-- device.
rditpitTDECredentialPassword :: Lens' RestoreDBInstanceToPointInTime (Maybe Text)
rditpitTDECredentialPassword = lens _rditpitTDECredentialPassword (\ s a -> s{_rditpitTDECredentialPassword = a});

-- | The compute and memory capacity of the Amazon RDS DB instance.
--
-- Valid Values:
-- 'db.t1.micro | db.m1.small | db.m1.medium | db.m1.large | db.m1.xlarge | db.m2.2xlarge | db.m2.4xlarge | db.m3.medium | db.m3.large | db.m3.xlarge | db.m3.2xlarge | db.r3.large | db.r3.xlarge | db.r3.2xlarge | db.r3.4xlarge | db.r3.8xlarge | db.t2.micro | db.t2.small | db.t2.medium'
--
-- Default: The same DBInstanceClass as the original DB instance.
rditpitDBInstanceClass :: Lens' RestoreDBInstanceToPointInTime (Maybe Text)
rditpitDBInstanceClass = lens _rditpitDBInstanceClass (\ s a -> s{_rditpitDBInstanceClass = a});

-- | License model information for the restored DB instance.
--
-- Default: Same as source.
--
-- Valid values: 'license-included' | 'bring-your-own-license' |
-- 'general-public-license'
rditpitLicenseModel :: Lens' RestoreDBInstanceToPointInTime (Maybe Text)
rditpitLicenseModel = lens _rditpitLicenseModel (\ s a -> s{_rditpitLicenseModel = a});

-- | The EC2 Availability Zone that the database instance will be created in.
--
-- Default: A random, system-chosen Availability Zone.
--
-- Constraint: You cannot specify the AvailabilityZone parameter if the
-- MultiAZ parameter is set to true.
--
-- Example: 'us-east-1a'
rditpitAvailabilityZone :: Lens' RestoreDBInstanceToPointInTime (Maybe Text)
rditpitAvailabilityZone = lens _rditpitAvailabilityZone (\ s a -> s{_rditpitAvailabilityZone = a});

-- | A list of EC2 VPC security groups to associate with this DB instance.
--
-- Default: The default EC2 VPC security group for the DB subnet group\'s
-- VPC.
rditpitVPCSecurityGroupIds :: Lens' RestoreDBInstanceToPointInTime [Text]
rditpitVPCSecurityGroupIds = lens _rditpitVPCSecurityGroupIds (\ s a -> s{_rditpitVPCSecurityGroupIds = a}) . _Default . _Coerce;

-- | Specifies if the DB instance is a Multi-AZ deployment.
--
-- Constraint: You cannot specify the AvailabilityZone parameter if the
-- MultiAZ parameter is set to 'true'.
rditpitMultiAZ :: Lens' RestoreDBInstanceToPointInTime (Maybe Bool)
rditpitMultiAZ = lens _rditpitMultiAZ (\ s a -> s{_rditpitMultiAZ = a});

-- | The name of the option group to be used for the restored DB instance.
--
-- Permanent options, such as the TDE option for Oracle Advanced Security
-- TDE, cannot be removed from an option group, and that option group
-- cannot be removed from a DB instance once it is associated with a DB
-- instance
rditpitOptionGroupName :: Lens' RestoreDBInstanceToPointInTime (Maybe Text)
rditpitOptionGroupName = lens _rditpitOptionGroupName (\ s a -> s{_rditpitOptionGroupName = a});

-- | This property is not currently implemented.
rditpitCopyTagsToSnapshot :: Lens' RestoreDBInstanceToPointInTime (Maybe Bool)
rditpitCopyTagsToSnapshot = lens _rditpitCopyTagsToSnapshot (\ s a -> s{_rditpitCopyTagsToSnapshot = a});

-- | The ARN from the Key Store with which to associate the instance for TDE
-- encryption.
rditpitTDECredentialARN :: Lens' RestoreDBInstanceToPointInTime (Maybe Text)
rditpitTDECredentialARN = lens _rditpitTDECredentialARN (\ s a -> s{_rditpitTDECredentialARN = a});

-- | Undocumented member.
rditpitTags :: Lens' RestoreDBInstanceToPointInTime [Tag]
rditpitTags = lens _rditpitTags (\ s a -> s{_rditpitTags = a}) . _Default . _Coerce;

-- | The port number on which the database accepts connections.
--
-- Constraints: Value must be '1150-65535'
--
-- Default: The same port as the original DB instance.
rditpitPort :: Lens' RestoreDBInstanceToPointInTime (Maybe Int)
rditpitPort = lens _rditpitPort (\ s a -> s{_rditpitPort = a});

-- | Specifies the storage type to be associated with the DB instance.
--
-- Valid values: 'standard | gp2 | io1'
--
-- If you specify 'io1', you must also include a value for the 'Iops'
-- parameter.
--
-- Default: 'io1' if the 'Iops' parameter is specified; otherwise
-- 'standard'
rditpitStorageType :: Lens' RestoreDBInstanceToPointInTime (Maybe Text)
rditpitStorageType = lens _rditpitStorageType (\ s a -> s{_rditpitStorageType = a});

-- | The database name for the restored DB instance.
--
-- This parameter is not used for the MySQL engine.
rditpitDBName :: Lens' RestoreDBInstanceToPointInTime (Maybe Text)
rditpitDBName = lens _rditpitDBName (\ s a -> s{_rditpitDBName = a});

-- | The identifier of the source DB instance from which to restore.
--
-- Constraints:
--
-- -   Must be the identifier of an existing database instance
-- -   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
rditpitSourceDBInstanceIdentifier :: Lens' RestoreDBInstanceToPointInTime Text
rditpitSourceDBInstanceIdentifier = lens _rditpitSourceDBInstanceIdentifier (\ s a -> s{_rditpitSourceDBInstanceIdentifier = a});

-- | The name of the new database instance to be created.
--
-- 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
rditpitTargetDBInstanceIdentifier :: Lens' RestoreDBInstanceToPointInTime Text
rditpitTargetDBInstanceIdentifier = lens _rditpitTargetDBInstanceIdentifier (\ s a -> s{_rditpitTargetDBInstanceIdentifier = a});

instance AWSRequest RestoreDBInstanceToPointInTime
         where
        type Rs RestoreDBInstanceToPointInTime =
             RestoreDBInstanceToPointInTimeResponse
        request = postQuery rDS
        response
          = receiveXMLWrapper
              "RestoreDBInstanceToPointInTimeResult"
              (\ s h x ->
                 RestoreDBInstanceToPointInTimeResponse' <$>
                   (x .@? "DBInstance") <*> (pure (fromEnum s)))

instance ToHeaders RestoreDBInstanceToPointInTime
         where
        toHeaders = const mempty

instance ToPath RestoreDBInstanceToPointInTime where
        toPath = const "/"

instance ToQuery RestoreDBInstanceToPointInTime where
        toQuery RestoreDBInstanceToPointInTime'{..}
          = mconcat
              ["Action" =:
                 ("RestoreDBInstanceToPointInTime" :: ByteString),
               "Version" =: ("2014-10-31" :: ByteString),
               "DBSecurityGroups" =:
                 toQuery
                   (toQueryList "DBSecurityGroupName" <$>
                      _rditpitDBSecurityGroups),
               "UseLatestRestorableTime" =:
                 _rditpitUseLatestRestorableTime,
               "PubliclyAccessible" =: _rditpitPubliclyAccessible,
               "AutoMinorVersionUpgrade" =:
                 _rditpitAutoMinorVersionUpgrade,
               "DBSubnetGroupName" =: _rditpitDBSubnetGroupName,
               "RestoreTime" =: _rditpitRestoreTime,
               "Iops" =: _rditpitIOPS, "Domain" =: _rditpitDomain,
               "Engine" =: _rditpitEngine,
               "TdeCredentialPassword" =:
                 _rditpitTDECredentialPassword,
               "DBInstanceClass" =: _rditpitDBInstanceClass,
               "LicenseModel" =: _rditpitLicenseModel,
               "AvailabilityZone" =: _rditpitAvailabilityZone,
               "VpcSecurityGroupIds" =:
                 toQuery
                   (toQueryList "VpcSecurityGroupId" <$>
                      _rditpitVPCSecurityGroupIds),
               "MultiAZ" =: _rditpitMultiAZ,
               "OptionGroupName" =: _rditpitOptionGroupName,
               "CopyTagsToSnapshot" =: _rditpitCopyTagsToSnapshot,
               "TdeCredentialArn" =: _rditpitTDECredentialARN,
               "Tags" =:
                 toQuery (toQueryList "Tag" <$> _rditpitTags),
               "Port" =: _rditpitPort,
               "StorageType" =: _rditpitStorageType,
               "DBName" =: _rditpitDBName,
               "SourceDBInstanceIdentifier" =:
                 _rditpitSourceDBInstanceIdentifier,
               "TargetDBInstanceIdentifier" =:
                 _rditpitTargetDBInstanceIdentifier]

-- | /See:/ 'restoreDBInstanceToPointInTimeResponse' smart constructor.
data RestoreDBInstanceToPointInTimeResponse = RestoreDBInstanceToPointInTimeResponse'
    { _rditpitrsDBInstance     :: !(Maybe DBInstance)
    , _rditpitrsResponseStatus :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'RestoreDBInstanceToPointInTimeResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'rditpitrsDBInstance'
--
-- * 'rditpitrsResponseStatus'
restoreDBInstanceToPointInTimeResponse
    :: Int -- ^ 'rditpitrsResponseStatus'
    -> RestoreDBInstanceToPointInTimeResponse
restoreDBInstanceToPointInTimeResponse pResponseStatus_ =
    RestoreDBInstanceToPointInTimeResponse'
    { _rditpitrsDBInstance = Nothing
    , _rditpitrsResponseStatus = pResponseStatus_
    }

-- | Undocumented member.
rditpitrsDBInstance :: Lens' RestoreDBInstanceToPointInTimeResponse (Maybe DBInstance)
rditpitrsDBInstance = lens _rditpitrsDBInstance (\ s a -> s{_rditpitrsDBInstance = a});

-- | The response status code.
rditpitrsResponseStatus :: Lens' RestoreDBInstanceToPointInTimeResponse Int
rditpitrsResponseStatus = lens _rditpitrsResponseStatus (\ s a -> s{_rditpitrsResponseStatus = a});
