--------------------------------------------------------------------------------
{-# LANGUAGE OverloadedStrings #-}
import       Data.Monoid (mappend)
import       Hakyll

type RenderingFunction = FeedConfiguration
  -> Context String
  -> [Item String]
  -> Compiler (Item String)

myFeedConfiguration :: FeedConfiguration
myFeedConfiguration = FeedConfiguration
  { feedTitle     = "Haskell without remorse"
  , feedDescription = "Blog about Haskell development"
  , feedAuthorName  = "Anton Gushcha"
  , feedAuthorEmail = "ncrashed@gmail.com"
  , feedRoot    = "http://ncrashed.github.io/blog"
  }

createFeed :: Identifier -> RenderingFunction -> Rules ()
createFeed name renderingFunction = create [name] $ do
  route idRoute
  compile $ do
    let feedCtx = postCtx `mappend` bodyField "description"
    posts <- fmap (take 10) . recentFirst =<<
      loadAllSnapshots "posts/*" "content"
    renderingFunction myFeedConfiguration feedCtx posts

--------------------------------------------------------------------------------
main :: IO ()
main = hakyll $ do
  match "images/*" $ do
    route   idRoute
    compile copyFileCompiler

  match "fonts/*" $ do
    route   idRoute
    compile copyFileCompiler

  match "css/*" $ do
    route   idRoute
    compile compressCssCompiler

  match (fromList ["about.markdown", "contact.markdown"]) $ do
    route   $ setExtension "html"
    compile $ pandocCompiler
      >>= loadAndApplyTemplate "templates/default.html" defaultContext
      >>= relativizeUrls

  match "posts/*" $ do
    route $ setExtension "html"
    compile $ pandocCompiler
      >>= loadAndApplyTemplate "templates/post.html"  postCtx
      >>= saveSnapshot "content"
      >>= loadAndApplyTemplate "templates/default.html" postCtx
      >>= relativizeUrls

--  create ["archive.html"] $ do
--    route idRoute
--    compile $ do
--      posts <- recentFirst =<< loadAll "posts/*"
--      let archiveCtx =
--          listField "posts" postCtx (return posts) `mappend`
--          constField "title" "Archives"      `mappend`
--          defaultContext
--
--      makeItem ""
--        >>= loadAndApplyTemplate "templates/archive.html" archiveCtx
--        >>= loadAndApplyTemplate "templates/default.html" archiveCtx
--        >>= relativizeUrls


  match "index.html" $ do
    route idRoute
    compile $ do
      posts <- recentFirst =<< loadAll "posts/*"
      let indexCtx =
            listField "posts" postCtx (return posts) `mappend`
            constField "title" "Home"        `mappend`
            defaultContext

      getResourceBody
        >>= applyAsTemplate indexCtx
        >>= loadAndApplyTemplate "templates/default.html" indexCtx
        >>= relativizeUrls

  match "templates/*" $ compile templateBodyCompiler
  
  createFeed "feed.xml" renderRss
  createFeed "atom.xml" renderAtom

--------------------------------------------------------------------------------
postCtx :: Context String
postCtx =
  dateField "date" "%B %e, %Y" `mappend`
  defaultContext
