module Haskell.Debug.Adapter.Logger where

import Haskell.Debug.Adapter.Constant

import System.IO
import qualified System.Log.Logger as L
import qualified System.Log.Formatter as L
import qualified System.Log.Handler as LH
import qualified System.Log.Handler.Simple as LHS


-- |
--  setup logger
-- 
setUpLogger :: FilePath -> L.Priority -> IO ()
setUpLogger path lv = do

  L.removeAllHandlers

  logStream <- openFile path AppendMode
  hSetEncoding logStream utf8
  hSetBuffering logStream NoBuffering

  logH <- LHS.streamHandler logStream lv

  let logHandle  = logH {LHS.closeFunc = hClose}
      logFormat  = L.tfLogFormatter _LOG_FORMAT_DATE _LOG_FORMAT
      logHandler = LH.setFormatter logHandle logFormat

  L.updateGlobalLogger L.rootLoggerName $ L.setHandlers ([] :: [LHS.GenericHandler Handle])

  L.updateGlobalLogger _LOG_NAME $ L.setHandlers [logHandler]
  L.updateGlobalLogger _LOG_NAME $ L.setLevel lv

  L.updateGlobalLogger _LOG_REQUEST $ L.setHandlers [logHandler]
  L.updateGlobalLogger _LOG_REQUEST $ L.setLevel lv

  L.updateGlobalLogger _LOG_RESPONSE $ L.setHandlers [logHandler]
  L.updateGlobalLogger _LOG_RESPONSE $ L.setLevel lv

  L.updateGlobalLogger _LOG_APP $ L.setHandlers [logHandler]
  L.updateGlobalLogger _LOG_APP $ L.setLevel lv

  L.updateGlobalLogger _LOG_THREAD_MGR $ L.setHandlers [logHandler]
  L.updateGlobalLogger _LOG_THREAD_MGR $ L.setLevel lv

  L.updateGlobalLogger _LOG_EVENT $ L.setHandlers [logHandler]
  L.updateGlobalLogger _LOG_EVENT $ L.setLevel lv

  L.updateGlobalLogger _LOG_GHCI_STDOUT $ L.setHandlers [logHandler]
  L.updateGlobalLogger _LOG_GHCI_STDOUT $ L.setLevel lv

  L.updateGlobalLogger _LOG_WATCH $ L.setHandlers [logHandler]
  L.updateGlobalLogger _LOG_WATCH $ L.setLevel lv