{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell   #-}
module Network.API.Mandrill.Webhooks where
import           Control.Applicative           (pure)
import           Control.Monad                 (mzero)
import           Data.Aeson                    (FromJSON, ToJSON, parseJSON,
                                                toJSON)
import           Data.Aeson                    (Value (String))
import           Data.Aeson.TH                 (defaultOptions, deriveJSON)
import           Data.Aeson.Types              (fieldLabelModifier)
import           Data.Set                      (Set)
import           Data.Text                     (Text)
import qualified Data.Text                     as T
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)

data EventHook
  = EventSent
  | EventDeferred
  | EventHardBounced
  | EventSoftBounced
  | EventOpened
  | EventClicked
  | EventMarkedAsSpam
  | EventUnsubscribed
  | EventRejected
  deriving (Eq EventHook
Eq EventHook
-> (EventHook -> EventHook -> Ordering)
-> (EventHook -> EventHook -> Bool)
-> (EventHook -> EventHook -> Bool)
-> (EventHook -> EventHook -> Bool)
-> (EventHook -> EventHook -> Bool)
-> (EventHook -> EventHook -> EventHook)
-> (EventHook -> EventHook -> EventHook)
-> Ord EventHook
EventHook -> EventHook -> Bool
EventHook -> EventHook -> Ordering
EventHook -> EventHook -> EventHook
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: EventHook -> EventHook -> EventHook
$cmin :: EventHook -> EventHook -> EventHook
max :: EventHook -> EventHook -> EventHook
$cmax :: EventHook -> EventHook -> EventHook
>= :: EventHook -> EventHook -> Bool
$c>= :: EventHook -> EventHook -> Bool
> :: EventHook -> EventHook -> Bool
$c> :: EventHook -> EventHook -> Bool
<= :: EventHook -> EventHook -> Bool
$c<= :: EventHook -> EventHook -> Bool
< :: EventHook -> EventHook -> Bool
$c< :: EventHook -> EventHook -> Bool
compare :: EventHook -> EventHook -> Ordering
$ccompare :: EventHook -> EventHook -> Ordering
$cp1Ord :: Eq EventHook
Ord,EventHook -> EventHook -> Bool
(EventHook -> EventHook -> Bool)
-> (EventHook -> EventHook -> Bool) -> Eq EventHook
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: EventHook -> EventHook -> Bool
$c/= :: EventHook -> EventHook -> Bool
== :: EventHook -> EventHook -> Bool
$c== :: EventHook -> EventHook -> Bool
Eq)

instance Show EventHook where
  show :: EventHook -> String
show EventHook
e = case EventHook
e of
    EventHook
EventSent         -> String
"send"
    EventHook
EventDeferred     -> String
"deferral"
    EventHook
EventSoftBounced  -> String
"soft_bounce"
    EventHook
EventHardBounced  -> String
"hard_bounce"
    EventHook
EventOpened       -> String
"open"
    EventHook
EventClicked      -> String
"click"
    EventHook
EventMarkedAsSpam -> String
"spam"
    EventHook
EventUnsubscribed -> String
"unsub"
    EventHook
EventRejected     -> String
"reject"
instance FromJSON EventHook where
  parseJSON :: Value -> Parser EventHook
parseJSON (String Text
s) =
    case Text
s of
      Text
"send"           -> EventHook -> Parser EventHook
forall (f :: * -> *) a. Applicative f => a -> f a
pure EventHook
EventSent
      Text
"deferral"       -> EventHook -> Parser EventHook
forall (f :: * -> *) a. Applicative f => a -> f a
pure EventHook
EventDeferred
      Text
"soft_bounce"    -> EventHook -> Parser EventHook
forall (f :: * -> *) a. Applicative f => a -> f a
pure EventHook
EventSoftBounced
      Text
"hard_bounce"    -> EventHook -> Parser EventHook
forall (f :: * -> *) a. Applicative f => a -> f a
pure EventHook
EventHardBounced
      Text
"open"           -> EventHook -> Parser EventHook
forall (f :: * -> *) a. Applicative f => a -> f a
pure EventHook
EventOpened
      Text
"click"          -> EventHook -> Parser EventHook
forall (f :: * -> *) a. Applicative f => a -> f a
pure EventHook
EventClicked
      Text
"spam"           -> EventHook -> Parser EventHook
forall (f :: * -> *) a. Applicative f => a -> f a
pure EventHook
EventMarkedAsSpam
      Text
"reject"         -> EventHook -> Parser EventHook
forall (f :: * -> *) a. Applicative f => a -> f a
pure EventHook
EventRejected
      Text
"unsub"          -> EventHook -> Parser EventHook
forall (f :: * -> *) a. Applicative f => a -> f a
pure EventHook
EventUnsubscribed
      Text
x                -> String -> Parser EventHook
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String
"can't parse " String -> ShowS
forall a. [a] -> [a] -> [a]
++  Text -> String
forall a. Show a => a -> String
show Text
x)


instance ToJSON EventHook where
  toJSON :: EventHook -> Value
toJSON EventHook
e = Text -> Value
String (String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ EventHook -> String
forall a. Show a => a -> String
show EventHook
e)

data WebhookAddRq =
  WebhookAddRq
  { WebhookAddRq -> Text
_warq_key         :: MandrillKey
  , WebhookAddRq -> Text
_warq_url         :: Text
  , WebhookAddRq -> Text
_warq_description :: Text
  , WebhookAddRq -> Set EventHook
_warq_events      :: Set EventHook
  } deriving Int -> WebhookAddRq -> ShowS
[WebhookAddRq] -> ShowS
WebhookAddRq -> String
(Int -> WebhookAddRq -> ShowS)
-> (WebhookAddRq -> String)
-> ([WebhookAddRq] -> ShowS)
-> Show WebhookAddRq
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [WebhookAddRq] -> ShowS
$cshowList :: [WebhookAddRq] -> ShowS
show :: WebhookAddRq -> String
$cshow :: WebhookAddRq -> String
showsPrec :: Int -> WebhookAddRq -> ShowS
$cshowsPrec :: Int -> WebhookAddRq -> ShowS
Show

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