module Antiope.Messages
  ( QueueUrl(..)
  , SQSError(..)
  , messageInBody
  , messageToS3Uri
  , messageToS3Uri'
  ) where

import Antiope.Messages.Types (QueueUrl (QueueUrl), SQSError (DeleteMessageBatchError))
import Antiope.S3             (S3Uri (..))
import Control.Lens
import Control.Monad          (join)
import Data.Aeson.Lens
import Data.Text              (Text, pack, unpack)
import Network.AWS.S3         (BucketName (BucketName), ObjectKey (ObjectKey))
import Network.AWS.SQS

import qualified Network.URI as URI

-- Extract the "Message" content in the body if have
messageInBody :: Text -> Maybe Text
messageInBody body = body ^? key "Message" . _String

messageToS3Uri :: Message -> Maybe S3Uri
messageToS3Uri msg = join $ messageToS3Uri' <$> msg ^. mBody

messageToS3Uri' :: Text -> Maybe S3Uri
messageToS3Uri' msg = do
  s3m <- messageInBody msg ^? _Just . key "Records" . nth 0 . key "s3"
  b   <- s3m ^? key "bucket" . key "name" . _String
  k   <- s3m ^? key "object" . key "key" . _String
  pure $ S3Uri (BucketName b) (ObjectKey $ uriDecode k)

uriDecode :: Text -> Text
uriDecode = pack . URI.unEscapeString . unpack