module Reddit.Types.Wiki where

import Reddit.Parser
import Reddit.Types.User
import Reddit.Utilities

import Control.Applicative
import Data.Aeson
import Data.Monoid
import Data.Text (Text)
import Data.Time.Clock
import Data.Time.Clock.POSIX
import Prelude

newtype RevisionID = RevisionID Text
  deriving (Int -> RevisionID -> ShowS
[RevisionID] -> ShowS
RevisionID -> String
(Int -> RevisionID -> ShowS)
-> (RevisionID -> String)
-> ([RevisionID] -> ShowS)
-> Show RevisionID
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RevisionID] -> ShowS
$cshowList :: [RevisionID] -> ShowS
show :: RevisionID -> String
$cshow :: RevisionID -> String
showsPrec :: Int -> RevisionID -> ShowS
$cshowsPrec :: Int -> RevisionID -> ShowS
Show, ReadPrec [RevisionID]
ReadPrec RevisionID
Int -> ReadS RevisionID
ReadS [RevisionID]
(Int -> ReadS RevisionID)
-> ReadS [RevisionID]
-> ReadPrec RevisionID
-> ReadPrec [RevisionID]
-> Read RevisionID
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [RevisionID]
$creadListPrec :: ReadPrec [RevisionID]
readPrec :: ReadPrec RevisionID
$creadPrec :: ReadPrec RevisionID
readList :: ReadS [RevisionID]
$creadList :: ReadS [RevisionID]
readsPrec :: Int -> ReadS RevisionID
$creadsPrec :: Int -> ReadS RevisionID
Read, RevisionID -> RevisionID -> Bool
(RevisionID -> RevisionID -> Bool)
-> (RevisionID -> RevisionID -> Bool) -> Eq RevisionID
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RevisionID -> RevisionID -> Bool
$c/= :: RevisionID -> RevisionID -> Bool
== :: RevisionID -> RevisionID -> Bool
$c== :: RevisionID -> RevisionID -> Bool
Eq)

data WikiPage = WikiPage { WikiPage -> Maybe Text
contentHTML :: Maybe Text
                         , WikiPage -> Text
contentMarkdown :: Text
                         , WikiPage -> UTCTime
revisionDate :: UTCTime
                         , WikiPage -> Username
revisedBy :: Username
                         , WikiPage -> Bool
canRevise :: Bool }
  deriving (Int -> WikiPage -> ShowS
[WikiPage] -> ShowS
WikiPage -> String
(Int -> WikiPage -> ShowS)
-> (WikiPage -> String) -> ([WikiPage] -> ShowS) -> Show WikiPage
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [WikiPage] -> ShowS
$cshowList :: [WikiPage] -> ShowS
show :: WikiPage -> String
$cshow :: WikiPage -> String
showsPrec :: Int -> WikiPage -> ShowS
$cshowsPrec :: Int -> WikiPage -> ShowS
Show, ReadPrec [WikiPage]
ReadPrec WikiPage
Int -> ReadS WikiPage
ReadS [WikiPage]
(Int -> ReadS WikiPage)
-> ReadS [WikiPage]
-> ReadPrec WikiPage
-> ReadPrec [WikiPage]
-> Read WikiPage
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [WikiPage]
$creadListPrec :: ReadPrec [WikiPage]
readPrec :: ReadPrec WikiPage
$creadPrec :: ReadPrec WikiPage
readList :: ReadS [WikiPage]
$creadList :: ReadS [WikiPage]
readsPrec :: Int -> ReadS WikiPage
$creadsPrec :: Int -> ReadS WikiPage
Read, WikiPage -> WikiPage -> Bool
(WikiPage -> WikiPage -> Bool)
-> (WikiPage -> WikiPage -> Bool) -> Eq WikiPage
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: WikiPage -> WikiPage -> Bool
$c/= :: WikiPage -> WikiPage -> Bool
== :: WikiPage -> WikiPage -> Bool
$c== :: WikiPage -> WikiPage -> Bool
Eq)

instance FromJSON WikiPage where
  parseJSON :: Value -> Parser WikiPage
parseJSON (Object Object
o) = do
    Object
o Object -> Text -> Parser ()
`ensureKind` Text
"wikipage"
    Object
d <- Object
o Object -> Key -> Parser Object
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"data"
    Maybe Text -> Text -> UTCTime -> Username -> Bool -> WikiPage
WikiPage (Maybe Text -> Text -> UTCTime -> Username -> Bool -> WikiPage)
-> Parser (Maybe Text)
-> Parser (Text -> UTCTime -> Username -> Bool -> WikiPage)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((Text -> Text) -> Maybe Text -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Text -> Text
unescape (Maybe Text -> Maybe Text)
-> Parser (Maybe Text) -> Parser (Maybe Text)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
d Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"content_html")
             Parser (Text -> UTCTime -> Username -> Bool -> WikiPage)
-> Parser Text -> Parser (UTCTime -> Username -> Bool -> WikiPage)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Text -> Text
unescape (Text -> Text) -> Parser Text -> Parser Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
d Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"content_md")
             Parser (UTCTime -> Username -> Bool -> WikiPage)
-> Parser UTCTime -> Parser (Username -> Bool -> WikiPage)
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
d Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"revision_date")
             Parser (Username -> Bool -> WikiPage)
-> Parser Username -> Parser (Bool -> WikiPage)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ((Object
d Object -> Key -> Parser Object
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"revision_by") Parser Object -> (Object -> Parser Object) -> Parser Object
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Object -> Key -> Parser Object
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"data") Parser Object -> (Object -> Parser Username) -> Parser Username
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Object -> Key -> Parser Username
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"name"))
             Parser (Bool -> WikiPage) -> Parser Bool -> Parser WikiPage
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
d Object -> Key -> Parser Bool
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"may_revise"
  parseJSON Value
_ = Parser WikiPage
forall a. Monoid a => a
mempty