{-# LANGUAGE GADTs #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ExtendedDefaultRules #-}
{-# LANGUAGE BangPatterns #-}

module Lucid.Scaffold where


import Lucid
import Lucid.Base

import qualified Data.Text as T

import Data.Monoid

data WebPage m = WebPage {           pageTitle :: T.Text -- ^ Page title
                         ,             favicon :: T.Text -- ^ Favicon url
                         ,            metaVars :: (HtmlT m ()) -- ^ @\<meta\>@ tags
                         ,         initScripts :: (HtmlT m ()) -- ^ JavaScript to include at the top of the page
                         , beforeStylesScripts :: (HtmlT m ()) -- ^ JavaScript to include before @\<style\>@ tags
                         ,              styles :: (HtmlT m ()) -- ^ Styles
                         ,  afterStylesScripts :: (HtmlT m ()) -- ^ JavaScript to include after @\<style\>@ tags - ie: <http://modernizr.com Modernizr>
                         ,         bodyScripts :: (HtmlT m ()) -- ^ JavaScript to include at the base of @\<body\>@
                         }


instance Monad m => Monoid (WebPage m) where
  mempty = WebPage "" "" mempty mempty mempty mempty mempty mempty
  mappend x _ = x -- Some people just want to watch the world burn.

template :: Monad m =>
            WebPage m -- ^ Page information
         -> HtmlT m () -- ^ Content to insert in @\<body\>@
         -> HtmlT m ()
template page content = doctypehtml_ $ mconcat $
  [ head_ [] $ mconcat $
      [ initScripts page
      , title_ $ toHtmlRaw $ pageTitle page
      , metaVars page
      , link_ [ rel_ "icon"
              , href_ $ favicon page
              ]
      , beforeStylesScripts page
      , styles page
      , afterStylesScripts page
      ]
  , body_ [] $ mconcat $
      [ content
      , bodyScripts page
      ]
  ]