{-# LANGUAGE OverloadedStrings #-}



module Web.Routes.Nested.FileExtListener.Lucius where

import           Web.Routes.Nested.FileExtListener.Types as FE
import           Web.Routes.Nested.FileExtListener.ByteString

import           Data.Map
import           Text.Lucius
import qualified Data.Text.Lazy                          as LT
import qualified Data.Text.Lazy.Encoding                 as LT
import           Network.HTTP.Types                      (RequestHeaders,
                                                          Status, status200)
import           Network.Wai

import           Control.Monad.Writer


-- | Uses @lucius@ as the key in the map, and @"lucius/css"@ as the content type.
lucius :: Monad m => Css -> FileExtListenerT Response m ()
lucius = luciusStatusHeaders status200 [("Content-Type", "lucius/css")]

luciusStatus :: Monad m => Status -> Css -> FileExtListenerT Response m ()
luciusStatus s = luciusStatusHeaders s [("Content-Type", "lucius/css")]

luciusHeaders :: Monad m => RequestHeaders -> Css -> FileExtListenerT Response m ()
luciusHeaders = luciusStatusHeaders status200

luciusStatusHeaders :: Monad m => Status -> RequestHeaders -> Css -> FileExtListenerT Response m ()
luciusStatusHeaders s hs i =
  let r = luciusOnlyStatusHeaders s hs i in
  FileExtListenerT $ tell $
    FileExts $ singleton FE.Css r




luciusOnly :: Css -> Response
luciusOnly = luciusOnlyStatusHeaders status200 [("Content-Type", "lucius/css")]

luciusOnlyStatus :: Status -> Css -> Response
luciusOnlyStatus s = luciusOnlyStatusHeaders s [("Content-Type", "lucius/css")]

luciusOnlyHeaders :: RequestHeaders -> Css -> Response
luciusOnlyHeaders = luciusOnlyStatusHeaders status200

luciusOnlyStatusHeaders :: Status -> RequestHeaders -> Css -> Response
luciusOnlyStatusHeaders s hs i = bytestringOnlyStatus s hs $ LT.encodeUtf8 $ renderCss i