{-# LANGUAGE OverloadedStrings #-}



module Web.Routes.Nested.FileExtListener.Clay where

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

import           Data.Map
import           Clay.Render
import           Clay.Stylesheet
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 @Text@ as the key in the map, and @"text/css"@ as the content type.
clay :: Monad m => Config -> [App] -> Css -> FileExtListenerT Response m ()
clay c as = clayStatusHeaders c as status200 [("Content-Type", "text/css")]

clayStatus :: Monad m =>Config -> [App] ->  Status -> Css -> FileExtListenerT Response m ()
clayStatus c as s = clayStatusHeaders c as s [("Content-Type", "text/css")]

clayHeaders :: Monad m => Config -> [App] -> RequestHeaders -> Css -> FileExtListenerT Response m ()
clayHeaders c as = clayStatusHeaders c as status200

clayStatusHeaders :: Monad m => Config -> [App] -> Status -> RequestHeaders -> Css -> FileExtListenerT Response m ()
clayStatusHeaders c as s hs i =
  let r = clayOnlyStatusHeaders c as s hs i in
  FileExtListenerT $ tell $
    FileExts $ singleton Css r




clayOnly :: Config -> [App] -> Css -> Response
clayOnly c as = clayOnlyStatusHeaders c as status200 [("Content-Type", "text/css")]

clayOnlyStatus :: Config -> [App] -> Status -> Css -> Response
clayOnlyStatus c as s = clayOnlyStatusHeaders c as s [("Content-Type", "text/css")]

clayOnlyHeaders :: Config -> [App] -> RequestHeaders -> Css -> Response
clayOnlyHeaders c as = clayOnlyStatusHeaders c as status200

clayOnlyStatusHeaders :: Config -> [App] -> Status -> RequestHeaders -> Css -> Response
clayOnlyStatusHeaders c as s hs i = bytestringOnlyStatus s hs $ LT.encodeUtf8 $ renderWith c as i