module Reddit.Routes.Post where

import Reddit.Types.Options
import Reddit.Types.Comment (CommentID(..))
import Reddit.Types.Post (PostID(..))
import Reddit.Types.Subreddit (SubredditName(..))
import Reddit.Types.Thing

import Data.Text (Text)
import Network.API.Builder.Query
import Network.API.Builder.Routes

postsListing :: Options PostID -> Maybe SubredditName -> Text -> Route
postsListing :: Options PostID -> Maybe SubredditName -> Text -> Route
postsListing Options PostID
opts Maybe SubredditName
r Text
t =
  [Text] -> [URLParam] -> Method -> Route
Route (Maybe SubredditName -> [Text]
endpoint Maybe SubredditName
r)
        [ Text
"before" Text -> Maybe PostID -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. Options PostID -> Maybe PostID
forall a. Options a -> Maybe a
before Options PostID
opts
        , Text
"after" Text -> Maybe PostID -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. Options PostID -> Maybe PostID
forall a. Options a -> Maybe a
after Options PostID
opts
        , Text
"limit" Text -> Maybe Int -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. Options PostID -> Maybe Int
forall a. Options a -> Maybe Int
limit Options PostID
opts ]
        Method
"GET"
  where endpoint :: Maybe SubredditName -> [Text]
endpoint Maybe SubredditName
Nothing = [ Text
t ]
        endpoint (Just (R Text
name)) = [ Text
"r", Text
name, Text
t ]

aboutPosts :: [PostID] -> Route
aboutPosts :: [PostID] -> Route
aboutPosts [PostID]
ps =
  [Text] -> [URLParam] -> Method -> Route
Route [ Text
"api", Text
"info" ]
        [ Text
"id" Text -> [PostID] -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. [PostID]
ps ]
        Method
"GET"

savePost :: PostID -> Route
savePost :: PostID -> Route
savePost PostID
p = [Text] -> [URLParam] -> Method -> Route
Route [ Text
"api", Text
"save" ]
                   [ Text
"id" Text -> PostID -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. PostID
p ]
                   Method
"POST"

unsavePost :: PostID -> Route
unsavePost :: PostID -> Route
unsavePost PostID
p = [Text] -> [URLParam] -> Method -> Route
Route [ Text
"api", Text
"unsave" ]
                     [ Text
"id" Text -> PostID -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. PostID
p ]
                     Method
"POST"

submitLink :: SubredditName -> Text -> Text -> Route
submitLink :: SubredditName -> Text -> Text -> Route
submitLink (R Text
name) Text
title Text
url =
  [Text] -> [URLParam] -> Method -> Route
Route [ Text
"api", Text
"submit" ]
        [ Text
"extension" Text -> Text -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. (Text
"json" :: Text)
        , Text
"kind" Text -> Text -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. (Text
"link" :: Text)
        , Text
"save" Text -> Bool -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. Bool
True
        , Text
"resubmit" Text -> Bool -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. Bool
False
        , Text
"sendreplies" Text -> Bool -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. Bool
True
        , Text
"then" Text -> Text -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. (Text
"tb" :: Text)
        , Text
"title" Text -> Text -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. Text
title
        , Text
"url" Text -> Text -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. Text
url
        , Text
"sr" Text -> Text -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. Text
name]
        Method
"POST"

submitSelfPost :: SubredditName -> Text -> Text -> Route
submitSelfPost :: SubredditName -> Text -> Text -> Route
submitSelfPost (R Text
name) Text
title Text
text =
  [Text] -> [URLParam] -> Method -> Route
Route [ Text
"api", Text
"submit" ]
        [ Text
"extension" Text -> Text -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. (Text
"json" :: Text)
        , Text
"kind" Text -> Text -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. (Text
"self" :: Text)
        , Text
"save" Text -> Bool -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. Bool
True
        , Text
"resubmit" Text -> Bool -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. Bool
False
        , Text
"sendreplies" Text -> Bool -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. Bool
True
        , Text
"then" Text -> Text -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. (Text
"tb" :: Text)
        , Text
"title" Text -> Text -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. Text
title
        , Text
"text" Text -> Text -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. Text
text
        , Text
"sr" Text -> Text -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. Text
name]
        Method
"POST"

getComments :: PostID -> Maybe CommentID -> Route
getComments :: PostID -> Maybe CommentID -> Route
getComments (PostID Text
p) Maybe CommentID
c = [Text] -> [URLParam] -> Method -> Route
Route [ Text
"comments", Text
p ]
                                 [ Text
"comment" Text -> Maybe Text -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. (CommentID -> Text) -> Maybe CommentID -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap CommentID -> Text
f Maybe CommentID
c ]
                                 Method
"GET"
  where f :: CommentID -> Text
f (CommentID Text
x) = Text
x

sendReplies :: Bool -> PostID -> Route
sendReplies :: Bool -> PostID -> Route
sendReplies Bool
setting PostID
p = [Text] -> [URLParam] -> Method -> Route
Route [ Text
"api", Text
"sendreplies" ]
                              [ Text
"id" Text -> PostID -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. PostID
p
                              , Text
"state" Text -> Bool -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. Bool
setting ]
                              Method
"POST"

removePost :: (ToQuery a, Thing a) => Bool -> a -> Route
removePost :: Bool -> a -> Route
removePost Bool
isSpam a
p = [Text] -> [URLParam] -> Method -> Route
Route [ Text
"api", Text
"remove" ]
                            [ Text
"id" Text -> a -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. a
p
                            , Text
"spam" Text -> Bool -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. Bool
isSpam ]
                            Method
"POST"

stickyPost :: Bool -> PostID -> Maybe Integer -> Route
stickyPost :: Bool -> PostID -> Maybe Integer -> Route
stickyPost Bool
on PostID
p Maybe Integer
n =
  [Text] -> [URLParam] -> Method -> Route
Route [ Text
"api", Text
"set_subreddit_sticky" ]
        [ Text
"id" Text -> PostID -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. PostID
p
        , Text
"state" Text -> Bool -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. Bool
on
        , Text
"num" Text -> Maybe Integer -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. Maybe Integer
n ]
        Method
"POST"

setContestMode :: Bool -> PostID -> Route
setContestMode :: Bool -> PostID -> Route
setContestMode Bool
on PostID
p = [Text] -> [URLParam] -> Method -> Route
Route [ Text
"api", Text
"set_contest_mode" ]
                            [ Text
"id" Text -> PostID -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. PostID
p
                            , Text
"state" Text -> Bool -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. Bool
on ]
                            Method
"POST"

postFlair :: SubredditName -> PostID -> Text -> Text -> Route
postFlair :: SubredditName -> PostID -> Text -> Text -> Route
postFlair (R Text
sub) PostID
p Text
text Text
css =
  [Text] -> [URLParam] -> Method -> Route
Route [ Text
"r", Text
sub, Text
"api", Text
"flair" ]
        [ Text
"link" Text -> Text -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. PostID -> Text
forall a. Thing a => a -> Text
fullName PostID
p
        , Text
"text" Text -> Text -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. Text
text
        , Text
"css_class" Text -> Text -> URLParam
forall a. ToQuery a => Text -> a -> URLParam
=. Text
css ]
        Method
"POST"