{-# LANGUAGE FlexibleContexts #-}
module Network.Salvia.Handler.Log where

import Control.Applicative
import Control.Monad.State
import Data.List
import Data.Record.Label hiding (get)
import Data.Time.Clock
import Data.Time.Format
import Data.Time.LocalTime
import Network.Protocol.Http
import Network.Salvia.Interface
import System.IO
import System.Locale

{- |
A simple logger that prints a summery of the request information to
the specified file handle.
-}

hLog :: (AddressM' m , MonadIO m, HttpM' m) => Handle -> m ()
hLog h =
  do mt <- request  (getM method)
     ur <- request  (getM uri)
     st <- response (getM status)
     ca <- clientAddress
     sa <- serverAddress
     dt <- liftIO $
       do zone <- getCurrentTimeZone
          time <- utcToLocalTime zone <$> getCurrentTime
          return $ formatTime defaultTimeLocale "%a, %d %b %Y %H:%M:%S %z" time
     let code = codeFromStatus st
     liftIO
       . hPutStrLn h
       $ intercalate " ; "
         [ dt
         , show sa
         , show mt
         , show ca
         , ur
         , show code ++ " " ++ show st
         ]

-- | Dump the request headers to the standard output, useful for debugging.

hDumpRequest :: (HttpM Request m, MonadIO m) => m ()
hDumpRequest = request get >>= liftIO . print

-- | Dump the response headers to the standard output, useful for debugging.

hDumpResponse :: (HttpM Response m, MonadIO m) => m ()
hDumpResponse = response get >>= liftIO . print