{-# LANGUAGE OverloadedStrings #-}

module Network.Wai.Middleware.ContentType.Pandoc where

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

import qualified Data.Text.Lazy                           as LT
import qualified Data.Text.Lazy.Encoding                  as LT
import qualified Text.Pandoc                              as P
import           Control.Monad.Trans



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

lucidWith :: MonadIO m =>
             (Response -> Response) -> P.Pandoc
          -> FileExtListenerT (MiddlewareT m) m ()
lucidWith f = lucidStatusHeadersWith f status200 [("Content-Type", "text/markdown")]

lucidStatus :: MonadIO m =>
               Status -> P.Pandoc
            -> FileExtListenerT (MiddlewareT m) m ()
lucidStatus s = lucidStatusHeaders s [("Content-Type", "text/markdown")]

lucidStatusWith :: MonadIO m =>
                   (Response -> Response) -> Status -> P.Pandoc
                -> FileExtListenerT (MiddlewareT m) m ()
lucidStatusWith f s = lucidStatusHeadersWith f s [("Content-Type", "text/markdown")]

lucidHeaders :: MonadIO m =>
                RequestHeaders -> P.Pandoc
             -> FileExtListenerT (MiddlewareT m) m ()
lucidHeaders = lucidStatusHeaders status200

lucidHeadersWith :: MonadIO m =>
                    (Response -> Response) -> RequestHeaders -> P.Pandoc
                 -> FileExtListenerT (MiddlewareT m) m ()
lucidHeadersWith f = lucidStatusHeadersWith f status200

lucidStatusHeaders :: MonadIO m =>
                      Status -> RequestHeaders -> P.Pandoc
                   -> FileExtListenerT (MiddlewareT m) m ()
lucidStatusHeaders = lucidStatusHeadersWith id

lucidStatusHeadersWith :: MonadIO m =>
                          (Response -> Response) -> Status -> RequestHeaders -> P.Pandoc
                       -> FileExtListenerT (MiddlewareT m) m ()
lucidStatusHeadersWith f s hs i = do
  bytestringStatusWith f Html s hs . LT.encodeUtf8 . LT.pack $ P.writeMarkdown P.def i




lucidOnly :: P.Pandoc -> Response
lucidOnly = lucidOnlyStatusHeaders status200 [("Content-Type", "text/markdown")]

lucidOnlyStatus :: Status -> P.Pandoc -> Response
lucidOnlyStatus s = lucidOnlyStatusHeaders s [("Content-Type", "text/markdown")]

lucidOnlyHeaders :: RequestHeaders -> P.Pandoc -> Response
lucidOnlyHeaders = lucidOnlyStatusHeaders status200

lucidOnlyStatusHeaders :: Status -> RequestHeaders -> P.Pandoc -> Response
lucidOnlyStatusHeaders s hs i = bytestringOnlyStatus s hs . LT.encodeUtf8 . LT.pack $ P.writeMarkdown P.def i