{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE OverloadedStrings #-}
module Network.API.Mandrill.Users.Types where

import           Data.Char
import           Data.Time
import qualified Data.Text as T
import           Control.Monad
import           Data.Monoid
import           Data.Aeson
import           Data.Aeson.Types
import           Data.Aeson.TH
import           Lens.Micro.TH (makeLenses)

import           Network.API.Mandrill.Types


--------------------------------------------------------------------------------
data UsersRq = UsersRq {
    UsersRq -> MandrillKey
_ureq_key :: !MandrillKey
  } deriving Int -> UsersRq -> ShowS
[UsersRq] -> ShowS
UsersRq -> String
(Int -> UsersRq -> ShowS)
-> (UsersRq -> String) -> ([UsersRq] -> ShowS) -> Show UsersRq
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UsersRq] -> ShowS
$cshowList :: [UsersRq] -> ShowS
show :: UsersRq -> String
$cshow :: UsersRq -> String
showsPrec :: Int -> UsersRq -> ShowS
$cshowsPrec :: Int -> UsersRq -> ShowS
Show

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

--------------------------------------------------------------------------------
data MandrillStats = MandrillStats {
    MandrillStats -> Int
_msts_sent :: Int
  , MandrillStats -> Int
_msts_hard_bounces :: Int
  , MandrillStats -> Int
_msts_soft_bounces :: Int
  , MandrillStats -> Int
_msts_rejects :: Int
  , MandrillStats -> Int
_msts_complaints :: Int
  , MandrillStats -> Int
_msts_unsubs :: Int
  , MandrillStats -> Int
_msts_opens :: Int
  , MandrillStats -> Int
_msts_unique_opens :: Int
  , MandrillStats -> Int
_msts_clicks :: Int
  , MandrillStats -> Int
_msts_unique_clicks :: Int
  } deriving Int -> MandrillStats -> ShowS
[MandrillStats] -> ShowS
MandrillStats -> String
(Int -> MandrillStats -> ShowS)
-> (MandrillStats -> String)
-> ([MandrillStats] -> ShowS)
-> Show MandrillStats
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MandrillStats] -> ShowS
$cshowList :: [MandrillStats] -> ShowS
show :: MandrillStats -> String
$cshow :: MandrillStats -> String
showsPrec :: Int -> MandrillStats -> ShowS
$cshowsPrec :: Int -> MandrillStats -> ShowS
Show

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

--------------------------------------------------------------------------------
data UserStats = UserStats {
    UserStats -> MandrillStats
_usts_today :: MandrillStats
  , UserStats -> MandrillStats
_usts_last_7_days :: MandrillStats
  , UserStats -> MandrillStats
_usts_last_30_days :: MandrillStats
  , UserStats -> MandrillStats
_usts_last_60_days :: MandrillStats
  , UserStats -> MandrillStats
_usts_last_90_days :: MandrillStats
  , UserStats -> MandrillStats
_usts_all_time :: MandrillStats
  } deriving Int -> UserStats -> ShowS
[UserStats] -> ShowS
UserStats -> String
(Int -> UserStats -> ShowS)
-> (UserStats -> String)
-> ([UserStats] -> ShowS)
-> Show UserStats
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UserStats] -> ShowS
$cshowList :: [UserStats] -> ShowS
show :: UserStats -> String
$cshow :: UserStats -> String
showsPrec :: Int -> UserStats -> ShowS
$cshowsPrec :: Int -> UserStats -> ShowS
Show

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

--------------------------------------------------------------------------------
data UsersInfoResponse = UsersInfoResponse {
    UsersInfoResponse -> MandrillKey
_usir_username :: !T.Text
  , UsersInfoResponse -> MandrillDate
_usir_created_at :: MandrillDate
  , UsersInfoResponse -> MandrillKey
_usir_public_id :: !T.Text
  , UsersInfoResponse -> Int
_usir_reputation :: !Int
  , UsersInfoResponse -> Int
_usir_hourly_quota :: !Int
  , UsersInfoResponse -> Int
_usir_backlog :: !Int
  , UsersInfoResponse -> UserStats
_usir_stats :: UserStats
  } deriving Int -> UsersInfoResponse -> ShowS
[UsersInfoResponse] -> ShowS
UsersInfoResponse -> String
(Int -> UsersInfoResponse -> ShowS)
-> (UsersInfoResponse -> String)
-> ([UsersInfoResponse] -> ShowS)
-> Show UsersInfoResponse
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UsersInfoResponse] -> ShowS
$cshowList :: [UsersInfoResponse] -> ShowS
show :: UsersInfoResponse -> String
$cshow :: UsersInfoResponse -> String
showsPrec :: Int -> UsersInfoResponse -> ShowS
$cshowsPrec :: Int -> UsersInfoResponse -> ShowS
Show

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


--------------------------------------------------------------------------------
newtype UsersPingResponse = UsersPingResponse T.Text deriving Int -> UsersPingResponse -> ShowS
[UsersPingResponse] -> ShowS
UsersPingResponse -> String
(Int -> UsersPingResponse -> ShowS)
-> (UsersPingResponse -> String)
-> ([UsersPingResponse] -> ShowS)
-> Show UsersPingResponse
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UsersPingResponse] -> ShowS
$cshowList :: [UsersPingResponse] -> ShowS
show :: UsersPingResponse -> String
$cshow :: UsersPingResponse -> String
showsPrec :: Int -> UsersPingResponse -> ShowS
$cshowsPrec :: Int -> UsersPingResponse -> ShowS
Show

deriveFromJSON defaultOptions ''UsersPingResponse

instance ToJSON UsersPingResponse where
  toJSON :: UsersPingResponse -> Value
toJSON (UsersPingResponse MandrillKey
t) = MandrillKey -> Value
String MandrillKey
t


--------------------------------------------------------------------------------
data UsersPing2Response = UsersPing2Response {
    UsersPing2Response -> MandrillKey
_usrr_PING :: T.Text
  } deriving Int -> UsersPing2Response -> ShowS
[UsersPing2Response] -> ShowS
UsersPing2Response -> String
(Int -> UsersPing2Response -> ShowS)
-> (UsersPing2Response -> String)
-> ([UsersPing2Response] -> ShowS)
-> Show UsersPing2Response
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UsersPing2Response] -> ShowS
$cshowList :: [UsersPing2Response] -> ShowS
show :: UsersPing2Response -> String
$cshow :: UsersPing2Response -> String
showsPrec :: Int -> UsersPing2Response -> ShowS
$cshowsPrec :: Int -> UsersPing2Response -> ShowS
Show

deriveJSON defaultOptions { fieldLabelModifier = drop 6 } ''UsersPing2Response



--------------------------------------------------------------------------------
data UsersSendersResponse = UsersResponse {
    UsersSendersResponse -> MandrillKey
_usrr_address :: !T.Text
    -- ^ The sender's email address
  , UsersSendersResponse -> MandrillDate
_usrr_created_at :: MandrillDate
    -- ^ The date and time that the sender was first seen by Mandrill 
    -- as a UTC date string in YYYY-MM-DD HH:MM:SS format
  , UsersSendersResponse -> Int
_usrr_sent :: !Int
    -- ^ The total number of messages sent by this sender
  , UsersSendersResponse -> Int
_usrr_hard_bounces :: !Int
    -- ^ The total number of hard bounces by messages by this sender
  , UsersSendersResponse -> Int
_usrr_soft_bounces :: !Int
    -- ^ The total number of soft bounces by messages by this sender
  , UsersSendersResponse -> Int
_usrr_rejects :: !Int
    -- ^ The total number of rejected messages by this sender
  , UsersSendersResponse -> Int
_usrr_complaints :: !Int
    -- ^ The total number of spam complaints received
    -- for messages by this sender
  , UsersSendersResponse -> Int
_usrr_unsubs :: !Int
    -- ^ The total number of unsubscribe requests received
    -- for messages by this sender
  , UsersSendersResponse -> Int
_usrr_opens :: !Int
    -- ^ The total number of times messages by this sender have been opened
  , UsersSendersResponse -> Int
_usrr_clicks :: !Int
    -- ^ The total number of times tracked URLs in messages
    -- by this sender have been clicked
  , UsersSendersResponse -> Int
_usrr_unique_opens :: !Int
    -- ^ The number of unique opens for emails sent for this sender
  , UsersSendersResponse -> Int
_usrr_unique_clicks :: !Int
    -- ^ The number of unique clicks for emails sent for this sender
  } deriving Int -> UsersSendersResponse -> ShowS
[UsersSendersResponse] -> ShowS
UsersSendersResponse -> String
(Int -> UsersSendersResponse -> ShowS)
-> (UsersSendersResponse -> String)
-> ([UsersSendersResponse] -> ShowS)
-> Show UsersSendersResponse
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UsersSendersResponse] -> ShowS
$cshowList :: [UsersSendersResponse] -> ShowS
show :: UsersSendersResponse -> String
$cshow :: UsersSendersResponse -> String
showsPrec :: Int -> UsersSendersResponse -> ShowS
$cshowsPrec :: Int -> UsersSendersResponse -> ShowS
Show

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