module Network.Loli.DSL where

import Control.Monad.Reader
import Control.Monad.State
import Data.ByteString.Lazy.UTF8 (fromString)
import Hack
import Hack.Contrib.Constants
import Hack.Contrib.Middleware.Config
import Hack.Contrib.Middleware.Static
import Hack.Contrib.Response
import MPS
import Network.Loli.Config
import Network.Loli.Engine
import Network.Loli.Utils
import Prelude hiding ((.), (>), (^))
import qualified Control.Monad.State as State

app :: Application -> AppUnit
app f = ask >>= (f > io) >>= State.put

text :: String -> AppUnit
text x = do
  update $ set_content_type _TextPlain
  update $ set_body (x.fromString)

html :: String -> AppUnit
html x = do
  update $ set_content_type _TextHtml
  update $ set_body (x.fromString)

views :: String -> Unit
views x = middleware $ config (set_namespace loli_views [("root", x)])

get, put, delete, post :: String -> AppUnit -> Unit
get    = route GET
put    = route PUT
delete = route DELETE
post   = route POST

middleware :: Middleware -> Unit
middleware x = add_middleware x .update

mime :: String -> String -> Unit
mime k v = add_mime k v .update

public :: Maybe String -> [String] -> Unit
public r xs = middleware $ static r xs

io :: (MonadIO m) => IO a -> m a
io = liftIO

context :: [(String, String)] -> AppUnit -> AppUnit
context = set_namespace loli_bindings > local

bind :: String -> String -> AppUnit -> AppUnit
bind k v = context [(k, v)]

captures, bindings :: AppUnitT [(String, String)]
captures = ask ^ namespace loli_captures
bindings = ask ^ namespace loli_bindings