{-# LANGUAGE OverloadedStrings #-}

module Network.Wai.Middleware.ContentType.Blaze where

import           Network.Wai.Middleware.ContentType.Types
import           Network.Wai.Middleware.ContentType.Builder

import           Network.HTTP.Types                      (RequestHeaders,
                                                          Status, status200)
import           Network.Wai.Trans
import qualified Text.Blaze.Html                         as H
import qualified Text.Blaze.Html.Renderer.Utf8           as H
import           Control.Monad.IO.Class                  (MonadIO)


-- * Lifted Combinators

-- | Uses @Html@ as the key in the map, and @"text/html"@ as the content type.
blaze :: MonadIO m =>
         H.Html -> FileExtListenerT (MiddlewareT m) m ()
blaze = blazeStatusHeaders status200 [("Content-Type", "text/html")]

{-# INLINEABLE blaze #-}

blazeWith :: MonadIO m =>
             (Response -> Response) -> H.Html
          -> FileExtListenerT (MiddlewareT m) m ()
blazeWith f = blazeStatusHeadersWith f status200 [("Content-Type", "text/html")]

{-# INLINEABLE blazeWith #-}

blazeStatus :: MonadIO m =>
               Status -> H.Html
            -> FileExtListenerT (MiddlewareT m) m ()
blazeStatus s = blazeStatusHeaders s [("Content-Type", "text/html")]

{-# INLINEABLE blazeStatus #-}

blazeStatusWith :: MonadIO m =>
                   (Response -> Response) -> Status -> H.Html
                -> FileExtListenerT (MiddlewareT m) m ()
blazeStatusWith f s = blazeStatusHeadersWith f s [("Content-Type", "text/html")]

{-# INLINEABLE blazeStatusWith #-}

blazeHeaders :: MonadIO m =>
                RequestHeaders -> H.Html
             -> FileExtListenerT (MiddlewareT m) m ()
blazeHeaders = blazeStatusHeaders status200

{-# INLINEABLE blazeHeaders #-}

blazeHeadersWith :: MonadIO m =>
                    (Response -> Response) -> RequestHeaders -> H.Html
                 -> FileExtListenerT (MiddlewareT m) m ()
blazeHeadersWith f = blazeStatusHeadersWith f status200

{-# INLINEABLE blazeHeadersWith #-}

blazeStatusHeaders :: MonadIO m =>
                      Status -> RequestHeaders -> H.Html
                   -> FileExtListenerT (MiddlewareT m) m ()
blazeStatusHeaders = blazeStatusHeadersWith id

{-# INLINEABLE blazeStatusHeaders #-}

blazeStatusHeadersWith :: MonadIO m =>
                          (Response -> Response) -> Status -> RequestHeaders -> H.Html
                       -> FileExtListenerT (MiddlewareT m) m ()
blazeStatusHeadersWith f s hs =
  builderStatusWith f Html s hs . H.renderHtmlBuilder

{-# INLINEABLE blazeStatusHeadersWith #-}

-- * 'Network.Wai.Response' Only

blazeOnly :: H.Html -> Response
blazeOnly = blazeOnlyStatusHeaders status200 [("Content-Type", "text/html")]

{-# INLINEABLE blazeOnly #-}

blazeOnlyHeaders :: RequestHeaders -> H.Html -> Response
blazeOnlyHeaders = blazeOnlyStatusHeaders status200

{-# INLINEABLE blazeOnlyHeaders #-}

blazeOnlyStatus :: Status -> H.Html -> Response
blazeOnlyStatus s = blazeOnlyStatusHeaders s [("Content-Type", "text/html")]

{-# INLINEABLE blazeOnlyStatus #-}

blazeOnlyStatusHeaders :: Status -> RequestHeaders -> H.Html -> Response
blazeOnlyStatusHeaders s hs =
  builderOnlyStatus s hs . H.renderHtmlBuilder

{-# INLINEABLE blazeOnlyStatusHeaders #-}