{-# LANGUAGE OverloadedStrings #-}


module Web.Routes.Nested.FileExtListener.Lucid where

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

import           Data.Map
import qualified Lucid.Base                              as L
import           Network.HTTP.Types                      (RequestHeaders,
                                                          Status, status200)
import           Network.Wai

import           Control.Monad.Writer


-- | Uses the @Html@ key in the map, and @"text/html"@ as the content type.
lucid :: Monad m =>
         L.HtmlT m () -> FileExtListenerT Response m ()
lucid = lucidStatusHeaders status200 [("Content-Type", "text/html")]

lucidStatus :: Monad m =>
         Status -> L.HtmlT m () -> FileExtListenerT Response m ()
lucidStatus s = lucidStatusHeaders s [("Content-Type", "text/html")]

lucidHeaders :: Monad m =>
         RequestHeaders -> L.HtmlT m () -> FileExtListenerT Response m ()
lucidHeaders = lucidStatusHeaders status200

lucidStatusHeaders :: Monad m =>
         Status -> RequestHeaders -> L.HtmlT m () -> FileExtListenerT Response m ()
lucidStatusHeaders s hs i = do
  r <- lift $ lucidOnlyStatusHeaders s hs i
  FileExtListenerT $ tell $
    FileExts $ singleton Html r




lucidOnly :: Monad m =>
             L.HtmlT m () -> m Response
lucidOnly = lucidOnlyStatusHeaders status200 [("Content-Type", "text/html")]

lucidOnlyStatus :: Monad m =>
             Status -> L.HtmlT m () -> m Response
lucidOnlyStatus s = lucidOnlyStatusHeaders s [("Content-Type", "text/html")]

lucidOnlyHeaders :: Monad m =>
             RequestHeaders -> L.HtmlT m () -> m Response
lucidOnlyHeaders = lucidOnlyStatusHeaders status200

lucidOnlyStatusHeaders :: Monad m =>
             Status -> RequestHeaders -> L.HtmlT m () -> m Response
lucidOnlyStatusHeaders s hs i = liftM (bytestringOnlyStatus s hs) $ L.renderBST i