module Stagen.JsonFeed where

import qualified Data.ByteString.Lazy as BL
import Data.Aeson (Value(String))
import Data.Text (Text)
import Data.Text.Conversions (fromText, toText)
import Network.URI
import JsonFeed
import Data.Maybe

import Stagen.Page
import Stagen.Date

createJsonFeed :: String -> String -> [Page] -> BL.ByteString
createJsonFeed title baseUrl pages = let
  feed = mkFeed (toText title) (toText baseUrl)
  feed' = feed { feedItems = catMaybes $ map toItem pages }
  in renderFeed feed'

mkFeed :: Text -> Text -> Feed
mkFeed title baseUrl = Feed
  { feedAuthor = Nothing
  , feedDescription = Nothing
  , feedExpired = Nothing
  , feedFavicon = Nothing
  , feedFeedUrl = fmap (\uri -> Url $ uri { uriPath = (uriPath uri) ++ "/feed.json" }) baseUri
  , feedHomePageUrl = fmap Url baseUri
  , feedHubs = Nothing
  , feedIcon = Nothing
  , feedItems = []
  , feedNextUrl = Nothing
  , feedTitle = title
  , feedUserComment = Nothing
  , feedVersion = Url $ URI "https:" (Just $ URIAuth "" "jsonfeed.org" "") "/version/1" "" ""
  }
  where
    baseUri = parseURI (fromText baseUrl)

toItem :: Page -> Maybe Item
toItem page = case pageDate page of
  Nothing -> Nothing
  Just date -> Just Item
    { itemAttachments = Nothing
    , itemAuthor = Nothing
    , itemBannerImage = Nothing
    , itemContentHtml = Nothing
    , itemContentText = Nothing
    , itemDateModified = Nothing
    , itemDatePublished = Just $ dateToUTCTime date
    , itemExternalUrl = Nothing
    , itemId = String (toText (pageAbsoluteUrl page))
    , itemImage = Nothing
    , itemSummary = Nothing
    , itemTags = Nothing
    , itemTitle = Just (toText (pageTitle page))
    , itemUrl = fmap Url $ parseURI (fromText $ toText (pageAbsoluteUrl page))
    }