{-# LANGUAGE DeriveGeneric         #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE RecordWildCards       #-}

module Logging.Handler.FileHandler
  ( FileHandler(..)
  ) where

import           Data.IORef
import           GHC.Generics
import           System.IO
import           Text.Format

import           Logging.Class
import           Logging.Filter
import           Logging.Level
import           Logging.Prelude


-- | A handler type which writes logging records, appropriately formatted,
-- to a file.
data FileHandler = FileHandler { level     :: Level
                               , filterer  :: Filterer
                               , formatter :: Format1
                               , file      :: FilePath
                               , encoding  :: TextEncoding
                               , stream    :: IORef Handle
                               -- ^ Don't open file manually, initialized as
                               -- __'IORef' undefined__ and use 'open' or
                               -- "Logger.Manager.initialize"
                               } deriving (Generic, Eq)

instance Handler FileHandler where
  open FileHandler{..} = atomicWriteIORef stream =<< openLogFile file encoding

  emit self@FileHandler{..} rcd = do
    stream' <- readIORef stream
    flip hPutStrLn (format1 formatter rcd) stream'
    hFlush stream'

  close FileHandler{..} = hClose =<< readIORef stream