{-# LANGUAGE OverloadedStrings #-}
-- |
-- Module: $HEADER$
--
-- Postmark email responses.
module Postmark.Response(Status(..),Error,Success(..)) where

import           Data.Aeson       (FromJSON (..), Value (..), (.:))
import           Data.Aeson.Types (typeMismatch)
import           Data.Text        (Text,split)
import           Data.Time        (ZonedTime)
import           Data.Word        (Word32)

-- | Status code
data Status =
  Status {
    errorCode :: Word32
  , message   :: Text
} deriving Show

-- | In case of an API error, only a 'Status' is returned
type Error = Status

instance FromJSON Status where
  parseJSON (Object o) = Status <$> o .: "ErrorCode" <*> o .: "Message"
  parseJSON invalid    = typeMismatch "Status" invalid

-- | In case of success, 'Success' is returned
data Success =
  Success {
    status      :: Status
  , submittedAt :: ZonedTime
  , messageID   :: Text
  , to_         :: [Text] } deriving Show

fromCommaSeparated :: Text -> [Text]
fromCommaSeparated = split (== ',')

instance FromJSON Success where
  parseJSON (Object o) =
    Success <$>
    parseJSON (Object o) <*>
    o .: "SubmittedAt" <*>
    o .: "MessageID" <*>
    fmap fromCommaSeparated (o .: "To")
  parseJSON invalid = typeMismatch "Success" invalid