module Network.AWS.S3.CreateBucket
    (
    
      CreateBucket
    
    , createBucket
    
    , cbACL
    , cbBucket
    , cbCreateBucketConfiguration
    , cbGrantFullControl
    , cbGrantRead
    , cbGrantReadACP
    , cbGrantWrite
    , cbGrantWriteACP
    
    , CreateBucketResponse
    
    , createBucketResponse
    
    , cbrLocation
    ) where
import Network.AWS.Prelude
import Network.AWS.Request.S3
import Network.AWS.S3.Types
import qualified GHC.Exts
data CreateBucket = CreateBucket
    { _cbACL                       :: Maybe BucketCannedACL
    , _cbBucket                    :: Text
    , _cbCreateBucketConfiguration :: Maybe CreateBucketConfiguration
    , _cbGrantFullControl          :: Maybe Text
    , _cbGrantRead                 :: Maybe Text
    , _cbGrantReadACP              :: Maybe Text
    , _cbGrantWrite                :: Maybe Text
    , _cbGrantWriteACP             :: Maybe Text
    } deriving (Eq, Show)
createBucket :: Text 
             -> CreateBucket
createBucket p1 = CreateBucket
    { _cbBucket                    = p1
    , _cbACL                       = Nothing
    , _cbCreateBucketConfiguration = Nothing
    , _cbGrantFullControl          = Nothing
    , _cbGrantRead                 = Nothing
    , _cbGrantReadACP              = Nothing
    , _cbGrantWrite                = Nothing
    , _cbGrantWriteACP             = Nothing
    }
cbACL :: Lens' CreateBucket (Maybe BucketCannedACL)
cbACL = lens _cbACL (\s a -> s { _cbACL = a })
cbBucket :: Lens' CreateBucket Text
cbBucket = lens _cbBucket (\s a -> s { _cbBucket = a })
cbCreateBucketConfiguration :: Lens' CreateBucket (Maybe CreateBucketConfiguration)
cbCreateBucketConfiguration =
    lens _cbCreateBucketConfiguration
        (\s a -> s { _cbCreateBucketConfiguration = a })
cbGrantFullControl :: Lens' CreateBucket (Maybe Text)
cbGrantFullControl =
    lens _cbGrantFullControl (\s a -> s { _cbGrantFullControl = a })
cbGrantRead :: Lens' CreateBucket (Maybe Text)
cbGrantRead = lens _cbGrantRead (\s a -> s { _cbGrantRead = a })
cbGrantReadACP :: Lens' CreateBucket (Maybe Text)
cbGrantReadACP = lens _cbGrantReadACP (\s a -> s { _cbGrantReadACP = a })
cbGrantWrite :: Lens' CreateBucket (Maybe Text)
cbGrantWrite = lens _cbGrantWrite (\s a -> s { _cbGrantWrite = a })
cbGrantWriteACP :: Lens' CreateBucket (Maybe Text)
cbGrantWriteACP = lens _cbGrantWriteACP (\s a -> s { _cbGrantWriteACP = a })
newtype CreateBucketResponse = CreateBucketResponse
    { _cbrLocation :: Maybe Text
    } deriving (Eq, Ord, Show, Monoid)
createBucketResponse :: CreateBucketResponse
createBucketResponse = CreateBucketResponse
    { _cbrLocation = Nothing
    }
cbrLocation :: Lens' CreateBucketResponse (Maybe Text)
cbrLocation = lens _cbrLocation (\s a -> s { _cbrLocation = a })
instance ToPath CreateBucket where
    toPath CreateBucket{..} = mconcat
        [ "/"
        , toText _cbBucket
        ]
instance ToQuery CreateBucket where
    toQuery = const mempty
instance ToHeaders CreateBucket where
    toHeaders CreateBucket{..} = mconcat
        [ "x-amz-acl"                =: _cbACL
        , "x-amz-grant-full-control" =: _cbGrantFullControl
        , "x-amz-grant-read"         =: _cbGrantRead
        , "x-amz-grant-read-acp"     =: _cbGrantReadACP
        , "x-amz-grant-write"        =: _cbGrantWrite
        , "x-amz-grant-write-acp"    =: _cbGrantWriteACP
        ]
instance ToXMLRoot CreateBucket where
    toXMLRoot CreateBucket{..} = namespaced ns "CreateBucket"
        [ "CreateBucketConfiguration" =@ _cbCreateBucketConfiguration
        ]
instance ToXML CreateBucket
instance AWSRequest CreateBucket where
    type Sv CreateBucket = S3
    type Rs CreateBucket = CreateBucketResponse
    request  = put
    response = headerResponse $ \h -> CreateBucketResponse
        <$> h ~:? "Location"