{-# LANGUAGE ScopedTypeVariables #-}

module Antiope.S3.Strict
  ( unsafeDownload
  , download
  , downloadFromS3Uri
  ) where

import Antiope.Core                 ()
import Antiope.S3.Types             (S3Uri)
import Control.Monad.Trans.AWS      hiding (send)
import Control.Monad.Trans.Resource
import Network.AWS                  (MonadAWS)

import qualified Antiope.S3.Lazy      as LBS
import qualified Data.ByteString      as BS
import qualified Data.ByteString.Lazy as LBS
import qualified Network.AWS.S3       as AWS

unsafeDownload :: (MonadAWS m, MonadUnliftIO m)
  => AWS.BucketName
  -> AWS.ObjectKey
  -> m BS.ByteString
unsafeDownload bucketName objectKey = runResourceT $ LBS.toStrict <$> LBS.unsafeDownload bucketName objectKey

download :: (MonadAWS m, MonadUnliftIO m)
  => AWS.BucketName
  -> AWS.ObjectKey
  -> m (Maybe BS.ByteString)
download bucketName objectKey = runResourceT $ fmap LBS.toStrict <$> LBS.download bucketName objectKey

downloadFromS3Uri :: (MonadAWS m, MonadUnliftIO m)
  => S3Uri
  -> m (Maybe BS.ByteString)
downloadFromS3Uri s3Uri = runResourceT $ fmap LBS.toStrict <$> LBS.downloadFromS3Uri s3Uri