module Antiope.SNS
( MonadAWS
, MessageId (..)
, Protocol (..)
, SubscriptionArn (..)
, publishMessage
, subscribeTopic
, module Network.AWS.SNS
) where

import Control.Lens
import Data.Text             (Text)
import Network.AWS           (MonadAWS, send)
import Network.AWS.Data.Text (FromText (..), ToText (..))
import Network.AWS.SNS

newtype MessageId = MessageId Text deriving (Show, Eq, Ord, ToText, FromText)
newtype Protocol = Protocol Text deriving (Show, Eq, Ord, ToText, FromText)
newtype SubscriptionArn = SubscriptionArn Text deriving (Show, Eq, Ord, ToText, FromText)

publishMessage :: MonadAWS m => Topic -> Text -> m (Maybe MessageId)
publishMessage topicArn message = do
  resp <- 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 <- send $ subscribe t p & subEndpoint <>~ (ep ^. eEndpointARN)
    return $ SubscriptionArn <$> resp ^. srsSubscriptionARN
  Nothing -> return Nothing