module Network.AWS.S3.PutBucketAcl
    (
    
      PutBucketAcl
    
    , putBucketAcl
    
    , pbaACL
    , pbaAccessControlPolicy
    , pbaBucket
    , pbaContentMD5
    , pbaGrantFullControl
    , pbaGrantRead
    , pbaGrantReadACP
    , pbaGrantWrite
    , pbaGrantWriteACP
    
    , PutBucketAclResponse
    
    , putBucketAclResponse
    ) where
import Network.AWS.Prelude
import Network.AWS.Request.S3
import Network.AWS.S3.Types
import qualified GHC.Exts
data PutBucketAcl = PutBucketAcl
    { _pbaACL                 :: Maybe BucketCannedACL
    , _pbaAccessControlPolicy :: Maybe AccessControlPolicy
    , _pbaBucket              :: Text
    , _pbaContentMD5          :: Maybe Text
    , _pbaGrantFullControl    :: Maybe Text
    , _pbaGrantRead           :: Maybe Text
    , _pbaGrantReadACP        :: Maybe Text
    , _pbaGrantWrite          :: Maybe Text
    , _pbaGrantWriteACP       :: Maybe Text
    } deriving (Eq, Show)
putBucketAcl :: Text 
             -> PutBucketAcl
putBucketAcl p1 = PutBucketAcl
    { _pbaBucket              = p1
    , _pbaACL                 = Nothing
    , _pbaAccessControlPolicy = Nothing
    , _pbaContentMD5          = Nothing
    , _pbaGrantFullControl    = Nothing
    , _pbaGrantRead           = Nothing
    , _pbaGrantReadACP        = Nothing
    , _pbaGrantWrite          = Nothing
    , _pbaGrantWriteACP       = Nothing
    }
pbaACL :: Lens' PutBucketAcl (Maybe BucketCannedACL)
pbaACL = lens _pbaACL (\s a -> s { _pbaACL = a })
pbaAccessControlPolicy :: Lens' PutBucketAcl (Maybe AccessControlPolicy)
pbaAccessControlPolicy =
    lens _pbaAccessControlPolicy (\s a -> s { _pbaAccessControlPolicy = a })
pbaBucket :: Lens' PutBucketAcl Text
pbaBucket = lens _pbaBucket (\s a -> s { _pbaBucket = a })
pbaContentMD5 :: Lens' PutBucketAcl (Maybe Text)
pbaContentMD5 = lens _pbaContentMD5 (\s a -> s { _pbaContentMD5 = a })
pbaGrantFullControl :: Lens' PutBucketAcl (Maybe Text)
pbaGrantFullControl =
    lens _pbaGrantFullControl (\s a -> s { _pbaGrantFullControl = a })
pbaGrantRead :: Lens' PutBucketAcl (Maybe Text)
pbaGrantRead = lens _pbaGrantRead (\s a -> s { _pbaGrantRead = a })
pbaGrantReadACP :: Lens' PutBucketAcl (Maybe Text)
pbaGrantReadACP = lens _pbaGrantReadACP (\s a -> s { _pbaGrantReadACP = a })
pbaGrantWrite :: Lens' PutBucketAcl (Maybe Text)
pbaGrantWrite = lens _pbaGrantWrite (\s a -> s { _pbaGrantWrite = a })
pbaGrantWriteACP :: Lens' PutBucketAcl (Maybe Text)
pbaGrantWriteACP = lens _pbaGrantWriteACP (\s a -> s { _pbaGrantWriteACP = a })
data PutBucketAclResponse = PutBucketAclResponse
    deriving (Eq, Ord, Show, Generic)
putBucketAclResponse :: PutBucketAclResponse
putBucketAclResponse = PutBucketAclResponse
instance ToPath PutBucketAcl where
    toPath PutBucketAcl{..} = mconcat
        [ "/"
        , toText _pbaBucket
        ]
instance ToQuery PutBucketAcl where
    toQuery = const "acl"
instance ToHeaders PutBucketAcl where
    toHeaders PutBucketAcl{..} = mconcat
        [ "x-amz-acl"                =: _pbaACL
        , "Content-MD5"              =: _pbaContentMD5
        , "x-amz-grant-full-control" =: _pbaGrantFullControl
        , "x-amz-grant-read"         =: _pbaGrantRead
        , "x-amz-grant-read-acp"     =: _pbaGrantReadACP
        , "x-amz-grant-write"        =: _pbaGrantWrite
        , "x-amz-grant-write-acp"    =: _pbaGrantWriteACP
        ]
instance ToXMLRoot PutBucketAcl where
    toXMLRoot PutBucketAcl{..} = namespaced ns "PutBucketAcl"
        [ "AccessControlPolicy" =@ _pbaAccessControlPolicy
        ]
instance ToXML PutBucketAcl
instance AWSRequest PutBucketAcl where
    type Sv PutBucketAcl = S3
    type Rs PutBucketAcl = PutBucketAclResponse
    request  = put
    response = nullResponse PutBucketAclResponse