module Reddit.Types.Moderation where

import Reddit.Parser
import Reddit.Types.User
import Reddit.Types.Thing

import Control.Applicative
import Data.Aeson
import Data.Time.Clock
import Data.Time.Clock.POSIX
import Data.Monoid
import Data.Text (Text)
import Network.API.Builder.Query
import Prelude

newtype BanID = BanID Text
  deriving (Int -> BanID -> ShowS
[BanID] -> ShowS
BanID -> String
(Int -> BanID -> ShowS)
-> (BanID -> String) -> ([BanID] -> ShowS) -> Show BanID
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [BanID] -> ShowS
$cshowList :: [BanID] -> ShowS
show :: BanID -> String
$cshow :: BanID -> String
showsPrec :: Int -> BanID -> ShowS
$cshowsPrec :: Int -> BanID -> ShowS
Show, ReadPrec [BanID]
ReadPrec BanID
Int -> ReadS BanID
ReadS [BanID]
(Int -> ReadS BanID)
-> ReadS [BanID]
-> ReadPrec BanID
-> ReadPrec [BanID]
-> Read BanID
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [BanID]
$creadListPrec :: ReadPrec [BanID]
readPrec :: ReadPrec BanID
$creadPrec :: ReadPrec BanID
readList :: ReadS [BanID]
$creadList :: ReadS [BanID]
readsPrec :: Int -> ReadS BanID
$creadsPrec :: Int -> ReadS BanID
Read, BanID -> BanID -> Bool
(BanID -> BanID -> Bool) -> (BanID -> BanID -> Bool) -> Eq BanID
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: BanID -> BanID -> Bool
$c/= :: BanID -> BanID -> Bool
== :: BanID -> BanID -> Bool
$c== :: BanID -> BanID -> Bool
Eq, Eq BanID
Eq BanID
-> (BanID -> BanID -> Ordering)
-> (BanID -> BanID -> Bool)
-> (BanID -> BanID -> Bool)
-> (BanID -> BanID -> Bool)
-> (BanID -> BanID -> Bool)
-> (BanID -> BanID -> BanID)
-> (BanID -> BanID -> BanID)
-> Ord BanID
BanID -> BanID -> Bool
BanID -> BanID -> Ordering
BanID -> BanID -> BanID
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 :: BanID -> BanID -> BanID
$cmin :: BanID -> BanID -> BanID
max :: BanID -> BanID -> BanID
$cmax :: BanID -> BanID -> BanID
>= :: BanID -> BanID -> Bool
$c>= :: BanID -> BanID -> Bool
> :: BanID -> BanID -> Bool
$c> :: BanID -> BanID -> Bool
<= :: BanID -> BanID -> Bool
$c<= :: BanID -> BanID -> Bool
< :: BanID -> BanID -> Bool
$c< :: BanID -> BanID -> Bool
compare :: BanID -> BanID -> Ordering
$ccompare :: BanID -> BanID -> Ordering
$cp1Ord :: Eq BanID
Ord)

instance FromJSON BanID where
  parseJSON :: Value -> Parser BanID
parseJSON (String Text
s) =
    Text -> BanID
BanID (Text -> BanID) -> Parser Text -> Parser BanID
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> Text -> Parser Text
stripPrefix Text
banPrefix Text
s
  parseJSON Value
_ = Parser BanID
forall a. Monoid a => a
mempty

instance ToQuery BanID where
  toQuery :: Text -> BanID -> [(Text, Text)]
toQuery Text
k BanID
v = [(Text
k, BanID -> Text
forall a. Thing a => a -> Text
fullName BanID
v)]

instance Thing BanID where
  fullName :: BanID -> Text
fullName (BanID Text
b) = [Text] -> Text
forall a. Monoid a => [a] -> a
mconcat [Text
banPrefix, Text
"_", Text
b]

data Ban = Ban { Ban -> Username
username :: Username
               , Ban -> UserID
userID :: UserID
               , Ban -> Text
note :: Text
               , Ban -> UTCTime
since :: UTCTime }
  deriving (Int -> Ban -> ShowS
[Ban] -> ShowS
Ban -> String
(Int -> Ban -> ShowS)
-> (Ban -> String) -> ([Ban] -> ShowS) -> Show Ban
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Ban] -> ShowS
$cshowList :: [Ban] -> ShowS
show :: Ban -> String
$cshow :: Ban -> String
showsPrec :: Int -> Ban -> ShowS
$cshowsPrec :: Int -> Ban -> ShowS
Show, ReadPrec [Ban]
ReadPrec Ban
Int -> ReadS Ban
ReadS [Ban]
(Int -> ReadS Ban)
-> ReadS [Ban] -> ReadPrec Ban -> ReadPrec [Ban] -> Read Ban
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Ban]
$creadListPrec :: ReadPrec [Ban]
readPrec :: ReadPrec Ban
$creadPrec :: ReadPrec Ban
readList :: ReadS [Ban]
$creadList :: ReadS [Ban]
readsPrec :: Int -> ReadS Ban
$creadsPrec :: Int -> ReadS Ban
Read, Ban -> Ban -> Bool
(Ban -> Ban -> Bool) -> (Ban -> Ban -> Bool) -> Eq Ban
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Ban -> Ban -> Bool
$c/= :: Ban -> Ban -> Bool
== :: Ban -> Ban -> Bool
$c== :: Ban -> Ban -> Bool
Eq)

instance FromJSON Ban where
  parseJSON :: Value -> Parser Ban
parseJSON (Object Object
o) =
    Username -> UserID -> Text -> UTCTime -> Ban
Ban (Username -> UserID -> Text -> UTCTime -> Ban)
-> Parser Username -> Parser (UserID -> Text -> UTCTime -> Ban)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser Username
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"name"
        Parser (UserID -> Text -> UTCTime -> Ban)
-> Parser UserID -> Parser (Text -> UTCTime -> Ban)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser UserID
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"id"
        Parser (Text -> UTCTime -> Ban)
-> Parser Text -> Parser (UTCTime -> Ban)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"note"
        Parser (UTCTime -> Ban) -> Parser UTCTime -> Parser Ban
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (POSIXTime -> UTCTime
posixSecondsToUTCTime (POSIXTime -> UTCTime)
-> (Integer -> POSIXTime) -> Integer -> UTCTime
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> POSIXTime
forall a. Num a => Integer -> a
fromInteger (Integer -> UTCTime) -> Parser Integer -> Parser UTCTime
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"date")
  parseJSON Value
_ = Parser Ban
forall a. Monoid a => a
mempty

banPrefix :: Text
banPrefix :: Text
banPrefix = Text
"rb"