{-# 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.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")]

clayWith :: Monad m => (Response -> Response) -> Config -> [App] -> Css -> FileExtListenerT Response m ()
clayWith f c as = clayStatusHeadersWith f 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")]

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

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

clayHeadersWith :: Monad m => (Response -> Response) -> Config -> [App] -> RequestHeaders -> Css -> FileExtListenerT Response m ()
clayHeadersWith f c as = clayStatusHeadersWith f c as status200

clayStatusHeaders :: Monad m => Config -> [App] -> Status -> RequestHeaders -> Css -> FileExtListenerT Response m ()
clayStatusHeaders = clayStatusHeadersWith id

clayStatusHeadersWith :: Monad m => (Response -> Response) -> Config -> [App] -> Status -> RequestHeaders -> Css -> FileExtListenerT Response m ()
clayStatusHeadersWith f c as s hs i =
  let r = clayOnlyStatusHeaders c as s hs i in
  FileExtListenerT $ tell $
    FileExts $ singleton Css $ f 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