{-# LANGUAGE DataKinds                   #-}
{-# LANGUAGE DeriveGeneric               #-}
{-# LANGUAGE FlexibleInstances           #-}
{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
{-# LANGUAGE LambdaCase                  #-}
{-# LANGUAGE NoImplicitPrelude           #-}
{-# LANGUAGE OverloadedStrings           #-}
{-# LANGUAGE RecordWildCards             #-}
{-# LANGUAGE TypeFamilies                #-}

{-# OPTIONS_GHC -fno-warn-unused-imports #-}

-- Module      : Network.AWS.RDS.CreateDBInstance
-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
-- License     : This Source Code Form is subject to the terms of
--               the Mozilla Public License, v. 2.0.
--               A copy of the MPL can be found in the LICENSE file or
--               you can obtain it at http://mozilla.org/MPL/2.0/.
-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--
-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- | Creates a new DB instance.
--
-- <http://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html>
module Network.AWS.RDS.CreateDBInstance
    (
    -- * Request
      CreateDBInstance
    -- ** Request constructor
    , createDBInstance
    -- ** Request lenses
    , cdbiAllocatedStorage
    , cdbiAutoMinorVersionUpgrade
    , cdbiAvailabilityZone
    , cdbiBackupRetentionPeriod
    , cdbiCharacterSetName
    , cdbiDBInstanceClass
    , cdbiDBInstanceIdentifier
    , cdbiDBName
    , cdbiDBParameterGroupName
    , cdbiDBSecurityGroups
    , cdbiDBSubnetGroupName
    , cdbiEngine
    , cdbiEngineVersion
    , cdbiIops
    , cdbiKmsKeyId
    , cdbiLicenseModel
    , cdbiMasterUserPassword
    , cdbiMasterUsername
    , cdbiMultiAZ
    , cdbiOptionGroupName
    , cdbiPort
    , cdbiPreferredBackupWindow
    , cdbiPreferredMaintenanceWindow
    , cdbiPubliclyAccessible
    , cdbiStorageEncrypted
    , cdbiStorageType
    , cdbiTags
    , cdbiTdeCredentialArn
    , cdbiTdeCredentialPassword
    , cdbiVpcSecurityGroupIds

    -- * Response
    , CreateDBInstanceResponse
    -- ** Response constructor
    , createDBInstanceResponse
    -- ** Response lenses
    , cdbirDBInstance
    ) where

import Network.AWS.Prelude
import Network.AWS.Request.Query
import Network.AWS.RDS.Types
import qualified GHC.Exts

data CreateDBInstance = CreateDBInstance
    { _cdbiAllocatedStorage           :: Int
    , _cdbiAutoMinorVersionUpgrade    :: Maybe Bool
    , _cdbiAvailabilityZone           :: Maybe Text
    , _cdbiBackupRetentionPeriod      :: Maybe Int
    , _cdbiCharacterSetName           :: Maybe Text
    , _cdbiDBInstanceClass            :: Text
    , _cdbiDBInstanceIdentifier       :: Text
    , _cdbiDBName                     :: Maybe Text
    , _cdbiDBParameterGroupName       :: Maybe Text
    , _cdbiDBSecurityGroups           :: List "member" Text
    , _cdbiDBSubnetGroupName          :: Maybe Text
    , _cdbiEngine                     :: Text
    , _cdbiEngineVersion              :: Maybe Text
    , _cdbiIops                       :: Maybe Int
    , _cdbiKmsKeyId                   :: Maybe Text
    , _cdbiLicenseModel               :: Maybe Text
    , _cdbiMasterUserPassword         :: Text
    , _cdbiMasterUsername             :: Text
    , _cdbiMultiAZ                    :: Maybe Bool
    , _cdbiOptionGroupName            :: Maybe Text
    , _cdbiPort                       :: Maybe Int
    , _cdbiPreferredBackupWindow      :: Maybe Text
    , _cdbiPreferredMaintenanceWindow :: Maybe Text
    , _cdbiPubliclyAccessible         :: Maybe Bool
    , _cdbiStorageEncrypted           :: Maybe Bool
    , _cdbiStorageType                :: Maybe Text
    , _cdbiTags                       :: List "member" Tag
    , _cdbiTdeCredentialArn           :: Maybe Text
    , _cdbiTdeCredentialPassword      :: Maybe Text
    , _cdbiVpcSecurityGroupIds        :: List "member" Text
    } deriving (Eq, Read, Show)

-- | 'CreateDBInstance' constructor.
--
-- The fields accessible through corresponding lenses are:
--
-- * 'cdbiAllocatedStorage' @::@ 'Int'
--
-- * 'cdbiAutoMinorVersionUpgrade' @::@ 'Maybe' 'Bool'
--
-- * 'cdbiAvailabilityZone' @::@ 'Maybe' 'Text'
--
-- * 'cdbiBackupRetentionPeriod' @::@ 'Maybe' 'Int'
--
-- * 'cdbiCharacterSetName' @::@ 'Maybe' 'Text'
--
-- * 'cdbiDBInstanceClass' @::@ 'Text'
--
-- * 'cdbiDBInstanceIdentifier' @::@ 'Text'
--
-- * 'cdbiDBName' @::@ 'Maybe' 'Text'
--
-- * 'cdbiDBParameterGroupName' @::@ 'Maybe' 'Text'
--
-- * 'cdbiDBSecurityGroups' @::@ ['Text']
--
-- * 'cdbiDBSubnetGroupName' @::@ 'Maybe' 'Text'
--
-- * 'cdbiEngine' @::@ 'Text'
--
-- * 'cdbiEngineVersion' @::@ 'Maybe' 'Text'
--
-- * 'cdbiIops' @::@ 'Maybe' 'Int'
--
-- * 'cdbiKmsKeyId' @::@ 'Maybe' 'Text'
--
-- * 'cdbiLicenseModel' @::@ 'Maybe' 'Text'
--
-- * 'cdbiMasterUserPassword' @::@ 'Text'
--
-- * 'cdbiMasterUsername' @::@ 'Text'
--
-- * 'cdbiMultiAZ' @::@ 'Maybe' 'Bool'
--
-- * 'cdbiOptionGroupName' @::@ 'Maybe' 'Text'
--
-- * 'cdbiPort' @::@ 'Maybe' 'Int'
--
-- * 'cdbiPreferredBackupWindow' @::@ 'Maybe' 'Text'
--
-- * 'cdbiPreferredMaintenanceWindow' @::@ 'Maybe' 'Text'
--
-- * 'cdbiPubliclyAccessible' @::@ 'Maybe' 'Bool'
--
-- * 'cdbiStorageEncrypted' @::@ 'Maybe' 'Bool'
--
-- * 'cdbiStorageType' @::@ 'Maybe' 'Text'
--
-- * 'cdbiTags' @::@ ['Tag']
--
-- * 'cdbiTdeCredentialArn' @::@ 'Maybe' 'Text'
--
-- * 'cdbiTdeCredentialPassword' @::@ 'Maybe' 'Text'
--
-- * 'cdbiVpcSecurityGroupIds' @::@ ['Text']
--
createDBInstance :: Text -- ^ 'cdbiDBInstanceIdentifier'
                 -> Int -- ^ 'cdbiAllocatedStorage'
                 -> Text -- ^ 'cdbiDBInstanceClass'
                 -> Text -- ^ 'cdbiEngine'
                 -> Text -- ^ 'cdbiMasterUsername'
                 -> Text -- ^ 'cdbiMasterUserPassword'
                 -> CreateDBInstance
createDBInstance p1 p2 p3 p4 p5 p6 = CreateDBInstance
    { _cdbiDBInstanceIdentifier       = p1
    , _cdbiAllocatedStorage           = p2
    , _cdbiDBInstanceClass            = p3
    , _cdbiEngine                     = p4
    , _cdbiMasterUsername             = p5
    , _cdbiMasterUserPassword         = p6
    , _cdbiDBName                     = Nothing
    , _cdbiDBSecurityGroups           = mempty
    , _cdbiVpcSecurityGroupIds        = mempty
    , _cdbiAvailabilityZone           = Nothing
    , _cdbiDBSubnetGroupName          = Nothing
    , _cdbiPreferredMaintenanceWindow = Nothing
    , _cdbiDBParameterGroupName       = Nothing
    , _cdbiBackupRetentionPeriod      = Nothing
    , _cdbiPreferredBackupWindow      = Nothing
    , _cdbiPort                       = Nothing
    , _cdbiMultiAZ                    = Nothing
    , _cdbiEngineVersion              = Nothing
    , _cdbiAutoMinorVersionUpgrade    = Nothing
    , _cdbiLicenseModel               = Nothing
    , _cdbiIops                       = Nothing
    , _cdbiOptionGroupName            = Nothing
    , _cdbiCharacterSetName           = Nothing
    , _cdbiPubliclyAccessible         = Nothing
    , _cdbiTags                       = mempty
    , _cdbiStorageType                = Nothing
    , _cdbiTdeCredentialArn           = Nothing
    , _cdbiTdeCredentialPassword      = Nothing
    , _cdbiStorageEncrypted           = Nothing
    , _cdbiKmsKeyId                   = Nothing
    }

-- | The amount of storage (in gigabytes) to be initially allocated for the
-- database instance.
--
-- Type: Integer
--
-- MySQL
--
-- Constraints: Must be an integer from 5 to 3072.
--
-- PostgreSQL
--
-- Constraints: Must be an integer from 5 to 3072.
--
-- Oracle
--
-- Constraints: Must be an integer from 10 to 3072.
--
-- SQL Server
--
-- Constraints: Must be an integer from 200 to 1024 (Standard Edition and
-- Enterprise Edition) or from 20 to 1024 (Express Edition and Web Edition)
cdbiAllocatedStorage :: Lens' CreateDBInstance Int
cdbiAllocatedStorage =
    lens _cdbiAllocatedStorage (\s a -> s { _cdbiAllocatedStorage = a })

-- | Indicates that minor engine upgrades will be applied automatically to the DB
-- instance during the maintenance window.
--
-- Default: 'true'
cdbiAutoMinorVersionUpgrade :: Lens' CreateDBInstance (Maybe Bool)
cdbiAutoMinorVersionUpgrade =
    lens _cdbiAutoMinorVersionUpgrade
        (\s a -> s { _cdbiAutoMinorVersionUpgrade = a })

-- | The EC2 Availability Zone that the database instance will be created in. For
-- information on regions and Availability Zones, see <http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RegionsAndAvailabilityZones.html Regions and AvailabilityZones>.
--
-- Default: A random, system-chosen Availability Zone in the endpoint's
-- region.
--
-- Example: 'us-east-1d'
--
-- Constraint: The AvailabilityZone parameter cannot be specified if the
-- MultiAZ parameter is set to 'true'. The specified Availability Zone must be in
-- the same region as the current endpoint.
cdbiAvailabilityZone :: Lens' CreateDBInstance (Maybe Text)
cdbiAvailabilityZone =
    lens _cdbiAvailabilityZone (\s a -> s { _cdbiAvailabilityZone = a })

-- | The number of days for which automated backups are retained. Setting this
-- parameter to a positive number enables backups. Setting this parameter to 0
-- disables automated backups.
--
-- Default: 1
--
-- Constraints:
--
-- Must be a value from 0 to 35 Cannot be set to 0 if the DB instance is a
-- source to Read Replicas
cdbiBackupRetentionPeriod :: Lens' CreateDBInstance (Maybe Int)
cdbiBackupRetentionPeriod =
    lens _cdbiBackupRetentionPeriod
        (\s a -> s { _cdbiBackupRetentionPeriod = a })

-- | For supported engines, indicates that the DB instance should be associated
-- with the specified CharacterSet.
cdbiCharacterSetName :: Lens' CreateDBInstance (Maybe Text)
cdbiCharacterSetName =
    lens _cdbiCharacterSetName (\s a -> s { _cdbiCharacterSetName = a })

-- | The compute and memory capacity of the DB instance.
--
-- Valid Values: 'db.t1.micro | db.m1.small | db.m1.medium | db.m1.large |db.m1.xlarge | db.m2.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'
cdbiDBInstanceClass :: Lens' CreateDBInstance Text
cdbiDBInstanceClass =
    lens _cdbiDBInstanceClass (\s a -> s { _cdbiDBInstanceClass = a })

-- | The DB instance identifier. This parameter is stored as a lowercase string.
--
-- Constraints:
--
-- Must contain from 1 to 63 alphanumeric characters or hyphens (1 to 15 for
-- SQL Server). First character must be a letter. Cannot end with a hyphen or
-- contain two consecutive hyphens.  Example: 'mydbinstance'
cdbiDBInstanceIdentifier :: Lens' CreateDBInstance Text
cdbiDBInstanceIdentifier =
    lens _cdbiDBInstanceIdentifier
        (\s a -> s { _cdbiDBInstanceIdentifier = a })

-- | The meaning of this parameter differs according to the database engine you
-- use.
--
-- Type: String
--
-- MySQL
--
-- The name of the database to create when the DB instance is created. If this
-- parameter is not specified, no database is created in the DB instance.
--
-- Constraints:
--
-- Must contain 1 to 64 alphanumeric characters Cannot be a word reserved by
-- the specified database engine   PostgreSQL
--
-- The name of the database to create when the DB instance is created. If this
-- parameter is not specified, no database is created in the DB instance.
--
-- Constraints:
--
-- Must contain 1 to 63 alphanumeric characters Must begin with a letter or an
-- underscore. Subsequent characters can be letters, underscores, or digits
-- (0-9). Cannot be a word reserved by the specified database engine   Oracle
--
-- The Oracle System ID (SID) of the created DB instance.
--
-- Default: 'ORCL'
--
-- Constraints:
--
-- Cannot be longer than 8 characters   SQL Server
--
-- Not applicable. Must be null.
cdbiDBName :: Lens' CreateDBInstance (Maybe Text)
cdbiDBName = lens _cdbiDBName (\s a -> s { _cdbiDBName = a })

-- | The name of the DB parameter group to associate with this DB instance. If
-- this argument is omitted, the default DBParameterGroup for the specified
-- engine will be used.
--
-- Constraints:
--
-- Must be 1 to 255 alphanumeric characters First character must be a letter Cannot end with a hyphen or contain two consecutive hyphens
--
cdbiDBParameterGroupName :: Lens' CreateDBInstance (Maybe Text)
cdbiDBParameterGroupName =
    lens _cdbiDBParameterGroupName
        (\s a -> s { _cdbiDBParameterGroupName = a })

-- | A list of DB security groups to associate with this DB instance.
--
-- Default: The default DB security group for the database engine.
cdbiDBSecurityGroups :: Lens' CreateDBInstance [Text]
cdbiDBSecurityGroups =
    lens _cdbiDBSecurityGroups (\s a -> s { _cdbiDBSecurityGroups = a })
        . _List

-- | A DB subnet group to associate with this DB instance.
--
-- If there is no DB subnet group, then it is a non-VPC DB instance.
cdbiDBSubnetGroupName :: Lens' CreateDBInstance (Maybe Text)
cdbiDBSubnetGroupName =
    lens _cdbiDBSubnetGroupName (\s a -> s { _cdbiDBSubnetGroupName = a })

-- | The name of the database engine to be used for this instance.
--
-- Valid Values: 'MySQL' | 'oracle-se1' | 'oracle-se' | 'oracle-ee' | 'sqlserver-ee' | 'sqlserver-se' | 'sqlserver-ex' | 'sqlserver-web' | 'postgres'
--
-- Not every database engine is available for every AWS region.
cdbiEngine :: Lens' CreateDBInstance Text
cdbiEngine = lens _cdbiEngine (\s a -> s { _cdbiEngine = a })

-- | The version number of the database engine to use.
--
-- The following are the database engines and major and minor versions that
-- are available with Amazon RDS. Not every database engine is available for
-- every AWS region.
--
-- MySQL
--
-- Version 5.1 (Only available in the following regions: ap-northeast-1,
-- ap-southeast-1, ap-southeast-2, eu-west-1, sa-east-1, us-west-1, us-west-2): '5.1.73a | 5.1.73b'   Version 5.5 (Only available in the following regions:
-- ap-northeast-1, ap-southeast-1, ap-southeast-2, eu-west-1, sa-east-1,
-- us-west-1, us-west-2): ' 5.5.40 | 5.5.40a'   Version 5.5 (Available in all
-- regions): ' 5.5.40b | 5.5.41'   Version 5.6 (Available in all regions): '5.6.19a | 5.6.19b | 5.6.21 | 5.6.21b | 5.6.22'    MySQL
--
-- Version 5.1 (Only available in the following regions: ap-northeast-1,
-- ap-southeast-1, ap-southeast-2, eu-west-1, sa-east-1, us-west-1, us-west-2): '5.1.73a | 5.1.73b'   Version 5.5 (Only available in the following regions:
-- ap-northeast-1, ap-southeast-1, ap-southeast-2, eu-west-1, sa-east-1,
-- us-west-1, us-west-2): ' 5.5.40 | 5.5.40a'   Version 5.5 (Available in all
-- regions): ' 5.5.40b | 5.5.41'   Version 5.6 (Available in all regions): '5.6.19a | 5.6.19b | 5.6.21 | 5.6.21b | 5.6.22'    MySQL
--
-- Version 5.1 (Only available in the following regions: ap-northeast-1,
-- ap-southeast-1, ap-southeast-2, eu-west-1, sa-east-1, us-west-1, us-west-2): '5.1.73a | 5.1.73b'   Version 5.5 (Only available in the following regions:
-- ap-northeast-1, ap-southeast-1, ap-southeast-2, eu-west-1, sa-east-1,
-- us-west-1, us-west-2): ' 5.5.40 | 5.5.40a'   Version 5.5 (Available in all
-- regions): ' 5.5.40b | 5.5.41'   Version 5.6 (Available in all regions): '5.6.19a | 5.6.19b | 5.6.21 | 5.6.21b | 5.6.22'    MySQL
--
-- Version 5.1 (Only available in the following regions: ap-northeast-1,
-- ap-southeast-1, ap-southeast-2, eu-west-1, sa-east-1, us-west-1, us-west-2): '5.1.73a | 5.1.73b'   Version 5.5 (Only available in the following regions:
-- ap-northeast-1, ap-southeast-1, ap-southeast-2, eu-west-1, sa-east-1,
-- us-west-1, us-west-2): ' 5.5.40 | 5.5.40a'   Version 5.5 (Available in all
-- regions): ' 5.5.40b | 5.5.41'   Version 5.6 (Available in all regions): '5.6.19a | 5.6.19b | 5.6.21 | 5.6.21b | 5.6.22'    Oracle Database Enterprise
-- Edition (oracle-ee)
--
-- Version 11.2 (Only available in the following regions: ap-northeast-1,
-- ap-southeast-1, ap-southeast-2, eu-west-1, sa-east-1, us-west-1, us-west-2): '11.2.0.2.v3 | 11.2.0.2.v4 | 11.2.0.2.v5 | 11.2.0.2.v6 | 11.2.0.2.v7'   Version
-- 11.2 (Available in all regions): ' 11.2.0.3.v1 | 11.2.0.3.v2 | 11.2.0.4.v1 |11.2.0.4.v3'    Oracle Database Enterprise Edition (oracle-ee)
--
-- Version 11.2 (Only available in the following regions: ap-northeast-1,
-- ap-southeast-1, ap-southeast-2, eu-west-1, sa-east-1, us-west-1, us-west-2): '11.2.0.2.v3 | 11.2.0.2.v4 | 11.2.0.2.v5 | 11.2.0.2.v6 | 11.2.0.2.v7'   Version
-- 11.2 (Available in all regions): ' 11.2.0.3.v1 | 11.2.0.3.v2 | 11.2.0.4.v1 |11.2.0.4.v3'    Oracle Database Standard Edition (oracle-se)
--
-- Version 11.2 (Only available in the following regions: us-west-1): '11.2.0.2.v3 | 11.2.0.2.v4 | 11.2.0.2.v5 | 11.2.0.2.v6 | 11.2.0.2.v7'   Version
-- 11.2 (Only available in the following regions: eu-central-1, us-west-1): '11.2.0.3.v1 | 11.2.0.3.v2 | 11.2.0.4.v1 | 11.2.0.4.v3'    Oracle Database
-- Standard Edition (oracle-se)
--
-- Version 11.2 (Only available in the following regions: us-west-1): '11.2.0.2.v3 | 11.2.0.2.v4 | 11.2.0.2.v5 | 11.2.0.2.v6 | 11.2.0.2.v7'   Version
-- 11.2 (Only available in the following regions: eu-central-1, us-west-1): '11.2.0.3.v1 | 11.2.0.3.v2 | 11.2.0.4.v1 | 11.2.0.4.v3'    Oracle Database
-- Standard Edition One (oracle-se1)
--
-- Version 11.2 (Only available in the following regions: us-west-1): '11.2.0.2.v3 | 11.2.0.2.v4 | 11.2.0.2.v5 | 11.2.0.2.v6 | 11.2.0.2.v7'   Version
-- 11.2 (Only available in the following regions: eu-central-1, us-west-1): '11.2.0.3.v1 | 11.2.0.3.v2 | 11.2.0.4.v1 | 11.2.0.4.v3'    Oracle Database
-- Standard Edition One (oracle-se1)
--
-- Version 11.2 (Only available in the following regions: us-west-1): '11.2.0.2.v3 | 11.2.0.2.v4 | 11.2.0.2.v5 | 11.2.0.2.v6 | 11.2.0.2.v7'   Version
-- 11.2 (Only available in the following regions: eu-central-1, us-west-1): '11.2.0.3.v1 | 11.2.0.3.v2 | 11.2.0.4.v1 | 11.2.0.4.v3'    PostgreSQL
--
-- Version 9.3 (Only available in the following regions: ap-northeast-1,
-- ap-southeast-1, ap-southeast-2, eu-west-1, sa-east-1, us-west-1, us-west-2): '9.3.1 | 9.3.2'   Version 9.3 (Available in all regions): ' 9.3.3 | 9.3.5'    PostgreSQL
--
--
-- Version 9.3 (Only available in the following regions: ap-northeast-1,
-- ap-southeast-1, ap-southeast-2, eu-west-1, sa-east-1, us-west-1, us-west-2): '9.3.1 | 9.3.2'   Version 9.3 (Available in all regions): ' 9.3.3 | 9.3.5'    Microsoft SQL Server Enterprise Edition (sqlserver-ee)
--
--
-- Version 10.50 (Only available in the following regions: eu-central-1,
-- us-west-1): ' 10.50.2789.0.v1'   Version 11.00 (Only available in the following
-- regions: eu-central-1, us-west-1): ' 11.00.2100.60.v1'    Microsoft SQL Server
-- Enterprise Edition (sqlserver-ee)
--
-- Version 10.50 (Only available in the following regions: eu-central-1,
-- us-west-1): ' 10.50.2789.0.v1'   Version 11.00 (Only available in the following
-- regions: eu-central-1, us-west-1): ' 11.00.2100.60.v1'    Microsoft SQL Server
-- Express Edition (sqlserver-ex)
--
-- Version 10.50 (Available in all regions): ' 10.50.2789.0.v1'   Version 11.00
-- (Available in all regions): ' 11.00.2100.60.v1'    Microsoft SQL Server Express
-- Edition (sqlserver-ex)
--
-- Version 10.50 (Available in all regions): ' 10.50.2789.0.v1'   Version 11.00
-- (Available in all regions): ' 11.00.2100.60.v1'    Microsoft SQL Server
-- Standard Edition (sqlserver-se)
--
-- Version 10.50 (Available in all regions): ' 10.50.2789.0.v1'   Version 11.00
-- (Available in all regions): ' 11.00.2100.60.v1'    Microsoft SQL Server
-- Standard Edition (sqlserver-se)
--
-- Version 10.50 (Available in all regions): ' 10.50.2789.0.v1'   Version 11.00
-- (Available in all regions): ' 11.00.2100.60.v1'    Microsoft SQL Server Web
-- Edition (sqlserver-web)
--
-- Version 10.50 (Available in all regions): ' 10.50.2789.0.v1'   Version 11.00
-- (Available in all regions): ' 11.00.2100.60.v1'    Microsoft SQL Server Web
-- Edition (sqlserver-web)
--
-- Version 10.50 (Available in all regions): ' 10.50.2789.0.v1'   Version 11.00
-- (Available in all regions): ' 11.00.2100.60.v1'
cdbiEngineVersion :: Lens' CreateDBInstance (Maybe Text)
cdbiEngineVersion =
    lens _cdbiEngineVersion (\s a -> s { _cdbiEngineVersion = a })

-- | The amount of Provisioned IOPS (input/output operations per second) to be
-- initially allocated for the DB instance.
--
-- Constraints: To use PIOPS, this value must be an integer greater than 1000.
cdbiIops :: Lens' CreateDBInstance (Maybe Int)
cdbiIops = lens _cdbiIops (\s a -> s { _cdbiIops = a })

-- | The KMS key identifier for an encrypted DB instance.
--
-- The KMS key identifier is the Amazon Resoure Name (ARN) for the KMS
-- encryption key. If you are creating a DB instance with the same AWS account
-- that owns the KMS encryption key used to encrypt the new DB instance, then
-- you can use the KMS key alias instead of the ARN for the KM encryption key.
--
-- If the 'StorageEncrypted' parameter is true, and you do not specify a value
-- for the 'KmsKeyId' parameter, then Amazon RDS 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.
cdbiKmsKeyId :: Lens' CreateDBInstance (Maybe Text)
cdbiKmsKeyId = lens _cdbiKmsKeyId (\s a -> s { _cdbiKmsKeyId = a })

-- | License model information for this DB instance.
--
-- Valid values: 'license-included' | 'bring-your-own-license' | 'general-public-license'
cdbiLicenseModel :: Lens' CreateDBInstance (Maybe Text)
cdbiLicenseModel = lens _cdbiLicenseModel (\s a -> s { _cdbiLicenseModel = a })

-- | The password for the master database user. Can be any printable ASCII
-- character except "/", """, or "@".
--
-- Type: String
--
-- MySQL
--
-- Constraints: Must contain from 8 to 41 characters.
--
-- Oracle
--
-- Constraints: Must contain from 8 to 30 characters.
--
-- SQL Server
--
-- Constraints: Must contain from 8 to 128 characters.
--
-- PostgreSQL
--
-- Constraints: Must contain from 8 to 128 characters.
cdbiMasterUserPassword :: Lens' CreateDBInstance Text
cdbiMasterUserPassword =
    lens _cdbiMasterUserPassword (\s a -> s { _cdbiMasterUserPassword = a })

-- | The name of master user for the client DB instance.
--
-- MySQL
--
-- Constraints:
--
-- Must be 1 to 16 alphanumeric characters. First character must be a letter. Cannot be a reserved word for the chosen database engine.
-- Type: String
--
-- Oracle
--
-- Constraints:
--
-- Must be 1 to 30 alphanumeric characters. First character must be a letter. Cannot be a reserved word for the chosen database engine.
-- SQL Server
--
-- Constraints:
--
-- Must be 1 to 128 alphanumeric characters. First character must be a letter.
-- Cannot be a reserved word for the chosen database engine.   PostgreSQL
--
-- Constraints:
--
-- Must be 1 to 63 alphanumeric characters. First character must be a letter. Cannot be a reserved word for the chosen database engine.
--
cdbiMasterUsername :: Lens' CreateDBInstance Text
cdbiMasterUsername =
    lens _cdbiMasterUsername (\s a -> s { _cdbiMasterUsername = a })

-- | Specifies if the DB instance is a Multi-AZ deployment. You cannot set the
-- AvailabilityZone parameter if the MultiAZ parameter is set to true.
cdbiMultiAZ :: Lens' CreateDBInstance (Maybe Bool)
cdbiMultiAZ = lens _cdbiMultiAZ (\s a -> s { _cdbiMultiAZ = a })

-- | Indicates that the DB instance should be associated with the specified
-- option group.
--
-- 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
cdbiOptionGroupName :: Lens' CreateDBInstance (Maybe Text)
cdbiOptionGroupName =
    lens _cdbiOptionGroupName (\s a -> s { _cdbiOptionGroupName = a })

-- | The port number on which the database accepts connections.
--
-- MySQL
--
-- Default: '3306'
--
-- Valid Values: '1150-65535'
--
-- Type: Integer
--
-- PostgreSQL
--
-- Default: '5432'
--
-- Valid Values: '1150-65535'
--
-- Type: Integer
--
-- Oracle
--
-- Default: '1521'
--
-- Valid Values: '1150-65535'
--
-- SQL Server
--
-- Default: '1433'
--
-- Valid Values: '1150-65535' except for '1434', '3389', '47001', '49152', and '49152'
-- through '49156'.
cdbiPort :: Lens' CreateDBInstance (Maybe Int)
cdbiPort = lens _cdbiPort (\s a -> s { _cdbiPort = a })

-- | The daily time range during which automated backups are created if automated
-- backups are enabled, using the 'BackupRetentionPeriod' parameter. For more
-- information, see <http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.BackingUpAndRestoringAmazonRDSInstances.html DB Instance Backups>.
--
-- Default: A 30-minute window selected at random from an 8-hour block of time
-- per region. See the Amazon RDS User Guide for the time blocks for each region
-- from which the default backup windows are assigned.
--
-- Constraints: Must be in the format 'hh24:mi-hh24:mi'. Times should be
-- Universal Time Coordinated (UTC). Must not conflict with the preferred
-- maintenance window. Must be at least 30 minutes.
cdbiPreferredBackupWindow :: Lens' CreateDBInstance (Maybe Text)
cdbiPreferredBackupWindow =
    lens _cdbiPreferredBackupWindow
        (\s a -> s { _cdbiPreferredBackupWindow = a })

-- | The weekly time range (in UTC) during which system maintenance can occur.
-- For more information, see <http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.DBMaintenance.html DB Instance Maintenance>.
--
-- 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. To see the time blocks
-- available, see <http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/AdjustingTheMaintenanceWindow.html  Adjusting the Preferred Maintenance Window> in the Amazon RDS
-- User Guide.
--
-- Valid Days: Mon, Tue, Wed, Thu, Fri, Sat, Sun
--
-- Constraints: Minimum 30-minute window.
cdbiPreferredMaintenanceWindow :: Lens' CreateDBInstance (Maybe Text)
cdbiPreferredMaintenanceWindow =
    lens _cdbiPreferredMaintenanceWindow
        (\s a -> s { _cdbiPreferredMaintenanceWindow = 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.
cdbiPubliclyAccessible :: Lens' CreateDBInstance (Maybe Bool)
cdbiPubliclyAccessible =
    lens _cdbiPubliclyAccessible (\s a -> s { _cdbiPubliclyAccessible = a })

-- | Specifies whether the DB instance is encrypted.
--
-- Default: false
cdbiStorageEncrypted :: Lens' CreateDBInstance (Maybe Bool)
cdbiStorageEncrypted =
    lens _cdbiStorageEncrypted (\s a -> s { _cdbiStorageEncrypted = 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'
cdbiStorageType :: Lens' CreateDBInstance (Maybe Text)
cdbiStorageType = lens _cdbiStorageType (\s a -> s { _cdbiStorageType = a })

cdbiTags :: Lens' CreateDBInstance [Tag]
cdbiTags = lens _cdbiTags (\s a -> s { _cdbiTags = a }) . _List

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

-- | The password for the given ARN from the Key Store in order to access the
-- device.
cdbiTdeCredentialPassword :: Lens' CreateDBInstance (Maybe Text)
cdbiTdeCredentialPassword =
    lens _cdbiTdeCredentialPassword
        (\s a -> s { _cdbiTdeCredentialPassword = 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.
cdbiVpcSecurityGroupIds :: Lens' CreateDBInstance [Text]
cdbiVpcSecurityGroupIds =
    lens _cdbiVpcSecurityGroupIds (\s a -> s { _cdbiVpcSecurityGroupIds = a })
        . _List

newtype CreateDBInstanceResponse = CreateDBInstanceResponse
    { _cdbirDBInstance :: Maybe DBInstance
    } deriving (Eq, Read, Show)

-- | 'CreateDBInstanceResponse' constructor.
--
-- The fields accessible through corresponding lenses are:
--
-- * 'cdbirDBInstance' @::@ 'Maybe' 'DBInstance'
--
createDBInstanceResponse :: CreateDBInstanceResponse
createDBInstanceResponse = CreateDBInstanceResponse
    { _cdbirDBInstance = Nothing
    }

cdbirDBInstance :: Lens' CreateDBInstanceResponse (Maybe DBInstance)
cdbirDBInstance = lens _cdbirDBInstance (\s a -> s { _cdbirDBInstance = a })

instance ToPath CreateDBInstance where
    toPath = const "/"

instance ToQuery CreateDBInstance where
    toQuery CreateDBInstance{..} = mconcat
        [ "AllocatedStorage"           =? _cdbiAllocatedStorage
        , "AutoMinorVersionUpgrade"    =? _cdbiAutoMinorVersionUpgrade
        , "AvailabilityZone"           =? _cdbiAvailabilityZone
        , "BackupRetentionPeriod"      =? _cdbiBackupRetentionPeriod
        , "CharacterSetName"           =? _cdbiCharacterSetName
        , "DBInstanceClass"            =? _cdbiDBInstanceClass
        , "DBInstanceIdentifier"       =? _cdbiDBInstanceIdentifier
        , "DBName"                     =? _cdbiDBName
        , "DBParameterGroupName"       =? _cdbiDBParameterGroupName
        , "DBSecurityGroups"           =? _cdbiDBSecurityGroups
        , "DBSubnetGroupName"          =? _cdbiDBSubnetGroupName
        , "Engine"                     =? _cdbiEngine
        , "EngineVersion"              =? _cdbiEngineVersion
        , "Iops"                       =? _cdbiIops
        , "KmsKeyId"                   =? _cdbiKmsKeyId
        , "LicenseModel"               =? _cdbiLicenseModel
        , "MasterUserPassword"         =? _cdbiMasterUserPassword
        , "MasterUsername"             =? _cdbiMasterUsername
        , "MultiAZ"                    =? _cdbiMultiAZ
        , "OptionGroupName"            =? _cdbiOptionGroupName
        , "Port"                       =? _cdbiPort
        , "PreferredBackupWindow"      =? _cdbiPreferredBackupWindow
        , "PreferredMaintenanceWindow" =? _cdbiPreferredMaintenanceWindow
        , "PubliclyAccessible"         =? _cdbiPubliclyAccessible
        , "StorageEncrypted"           =? _cdbiStorageEncrypted
        , "StorageType"                =? _cdbiStorageType
        , "Tags"                       =? _cdbiTags
        , "TdeCredentialArn"           =? _cdbiTdeCredentialArn
        , "TdeCredentialPassword"      =? _cdbiTdeCredentialPassword
        , "VpcSecurityGroupIds"        =? _cdbiVpcSecurityGroupIds
        ]

instance ToHeaders CreateDBInstance

instance AWSRequest CreateDBInstance where
    type Sv CreateDBInstance = RDS
    type Rs CreateDBInstance = CreateDBInstanceResponse

    request  = post "CreateDBInstance"
    response = xmlResponse

instance FromXML CreateDBInstanceResponse where
    parseXML = withElement "CreateDBInstanceResult" $ \x -> CreateDBInstanceResponse
        <$> x .@? "DBInstance"
