{-# 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
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
Ord,EventHook -> EventHook -> Bool
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"           -> forall (f :: * -> *) a. Applicative f => a -> f a
pure EventHook
EventSent
      Text
"deferral"       -> forall (f :: * -> *) a. Applicative f => a -> f a
pure EventHook
EventDeferred
      Text
"soft_bounce"    -> forall (f :: * -> *) a. Applicative f => a -> f a
pure EventHook
EventSoftBounced
      Text
"hard_bounce"    -> forall (f :: * -> *) a. Applicative f => a -> f a
pure EventHook
EventHardBounced
      Text
"open"           -> forall (f :: * -> *) a. Applicative f => a -> f a
pure EventHook
EventOpened
      Text
"click"          -> forall (f :: * -> *) a. Applicative f => a -> f a
pure EventHook
EventClicked
      Text
"spam"           -> forall (f :: * -> *) a. Applicative f => a -> f a
pure EventHook
EventMarkedAsSpam
      Text
"reject"         -> forall (f :: * -> *) a. Applicative f => a -> f a
pure EventHook
EventRejected
      Text
"unsub"          -> forall (f :: * -> *) a. Applicative f => a -> f a
pure EventHook
EventUnsubscribed
      Text
x                -> forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String
"can't parse " forall a. [a] -> [a] -> [a]
++  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 forall a b. (a -> b) -> a -> b
$ 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
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