module Hack.Contrib.Middleware.SimpleAccessLogger (simple_access_logger) where

import Data.Maybe
import Hack
import Hack.Contrib.Request hiding (referer)
import Hack.Contrib.Constants
import Hack.Contrib.Utils
import MPS (simple_time_format)
import MPS.Env
import Data.Maybe
import Prelude ()
import qualified Data.ByteString.Char8 as B
import System.IO


simple_access_logger :: Maybe (String -> IO ()) -> Middleware
simple_access_logger stream app = \env -> do
  r <- app env
  time <- now ^ format_time simple_time_format 
  let puts' x     = x.B.pack.B.putStrLn >> hFlush stdout
      puts        = stream.fromMaybe puts'
      method      = env.request_method.show
      http_status = env.hack_url_scheme.show 
      access_path = env.fullpath.unescape_uri
      
      fields =
        [ env.remote_host
        , "-"
        , "[" ++ time ++ "]"
        , "\"" ++ method ++ " " ++ access_path ++ " " ++ http_status ++ "\""
        , r.status.show
        , r.headers.get _ContentLength .fromMaybe "-"
        ]
  
  puts - fields.join " "
  return r