module Antiope.SNS
  ( publishMessage
  , subscribeTopic
  , module Antiope.SNS.Types
  , module Network.AWS.SNS
  ) where

import Antiope.SNS.Types
import Control.Lens
import Data.Text         (Text)
import Network.AWS       (MonadAWS)
import Network.AWS.SNS

import qualified Network.AWS as AWS

publishMessage :: MonadAWS m
  => Topic
  -> Text
  -> m (Maybe MessageId)
publishMessage topicArn message = do
  resp <- AWS.send $ publish message & pTopicARN <>~ (topicArn ^. tTopicARN)
  return $ MessageId <$> resp ^. prsMessageId

subscribeTopic :: MonadAWS m
  => Topic
  -> Protocol
  -> Endpoint
  -> m (Maybe SubscriptionArn)
subscribeTopic topicArn (Protocol p) ep = case topicArn ^. tTopicARN of
  Just t -> do
    resp <- AWS.send $ subscribe t p & subEndpoint <>~ (ep ^. eEndpointARN)
    return $ SubscriptionArn <$> resp ^. srsSubscriptionARN
  Nothing -> return Nothing