{-# LANGUAGE TemplateHaskell #-}
module Network.API.Mandrill.Senders where
import           Data.Aeson                    (FromJSON, ToJSON, parseJSON,
                                                toJSON)
import           Data.Aeson.TH                 (defaultOptions, deriveJSON)
import           Data.Aeson.Types              (Value (..), fieldLabelModifier)
import           Data.Text                     (Text)
import           Data.Text.Encoding            (decodeUtf8, encodeUtf8)
import           Lens.Micro.TH                 (makeLenses)
import           Network.API.Mandrill.HTTP     (toMandrillResponse)
import           Network.API.Mandrill.Settings
import           Network.API.Mandrill.Types
import           Network.HTTP.Client           (Manager)
import qualified Text.Email.Validate           as TEV

data VerifyDomainRq =
  VerifyDomainRq
  { VerifyDomainRq -> MandrillKey
_vdrq_key     :: MandrillKey
  , VerifyDomainRq -> MandrillKey
_vdrq_domain  :: Text
  , VerifyDomainRq -> MandrillKey
_vdrq_mailbox :: Text
  } deriving Int -> VerifyDomainRq -> ShowS
[VerifyDomainRq] -> ShowS
VerifyDomainRq -> String
(Int -> VerifyDomainRq -> ShowS)
-> (VerifyDomainRq -> String)
-> ([VerifyDomainRq] -> ShowS)
-> Show VerifyDomainRq
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [VerifyDomainRq] -> ShowS
$cshowList :: [VerifyDomainRq] -> ShowS
show :: VerifyDomainRq -> String
$cshow :: VerifyDomainRq -> String
showsPrec :: Int -> VerifyDomainRq -> ShowS
$cshowsPrec :: Int -> VerifyDomainRq -> ShowS
Show

makeLenses ''VerifyDomainRq
deriveJSON defaultOptions { fieldLabelModifier = drop 6 } ''VerifyDomainRq

data VerifyDomainResponse =
  VerifyDomainResponse
  { VerifyDomainResponse -> MandrillKey
_vdres_status :: Text
  , VerifyDomainResponse -> MandrillKey
_vdres_domain :: Text
  , VerifyDomainResponse -> MandrillEmail
_vdres_email  :: MandrillEmail
  } deriving Int -> VerifyDomainResponse -> ShowS
[VerifyDomainResponse] -> ShowS
VerifyDomainResponse -> String
(Int -> VerifyDomainResponse -> ShowS)
-> (VerifyDomainResponse -> String)
-> ([VerifyDomainResponse] -> ShowS)
-> Show VerifyDomainResponse
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [VerifyDomainResponse] -> ShowS
$cshowList :: [VerifyDomainResponse] -> ShowS
show :: VerifyDomainResponse -> String
$cshow :: VerifyDomainResponse -> String
showsPrec :: Int -> VerifyDomainResponse -> ShowS
$cshowsPrec :: Int -> VerifyDomainResponse -> ShowS
Show

makeLenses ''VerifyDomainResponse
deriveJSON defaultOptions { fieldLabelModifier = drop 7 } ''VerifyDomainResponse


verifyDomain :: MandrillKey
                -- ^ The API key
                -> TEV.EmailAddress
                -- ^ Email address to use for verification
                -> Maybe Manager
                -> IO (MandrillResponse VerifyDomainResponse)
verifyDomain :: MandrillKey
-> EmailAddress
-> Maybe Manager
-> IO (MandrillResponse VerifyDomainResponse)
verifyDomain MandrillKey
k EmailAddress
email =
  MandrillCalls
-> VerifyDomainRq
-> Maybe Manager
-> IO (MandrillResponse VerifyDomainResponse)
forall ep a rq.
(MandrillEndpoint ep, FromJSON a, ToJSON rq) =>
ep -> rq -> Maybe Manager -> IO (MandrillResponse a)
toMandrillResponse MandrillCalls
VerifyDomain
  (MandrillKey -> MandrillKey -> MandrillKey -> VerifyDomainRq
VerifyDomainRq MandrillKey
k  (ByteString -> MandrillKey
decodeUtf8 (ByteString -> MandrillKey) -> ByteString -> MandrillKey
forall a b. (a -> b) -> a -> b
$ EmailAddress -> ByteString
TEV.domainPart EmailAddress
email) (ByteString -> MandrillKey
decodeUtf8 (ByteString -> MandrillKey) -> ByteString -> MandrillKey
forall a b. (a -> b) -> a -> b
$ EmailAddress -> ByteString
TEV.localPart EmailAddress
email))