{-# LANGUAGE OverloadedStrings #-}
module Web.HackerNews
       ( -- * API Calls
         getStory
       , getComment
       , getPoll
       , getPollOpt
       , getUser
       , getTopStories
       , getMaxItem
       , getUpdates
       -- * Types
       , Comment   (..)
       , CommentId (..)
       , Poll      (..)
       , PollId    (..)
       , PollOpt   (..)
       , PollOptId (..)
       , Story     (..)
       , StoryId   (..)
       , User      (..)
       , UserId    (..)
       , Update    (..)
       , MaxItem
       , TopStories
       ) where

import           Data.Monoid                ((<>))

import           Web.HackerNews.Types
import           Web.HackerNews.Util        (toText)
import           Web.HackerNews.Client      (getItem)

------------------------------------------------------------------------------
-- | Retrieve a `Story` by `StoryId`
getStory :: StoryId -> IO (Maybe Story)
getStory (StoryId storyid) = getItem $ "item/" <> toText storyid

------------------------------------------------------------------------------
-- | Retrieve a `Comment` by `CommentId`
getComment :: CommentId -> IO (Maybe Comment)
getComment (CommentId commentid) = getItem $ "item/" <> toText commentid

------------------------------------------------------------------------------
-- | Retrieve a `Poll` by `PollId`
getPoll :: PollId -> IO (Maybe Poll)
getPoll (PollId pollid) = getItem $ "item/" <> toText pollid

------------------------------------------------------------------------------
-- | Retrieve a `PollOpt` by `PollOptId`
getPollOpt :: PollOptId -> IO (Maybe PollOpt)
getPollOpt (PollOptId polloptid) = getItem $ "item/" <> toText polloptid

------------------------------------------------------------------------------
-- | Retrieve a `User` by `UserId`
getUser :: UserId -> IO (Maybe User)
getUser (UserId userid) = getItem $ "user/" <> userid

------------------------------------------------------------------------------
-- | Retrieve the Top Stories on Hacker News
getTopStories :: IO (Maybe TopStories)
getTopStories = getItem "topstories"

------------------------------------------------------------------------------
-- | Retrieve the largest ItemId
getMaxItem :: IO (Maybe MaxItem)
getMaxItem = getItem "maxitem"

------------------------------------------------------------------------------
-- | Retrieve the largest ItemId
getUpdates :: IO (Maybe Update)
getUpdates = getItem "updates"