{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}


module Snap.Snaplet.Log
  ( initLogger ) where

import           Control.Monad             (liftM)
import           Control.Monad.IO.Class    (liftIO)
import           Data.Configurator
import           Paths_snaplet_hslogger
import           Snap.Snaplet
import           System.Log
import           System.Log.Formatter
import           System.Log.Handler        (setFormatter)
import           System.Log.Handler.Simple
import           System.Log.Logger

-- | Initialize the Logger Snaplet.
--
-- No custom `v` type here (just Unit) because the logger state is
-- globally maintained anyway and this snaplet is just providing an
-- easy default configuration for HSLogger.
initLogger :: SnapletInit b ()
initLogger = makeSnaplet "hslogger" description datadir $ do
    conf <- getSnapletUserConfig

    logname   <- liftIO $ require conf "default_logger"
    loglevel  <- liftIO $ require conf "log_level"
    logformat <- liftIO $ require conf "log_format"
    logfile   <- liftIO $ require conf "log_file"

    let lvl = (read loglevel) :: Priority

    h <- liftIO $ fileHandler logfile lvl >>= \lh -> return $
        setFormatter lh (simpleLogFormatter logformat)

    liftIO $ updateGlobalLogger logname (addHandler h)
    liftIO $ updateGlobalLogger logname (setLevel lvl)

    liftIO $ noticeM logname $ "Configured the logger with a level of: " ++ (show loglevel)

  where
    description = "Snaplet for HSLogger library"
    datadir = Just $ liftM (++"/resources/hslogger") getDataDir