{-# LANGUAGE OverloadedStrings #-}

module Network.Wai.Middleware.ContentType.Cassius where

import           Network.Wai.Middleware.ContentType.Types as FE
import           Network.Wai.Middleware.ContentType.ByteString
import           Network.HTTP.Types                      (RequestHeaders, Status, status200)
import           Network.Wai.Trans

import           Text.Cassius
import qualified Data.Text.Lazy.Encoding                 as LT
import           Control.Monad.IO.Class                  (MonadIO)



-- | Uses @cassius@ as the key in the map, and @"cassius/plain"@ as the content type.
cassius :: MonadIO m => Css -> FileExtListenerT (MiddlewareT m) m ()
cassius = cassiusStatusHeaders status200 [("Content-Type", "cassius/css")]

cassiusWith :: MonadIO m =>
               (Response -> Response) -> Css
            -> FileExtListenerT (MiddlewareT m) m ()
cassiusWith f = cassiusStatusHeadersWith f status200 [("Content-Type", "cassius/css")]

cassiusStatus :: MonadIO m =>
                 Status -> Css
              -> FileExtListenerT (MiddlewareT m) m ()
cassiusStatus s = cassiusStatusHeaders s [("Content-Type", "cassius/css")]

cassiusStatusWith :: MonadIO m =>
                     (Response -> Response) -> Status -> Css
                  -> FileExtListenerT (MiddlewareT m) m ()
cassiusStatusWith f s = cassiusStatusHeadersWith f s [("Content-Type", "cassius/css")]

cassiusHeaders :: MonadIO m =>
                  RequestHeaders -> Css
               -> FileExtListenerT (MiddlewareT m) m ()
cassiusHeaders = cassiusStatusHeaders status200

cassiusHeadersWith :: MonadIO m =>
                      (Response -> Response) -> RequestHeaders -> Css
                   -> FileExtListenerT (MiddlewareT m) m ()
cassiusHeadersWith f = cassiusStatusHeadersWith f status200

cassiusStatusHeaders :: MonadIO m =>
                        Status -> RequestHeaders -> Css
                     -> FileExtListenerT (MiddlewareT m) m ()
cassiusStatusHeaders = cassiusStatusHeadersWith id

cassiusStatusHeadersWith :: MonadIO m =>
                            (Response -> Response) -> Status -> RequestHeaders -> Css
                         -> FileExtListenerT (MiddlewareT m) m ()
cassiusStatusHeadersWith f s hs i =
  bytestringStatusWith f Css s hs $ LT.encodeUtf8 $ renderCss i




cassiusOnly :: Css -> Response
cassiusOnly = cassiusOnlyStatusHeaders status200 [("Content-Type", "cassius/css")]

cassiusOnlyStatus :: Status -> Css -> Response
cassiusOnlyStatus s = cassiusOnlyStatusHeaders s [("Content-Type", "cassius/css")]

cassiusOnlyHeaders :: RequestHeaders -> Css -> Response
cassiusOnlyHeaders = cassiusOnlyStatusHeaders status200

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